@nikovirtala/projen-constructs 0.3.78 → 0.3.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -4196,7 +4196,7 @@
4196
4196
  },
4197
4197
  "name": "@nikovirtala/projen-constructs",
4198
4198
  "readme": {
4199
- "markdown": "# @nikovirtala/projen-constructs\n\nProjen project types with standard configuration for consistent project setup across all repositories.\n\n## Installation\n\n```bash\npnpm add -D @nikovirtala/projen-constructs projen constructs\n```\n\nRequires pnpm 11 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer\ndependencies as well.\n\nTo create a project from scratch:\n\n```bash\npnpm dlx projen new --from @nikovirtala/projen-constructs aws_cdk_construct_library\n```\n\n## Features\n\n- **Standard Configuration**: Opinionated defaults for author, release branch, package manager, Node.js, TypeScript, and tooling\n- **Automatic Project Type Discovery**: Generates the `ProjectType` enum from Projen's JSII manifest (19 project types)\n- **Component System**: Reusable components (Vitest, TypeDoc, Mise, Homebrew, Colima, LocalStack, Lambda bundling)\n- **Code Generation**: `ProjectGenerator` creates project classes with standard configuration\n- **ES Modules**: TypeScript and CDK App projects use ES modules (JSII uses CommonJS)\n- **Code Quality**: Biome for formatting and linting\n- **Testing**: Vitest with coverage\n- **Auto-merge**: Enabled with auto-approve\n- **VSCode**: Recommended extensions and settings\n- **mise**: Node version management\n\n## Standard Configuration\n\n- **Author**: Niko Virtala (niko.virtala@hey.com)\n- **Default Release Branch**: main\n- **Package Manager**: pnpm 11.20.0\n- **Node Version**: 24.19.0\n- **TypeScript**: 6.0.3\n- **CDK Version**: 2.263.0 (for CDK projects)\n- **JSII Version**: ~6.0.3 (for JSII projects)\n\nThe AWS CDK, Node.js and TypeScript versions live in `src/versions.json` and are refreshed by the\n`update-versions` task, which the dependency upgrade workflow runs.\n\n### pnpm\n\npnpm reads its settings from `pnpm-workspace.yaml`, not `.npmrc`, since pnpm 11. Generated projects\nget:\n\n| Setting | Value | Reason |\n| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |\n| `nodeLinker` | `hoisted` | jsii tooling resolves dependencies from a flat `node_modules` |\n| `allowBuilds` | `esbuild: true` | esbuild links its platform binary in a postinstall script, and pnpm 11 fails an install with ignored builds |\n| `verifyDepsBeforeRun` | `false` | projen resolves the task `PATH` with `$(pnpm -c exec ...)`, which otherwise re-enters `pnpm install` and deadlocks |\n| `minimumReleaseAge` | `0` | the pnpm 11 default of 1440 minutes makes pnpm write `minimumReleaseAgeExclude` entries into this generated file |\n\n### TypeScript configuration\n\nProjen renders three configs, and none of them should be edited directly:\n\n- `tsconfig.json` compiles `src` to `lib`. For JSII projects, jsii validates it against its `strict`\n rule set, so it only carries compiler options jsii accepts.\n- `test/tsconfig.json` extends it and is type-check only. This is the config Vitest type checking and\n the editor use, and the one `tsconfigDev` points at.\n- `projenrc/tsconfig.json` covers `.projenrc.ts`.\n\n## Customization\n\nOverride any option by passing it to the constructor:\n\n```typescript\nconst project = new JsiiProject({\n name: \"my-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-project.git\",\n minNodeVersion: \"24.0.0\",\n author: \"Custom Author\",\n authorAddress: \"custom@example.com\",\n mise: false,\n vitest: false,\n tsconfig: {\n compilerOptions: {\n noUnusedLocals: false,\n },\n },\n biomeOptions: {\n biomeConfig: {\n formatter: {\n lineWidth: 100,\n },\n },\n },\n});\n```\n\nEvery component is exposed as an enable flag (`mise`, `vitest`, ...) plus an options property\n(`miseOptions`, `vitestOptions`, ...).\n\n## Usage\n\n### Projects\n\n#### AWS CDK Construct Library Project\n\n```typescript\nimport { AwsCdkConstructLibraryProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkConstructLibraryProject({\n name: \"my-cdk-construct\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-construct.git\",\n});\n\nproject.synth();\n```\n\n#### AWS CDK TypeScript App Project\n\n```typescript\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkTypeScriptAppProject({\n name: \"my-cdk-app\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-app.git\",\n});\n\nproject.synth();\n```\n\n#### JSII Project\n\n```typescript\nimport { JsiiProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new JsiiProject({\n name: \"my-jsii-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-jsii-project.git\",\n});\n\nproject.synth();\n```\n\n#### TypeScript Project\n\n```typescript\nimport { TypeScriptProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new TypeScriptProject({\n name: \"my-typescript-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-typescript-project.git\",\n});\n\nproject.synth();\n```\n\n### Components\n\nThe package includes reusable components for common development tasks:\n\n#### Vitest\n\n[Vitest](https://vitest.dev) testing framework component.\n\n```typescript\nimport { Vitest } from \"@nikovirtala/projen-constructs\";\n\nnew Vitest(project, {\n vitestVersion: \"^4\",\n config: {\n coverageProvider: CoverageProvider.V8,\n coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],\n },\n});\n```\n\nType checking runs against the project's development tsconfig (`test/tsconfig.json`) unless\n`config.typecheckTsconfig` says otherwise.\n\n#### TypeDoc\n\n[TypeDoc](https://typedoc.org) documentation generation component.\n\n```typescript\nimport { TypeDoc, EntryPointStrategy } from \"@nikovirtala/projen-constructs\";\n\nnew TypeDoc(project, {\n version: \"^0.28\",\n typeDocConfig: {\n entryPointStrategy: EntryPointStrategy.EXPAND,\n out: \"docs/api\",\n exclude: [\"**/*.test.ts\"],\n },\n});\n```\n\n#### Mise\n\n[Mise](https://mise.jdx.dev) dev tools/runtimes management component.\n\n```typescript\nimport { Mise } from \"@nikovirtala/projen-constructs\";\n\nnew Mise(project, {\n nodeVersion: \"24.19.0\",\n});\n```\n\n#### Homebrew\n\n[Homebrew](https://brew.sh) package management component. Writes a `Brewfile` and adds an\n`install:homebrew` task that bootstraps Homebrew and runs `brew bundle`.\n\n```typescript\nimport { Homebrew } from \"@nikovirtala/projen-constructs\";\n\nconst homebrew = new Homebrew(project, {\n packages: [\"jq\", \"yq\"],\n});\n\nhomebrew.addPackage(\"gh\");\n```\n\n#### Colima\n\n[Colima](https://github.com/abiosoft/colima) container runtime component. Alternative for Docker.\n\n```typescript\nimport { Colima } from \"@nikovirtala/projen-constructs\";\n\nnew Colima(project);\n```\n\n#### LocalStack\n\n[LocalStack](https://www.localstack.cloud) AWS emulation component.\n\n```typescript\nimport { LocalStack } from \"@nikovirtala/projen-constructs\";\n\nnew LocalStack(project, {\n services: [\"s3\", \"lambda\", \"dynamodb\"],\n port: 4566,\n debug: true,\n});\n```\n\n#### LambdaFunctionConstructGenerator\n\nGenerates AWS CDK Lambda Function constructs and bundles their code.\n\n```typescript\nimport { LambdaFunctionConstructGenerator } from \"@nikovirtala/projen-constructs\";\n\nnew LambdaFunctionConstructGenerator(project, {\n sourceDir: \"src/handlers\",\n outputDir: \"src/constructs/lambda\",\n filePattern: \"*.lambda.ts\",\n esbuildOptions: {\n minify: true,\n sourcemap: true,\n },\n});\n```\n\n#### Bundler\n\nLow-level bundling utilities for Lambda functions.\n\n```typescript\nimport {\n Bundler,\n LambdaFunctionCodeBundle,\n} from \"@nikovirtala/projen-constructs\";\n\nconst bundler = new Bundler(project, {\n assetsDir: \"assets\",\n esbuildVersion: \"^0.25\",\n});\n\nnew LambdaFunctionCodeBundle(project, {\n entrypoint: \"src/my-function.lambda.ts\",\n extension: \".lambda.ts\",\n});\n```\n\n#### ProjectGenerator\n\nGenerates TypeScript project classes with standard configuration.\n\n```typescript\nimport { ProjectGenerator, ProjectType } from \"@nikovirtala/projen-constructs\";\n\nnew ProjectGenerator(project, {\n name: \"TypeScriptProject\",\n projectType: ProjectType.TYPE_SCRIPT_PROJECT,\n filePath: \"./src/projects/typescript.generated.ts\",\n components: [\n { componentClass: Mise },\n { componentClass: Vitest }, // Auto-detects VitestOptions from JSII manifest\n ],\n});\n```\n\nFeatures:\n\n- Automatically generates the `ProjectType` enum from Projen's JSII manifest\n- Auto-detects component options types from JSII manifests\n- Strips Projen's `@pjnew` annotation from `packageManager`, which `projen new` would otherwise\n render into a generated `.projenrc.ts` as the package manager that ran the command\n- Validates paths to prevent directory traversal attacks\n- Structured error handling with custom error classes\n\n## Development\n\nThis project is managed by Projen and generates itself: `.projenrc.ts` defines the project using the\n`JsiiProject` type from `src/`. Configuration changes belong in `.projenrc.ts`, never in the\ngenerated files.\n\n```bash\npnpm projen # synthesize project files\npnpm build # synthesize, compile, test and package\npnpm test # biome, vitest, typedoc\npnpm test:watch # vitest in watch mode\npnpm test:update # update snapshots\npnpm biome # format and lint\npnpm docgen # regenerate API.md from the .jsii manifest\npnpm update-versions # refresh src/versions.json\npnpm upgrade # upgrade dependencies\n```\n\n### Build process\n\n```mermaid\nflowchart TD\n projenrc[\".projenrc.ts\"]\n\n subgraph synthesize[\"default (synthesize)\"]\n direction TB\n synth[\"tsx .projenrc.ts\"]\n generator[\"ProjectGenerator\"]\n generated[\"src/project-type.ts<br/>src/projects/*.generated.ts<br/>src/projects/*-options.generated.ts\"]\n projenfiles[\"package.json, tsconfig.json,<br/>pnpm-workspace.yaml, workflows, ...\"]\n brew[\"install:homebrew<br/>brew bundle\"]\n definecfg[\"bundle-vitest-define-config<br/>esbuild → lib/vitest-define-config.js\"]\n\n synth --> generator --> generated\n synth --> projenfiles\n synth --> brew\n synth --> definecfg\n end\n\n subgraph compile[\"compile\"]\n direction TB\n jsii[\"jsii<br/>validates tsconfig.json against the strict rule set\"]\n lib[\"lib/**\"]\n manifest[\".jsii manifest\"]\n\n jsii --> lib\n jsii --> manifest\n end\n\n subgraph test[\"test\"]\n direction TB\n biome[\"biome check --write\"]\n vitest[\"vitest run<br/>+ type checking\"]\n typedoc[\"typedoc → docs/api\"]\n\n biome --> vitest --> typedoc\n end\n\n subgraph package[\"package\"]\n direction TB\n pacmak[\"jsii-pacmak<br/>--pack-command 'pnpm pack'\"]\n dist[\"dist/js/*.tgz\"]\n\n pacmak --> dist\n end\n\n projenrc --> synthesize\n synthesize --> compile\n compile --> test\n test --> package\n\n manifest -. \"component options FQNs<br/>read on the next synthesis\" .-> generator\n docgen[\"docgen<br/>jsii-docgen → API.md\"]\n manifest --> docgen\n\n classDef artifact fill:#eef,stroke:#88a\n class generated,projenfiles,lib,manifest,dist artifact\n```\n\nThe dashed edge is the part worth knowing about: `ProjectGenerator` reads the committed `.jsii`\nmanifest to resolve component options types, so the manifest produced by `compile` feeds the *next*\nsynthesis. This is why `.jsii` is committed rather than ignored. A component options type that is\nmissing from the manifest is reported as a warning and its options property is left out of the\ngenerated interface, which is expected only while a new component is being introduced: compile once,\nthen synthesize again.\n\n`package` runs `package:js` on CI and `package-all` locally; both end up in `jsii-pacmak`.\n`docgen` is not part of `build` and has to be run explicitly after the manifest changes.\n"
4199
+ "markdown": "# @nikovirtala/projen-constructs\n\nProjen project types with standard configuration for consistent project setup across all repositories.\n\n## Installation\n\n```bash\npnpm add -D @nikovirtala/projen-constructs projen constructs\n```\n\nRequires pnpm 11 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer\ndependencies as well.\n\nTo create a project from scratch:\n\n```bash\npnpm dlx projen new --from @nikovirtala/projen-constructs aws_cdk_construct_library\n```\n\n## Features\n\n- **Standard Configuration**: Opinionated defaults for author, release branch, package manager, Node.js, TypeScript, and tooling\n- **Automatic Project Type Discovery**: Generates the `ProjectType` enum from Projen's JSII manifest (19 project types)\n- **Component System**: Reusable components (Vitest, TypeDoc, Mise, Homebrew, Colima, LocalStack, Lambda bundling)\n- **Code Generation**: `ProjectGenerator` creates project classes with standard configuration\n- **ES Modules**: TypeScript and CDK App projects use ES modules (JSII uses CommonJS)\n- **Code Quality**: Biome for formatting and linting\n- **Testing**: Vitest with coverage\n- **Auto-merge**: Enabled with auto-approve\n- **VSCode**: Recommended extensions and settings\n- **mise**: Node version management\n\n## Standard Configuration\n\n- **Author**: Niko Virtala (niko.virtala@hey.com)\n- **Default Release Branch**: main\n- **Package Manager**: pnpm 11.20.0\n- **Node Version**: 24.19.0\n- **TypeScript**: 6.0.3\n- **CDK Version**: 2.263.0 (for CDK projects)\n- **JSII Version**: ~6.0.3 (for JSII projects)\n\nThe AWS CDK, Node.js and TypeScript versions live in `src/versions.json` and are refreshed by the\n`update-versions` task, which the dependency upgrade workflow runs.\n\n### pnpm\n\npnpm reads its settings from `pnpm-workspace.yaml`, not `.npmrc`, since pnpm 11. Generated projects\nget:\n\n| Setting | Value | Reason |\n| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |\n| `nodeLinker` | `hoisted` | jsii tooling resolves dependencies from a flat `node_modules` |\n| `allowBuilds` | `esbuild: true` | esbuild links its platform binary in a postinstall script, and pnpm 11 fails an install with ignored builds |\n| `verifyDepsBeforeRun` | `false` | projen resolves the task `PATH` with `$(pnpm -c exec ...)`, which otherwise re-enters `pnpm install` and deadlocks |\n| `minimumReleaseAge` | `0` | the pnpm 11 default of 1440 minutes makes pnpm write `minimumReleaseAgeExclude` entries into this generated file |\n\n### TypeScript configuration\n\nProjen renders three configs, and none of them should be edited directly:\n\n- `tsconfig.json` compiles `src` to `lib`. For JSII projects, jsii validates it against its `strict`\n rule set, so it only carries compiler options jsii accepts.\n- `test/tsconfig.json` extends it and is type-check only. This is the config Vitest type checking and\n the editor use, and the one `tsconfigDev` points at.\n- `projenrc/tsconfig.json` covers `.projenrc.ts`.\n\n## Customization\n\nOverride any option by passing it to the constructor:\n\n```typescript\nconst project = new JsiiProject({\n name: \"my-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-project.git\",\n minNodeVersion: \"24.0.0\",\n author: \"Custom Author\",\n authorAddress: \"custom@example.com\",\n mise: false,\n vitest: false,\n tsconfig: {\n compilerOptions: {\n noUnusedLocals: false,\n },\n },\n biomeOptions: {\n biomeConfig: {\n formatter: {\n lineWidth: 100,\n },\n },\n },\n});\n```\n\nEvery component is exposed as an enable flag (`mise`, `vitest`, ...) plus an options property\n(`miseOptions`, `vitestOptions`, ...).\n\n## Usage\n\n### Projects\n\n#### AWS CDK Construct Library Project\n\n```typescript\nimport { AwsCdkConstructLibraryProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkConstructLibraryProject({\n name: \"my-cdk-construct\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-construct.git\",\n});\n\nproject.synth();\n```\n\n#### AWS CDK TypeScript App Project\n\n```typescript\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkTypeScriptAppProject({\n name: \"my-cdk-app\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-app.git\",\n});\n\nproject.synth();\n```\n\n#### JSII Project\n\n```typescript\nimport { JsiiProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new JsiiProject({\n name: \"my-jsii-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-jsii-project.git\",\n});\n\nproject.synth();\n```\n\n#### TypeScript Project\n\n```typescript\nimport { TypeScriptProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new TypeScriptProject({\n name: \"my-typescript-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-typescript-project.git\",\n});\n\nproject.synth();\n```\n\n### Components\n\nThe package includes reusable components for common development tasks:\n\n#### Vitest\n\n[Vitest](https://vitest.dev) testing framework component.\n\n```typescript\nimport { Vitest } from \"@nikovirtala/projen-constructs\";\n\nnew Vitest(project, {\n vitestVersion: \"^4\",\n config: {\n coverageProvider: CoverageProvider.V8,\n coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],\n },\n});\n```\n\nType checking runs against the project's development tsconfig (`test/tsconfig.json`) unless\n`config.typecheckTsconfig` says otherwise.\n\nFor Vitest settings that `config` doesn't cover, use `extraTestConfig` (merged into `test`) and\n`extraConfig` (top-level options next to `test`):\n\n```typescript\nnew Vitest(project, {\n extraTestConfig: {\n setupFiles: [\"test/setup.ts\"],\n },\n extraConfig: {\n resolve: { alias: { \"@\": \"/src\" } },\n },\n});\n```\n\n`extraTestConfig` is deep-merged over the generated `test` options: objects merge, and other values\n(including arrays) replace the generated value. Both options are rendered as JSON, so their values\ncan't contain functions or regular expressions, which rules out plugins.\n\n#### TypeDoc\n\n[TypeDoc](https://typedoc.org) documentation generation component.\n\n```typescript\nimport { TypeDoc, EntryPointStrategy } from \"@nikovirtala/projen-constructs\";\n\nnew TypeDoc(project, {\n version: \"^0.28\",\n typeDocConfig: {\n entryPointStrategy: EntryPointStrategy.EXPAND,\n out: \"docs/api\",\n exclude: [\"**/*.test.ts\"],\n },\n});\n```\n\n#### Mise\n\n[Mise](https://mise.jdx.dev) dev tools/runtimes management component.\n\n```typescript\nimport { Mise } from \"@nikovirtala/projen-constructs\";\n\nnew Mise(project, {\n nodeVersion: \"24.19.0\",\n});\n```\n\n#### Homebrew\n\n[Homebrew](https://brew.sh) package management component. Writes a `Brewfile` and adds an\n`install:homebrew` task that bootstraps Homebrew and runs `brew bundle`.\n\n```typescript\nimport { Homebrew } from \"@nikovirtala/projen-constructs\";\n\nconst homebrew = new Homebrew(project, {\n packages: [\"jq\", \"yq\"],\n});\n\nhomebrew.addPackage(\"gh\");\n```\n\n#### Colima\n\n[Colima](https://github.com/abiosoft/colima) container runtime component. Alternative for Docker.\n\n```typescript\nimport { Colima } from \"@nikovirtala/projen-constructs\";\n\nnew Colima(project);\n```\n\n#### LocalStack\n\n[LocalStack](https://www.localstack.cloud) AWS emulation component.\n\n```typescript\nimport { LocalStack } from \"@nikovirtala/projen-constructs\";\n\nnew LocalStack(project, {\n services: [\"s3\", \"lambda\", \"dynamodb\"],\n port: 4566,\n debug: true,\n});\n```\n\n#### LambdaFunctionConstructGenerator\n\nGenerates AWS CDK Lambda Function constructs and bundles their code.\n\n```typescript\nimport { LambdaFunctionConstructGenerator } from \"@nikovirtala/projen-constructs\";\n\nnew LambdaFunctionConstructGenerator(project, {\n sourceDir: \"src/handlers\",\n outputDir: \"src/constructs/lambda\",\n filePattern: \"*.lambda.ts\",\n esbuildOptions: {\n minify: true,\n sourcemap: true,\n },\n});\n```\n\n#### Bundler\n\nLow-level bundling utilities for Lambda functions.\n\n```typescript\nimport {\n Bundler,\n LambdaFunctionCodeBundle,\n} from \"@nikovirtala/projen-constructs\";\n\nconst bundler = new Bundler(project, {\n assetsDir: \"assets\",\n esbuildVersion: \"^0.25\",\n});\n\nnew LambdaFunctionCodeBundle(project, {\n entrypoint: \"src/my-function.lambda.ts\",\n extension: \".lambda.ts\",\n});\n```\n\n#### ProjectGenerator\n\nGenerates TypeScript project classes with standard configuration.\n\n```typescript\nimport { ProjectGenerator, ProjectType } from \"@nikovirtala/projen-constructs\";\n\nnew ProjectGenerator(project, {\n name: \"TypeScriptProject\",\n projectType: ProjectType.TYPE_SCRIPT_PROJECT,\n filePath: \"./src/projects/typescript.generated.ts\",\n components: [\n { componentClass: Mise },\n { componentClass: Vitest }, // Auto-detects VitestOptions from JSII manifest\n ],\n});\n```\n\nFeatures:\n\n- Automatically generates the `ProjectType` enum from Projen's JSII manifest\n- Auto-detects component options types from JSII manifests\n- Strips Projen's `@pjnew` annotation from `packageManager`, which `projen new` would otherwise\n render into a generated `.projenrc.ts` as the package manager that ran the command\n- Validates paths to prevent directory traversal attacks\n- Structured error handling with custom error classes\n\n## Development\n\nThis project is managed by Projen and generates itself: `.projenrc.ts` defines the project using the\n`JsiiProject` type from `src/`. Configuration changes belong in `.projenrc.ts`, never in the\ngenerated files.\n\n```bash\npnpm projen # synthesize project files\npnpm build # synthesize, compile, test and package\npnpm test # biome, vitest, typedoc\npnpm test:watch # vitest in watch mode\npnpm test:update # update snapshots\npnpm biome # format and lint\npnpm docgen # regenerate API.md from the .jsii manifest\npnpm update-versions # refresh src/versions.json\npnpm upgrade # upgrade dependencies\n```\n\n### Build process\n\n```mermaid\nflowchart TD\n projenrc[\".projenrc.ts\"]\n\n subgraph synthesize[\"default (synthesize)\"]\n direction TB\n synth[\"tsx .projenrc.ts\"]\n generator[\"ProjectGenerator\"]\n generated[\"src/project-type.ts<br/>src/projects/*.generated.ts<br/>src/projects/*-options.generated.ts\"]\n projenfiles[\"package.json, tsconfig.json,<br/>pnpm-workspace.yaml, workflows, ...\"]\n brew[\"install:homebrew<br/>brew bundle\"]\n definecfg[\"bundle-vitest-define-config<br/>esbuild → lib/vitest-define-config.js\"]\n\n synth --> generator --> generated\n synth --> projenfiles\n synth --> brew\n synth --> definecfg\n end\n\n subgraph compile[\"compile\"]\n direction TB\n jsii[\"jsii<br/>validates tsconfig.json against the strict rule set\"]\n lib[\"lib/**\"]\n manifest[\".jsii manifest\"]\n\n jsii --> lib\n jsii --> manifest\n end\n\n subgraph test[\"test\"]\n direction TB\n biome[\"biome check --write\"]\n vitest[\"vitest run<br/>+ type checking\"]\n typedoc[\"typedoc → docs/api\"]\n\n biome --> vitest --> typedoc\n end\n\n subgraph package[\"package\"]\n direction TB\n pacmak[\"jsii-pacmak<br/>--pack-command 'pnpm pack'\"]\n dist[\"dist/js/*.tgz\"]\n\n pacmak --> dist\n end\n\n projenrc --> synthesize\n synthesize --> compile\n compile --> test\n test --> package\n\n manifest -. \"component options FQNs<br/>read on the next synthesis\" .-> generator\n docgen[\"docgen<br/>jsii-docgen → API.md\"]\n manifest --> docgen\n\n classDef artifact fill:#eef,stroke:#88a\n class generated,projenfiles,lib,manifest,dist artifact\n```\n\nThe dashed edge is the part worth knowing about: `ProjectGenerator` reads the committed `.jsii`\nmanifest to resolve component options types, so the manifest produced by `compile` feeds the *next*\nsynthesis. This is why `.jsii` is committed rather than ignored. A component options type that is\nmissing from the manifest is reported as a warning and its options property is left out of the\ngenerated interface, which is expected only while a new component is being introduced: compile once,\nthen synthesize again.\n\n`package` runs `package:js` on CI and `package-all` locally; both end up in `jsii-pacmak`.\n`docgen` is not part of `build` and has to be run explicitly after the manifest changes.\n"
4200
4200
  },
4201
4201
  "repository": {
4202
4202
  "type": "git",
@@ -20575,7 +20575,7 @@
20575
20575
  },
20576
20576
  "locationInModule": {
20577
20577
  "filename": "src/components/vitest.ts",
20578
- "line": 317
20578
+ "line": 344
20579
20579
  },
20580
20580
  "parameters": [
20581
20581
  {
@@ -20596,7 +20596,7 @@
20596
20596
  "kind": "class",
20597
20597
  "locationInModule": {
20598
20598
  "filename": "src/components/vitest.ts",
20599
- "line": 290
20599
+ "line": 315
20600
20600
  },
20601
20601
  "methods": [
20602
20602
  {
@@ -20605,7 +20605,7 @@
20605
20605
  },
20606
20606
  "locationInModule": {
20607
20607
  "filename": "src/components/vitest.ts",
20608
- "line": 291
20608
+ "line": 316
20609
20609
  },
20610
20610
  "name": "of",
20611
20611
  "parameters": [
@@ -20630,7 +20630,7 @@
20630
20630
  },
20631
20631
  "locationInModule": {
20632
20632
  "filename": "src/components/vitest.ts",
20633
- "line": 383
20633
+ "line": 417
20634
20634
  },
20635
20635
  "name": "addExclude",
20636
20636
  "parameters": [
@@ -20648,7 +20648,7 @@
20648
20648
  },
20649
20649
  "locationInModule": {
20650
20650
  "filename": "src/components/vitest.ts",
20651
- "line": 378
20651
+ "line": 412
20652
20652
  },
20653
20653
  "name": "addInclude",
20654
20654
  "parameters": [
@@ -20666,7 +20666,7 @@
20666
20666
  },
20667
20667
  "locationInModule": {
20668
20668
  "filename": "src/components/vitest.ts",
20669
- "line": 393
20669
+ "line": 427
20670
20670
  },
20671
20671
  "name": "configureCoverageProvider",
20672
20672
  "parameters": [
@@ -20684,7 +20684,7 @@
20684
20684
  },
20685
20685
  "locationInModule": {
20686
20686
  "filename": "src/components/vitest.ts",
20687
- "line": 412
20687
+ "line": 446
20688
20688
  },
20689
20689
  "name": "configureCoverageReporters",
20690
20690
  "parameters": [
@@ -20707,7 +20707,7 @@
20707
20707
  },
20708
20708
  "locationInModule": {
20709
20709
  "filename": "src/components/vitest.ts",
20710
- "line": 388
20710
+ "line": 422
20711
20711
  },
20712
20712
  "name": "configureEnvironment",
20713
20713
  "parameters": [
@@ -20725,7 +20725,7 @@
20725
20725
  },
20726
20726
  "locationInModule": {
20727
20727
  "filename": "src/components/vitest.ts",
20728
- "line": 417
20728
+ "line": 451
20729
20729
  },
20730
20730
  "name": "configureGlobals"
20731
20731
  },
@@ -20736,7 +20736,7 @@
20736
20736
  },
20737
20737
  "locationInModule": {
20738
20738
  "filename": "src/components/vitest.ts",
20739
- "line": 368
20739
+ "line": 402
20740
20740
  },
20741
20741
  "name": "preSynthesize",
20742
20742
  "overrides": "projen.Component"
@@ -21173,6 +21173,58 @@
21173
21173
  "primitive": "string"
21174
21174
  }
21175
21175
  },
21176
+ {
21177
+ "abstract": true,
21178
+ "docs": {
21179
+ "default": "- no additional top-level options",
21180
+ "example": "{ resolve: { alias: { \"@\": \"/src\" } } }",
21181
+ "remarks": "Values are rendered as JSON, so they must be JSON-serializable (no functions or regular expressions,\nwhich rules out plugins). Use `extraTestConfig` for `test` options.",
21182
+ "see": "https://vitest.dev/config/",
21183
+ "stability": "stable",
21184
+ "summary": "Additional top-level config options, next to `test`, such as `resolve`."
21185
+ },
21186
+ "immutable": true,
21187
+ "locationInModule": {
21188
+ "filename": "src/components/vitest.ts",
21189
+ "line": 312
21190
+ },
21191
+ "name": "extraConfig",
21192
+ "optional": true,
21193
+ "type": {
21194
+ "collection": {
21195
+ "elementtype": {
21196
+ "primitive": "any"
21197
+ },
21198
+ "kind": "map"
21199
+ }
21200
+ }
21201
+ },
21202
+ {
21203
+ "abstract": true,
21204
+ "docs": {
21205
+ "default": "- no additional test options",
21206
+ "example": "{ setupFiles: [\"test/setup.ts\"], expect: { requireAssertions: true } }",
21207
+ "remarks": "Deep-merged over the options generated from `config`: objects are merged, other values (including\narrays) replace the generated value. Values are rendered as JSON, so they must be JSON-serializable\n(no functions or regular expressions).",
21208
+ "see": "https://vitest.dev/config/",
21209
+ "stability": "stable",
21210
+ "summary": "Additional `test` options for settings that `config` doesn't cover, such as `setupFiles` or `expect`."
21211
+ },
21212
+ "immutable": true,
21213
+ "locationInModule": {
21214
+ "filename": "src/components/vitest.ts",
21215
+ "line": 300
21216
+ },
21217
+ "name": "extraTestConfig",
21218
+ "optional": true,
21219
+ "type": {
21220
+ "collection": {
21221
+ "elementtype": {
21222
+ "primitive": "any"
21223
+ },
21224
+ "kind": "map"
21225
+ }
21226
+ }
21227
+ },
21176
21228
  {
21177
21229
  "abstract": true,
21178
21230
  "docs": {
@@ -21195,6 +21247,6 @@
21195
21247
  "symbolId": "src/components/vitest:VitestOptions"
21196
21248
  }
21197
21249
  },
21198
- "version": "0.3.78",
21199
- "fingerprint": "IlSKcQKlyQLH3MfXLnQLJrHFPApv8tEpciIKVND7bI0="
21250
+ "version": "0.3.79",
21251
+ "fingerprint": "VRPwvbb0ZYcBikmET25BdRi+oXVjSIHOXFDkc0B/2DE="
21200
21252
  }
package/README.md CHANGED
@@ -175,6 +175,24 @@ new Vitest(project, {
175
175
  Type checking runs against the project's development tsconfig (`test/tsconfig.json`) unless
176
176
  `config.typecheckTsconfig` says otherwise.
177
177
 
178
+ For Vitest settings that `config` doesn't cover, use `extraTestConfig` (merged into `test`) and
179
+ `extraConfig` (top-level options next to `test`):
180
+
181
+ ```typescript
182
+ new Vitest(project, {
183
+ extraTestConfig: {
184
+ setupFiles: ["test/setup.ts"],
185
+ },
186
+ extraConfig: {
187
+ resolve: { alias: { "@": "/src" } },
188
+ },
189
+ });
190
+ ```
191
+
192
+ `extraTestConfig` is deep-merged over the generated `test` options: objects merge, and other values
193
+ (including arrays) replace the generated value. Both options are rendered as JSON, so their values
194
+ can't contain functions or regular expressions, which rules out plugins.
195
+
178
196
  #### TypeDoc
179
197
 
180
198
  [TypeDoc](https://typedoc.org) documentation generation component.
@@ -1 +1 @@
1
- window.searchData = "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";
1
+ window.searchData = "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";
@@ -14,7 +14,7 @@
14
14
  <div class="tsd-comment tsd-typography"><p>AwsCdkConstructLibraryProject with standard configuration and component integration</p>
15
15
  <p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
16
16
  </div></section>
17
- <section class="tsd-panel tsd-hierarchy" data-refl="813">
17
+ <section class="tsd-panel tsd-hierarchy" data-refl="829">
18
18
  <h4>Hierarchy</h4>
19
19
  <ul class="tsd-hierarchy">
20
20
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">AwsCdkConstructLibrary</span>
@@ -14,7 +14,7 @@
14
14
  <div class="tsd-comment tsd-typography"><p>AwsCdkTypeScriptAppProject with standard configuration and component integration</p>
15
15
  <p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
16
16
  </div></section>
17
- <section class="tsd-panel tsd-hierarchy" data-refl="993">
17
+ <section class="tsd-panel tsd-hierarchy" data-refl="1009">
18
18
  <h4>Hierarchy</h4>
19
19
  <ul class="tsd-hierarchy">
20
20
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">AwsCdkTypeScriptApp</span>
@@ -14,7 +14,7 @@
14
14
  <div class="tsd-comment tsd-typography"><p>JsiiProject with standard configuration and component integration</p>
15
15
  <p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
16
16
  </div></section>
17
- <section class="tsd-panel tsd-hierarchy" data-refl="1176">
17
+ <section class="tsd-panel tsd-hierarchy" data-refl="1192">
18
18
  <h4>Hierarchy</h4>
19
19
  <ul class="tsd-hierarchy">
20
20
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">JsiiProject</span>
@@ -15,7 +15,7 @@
15
15
  <p>This component automates the creation of project classes that extend Projen base classes
16
16
  with opinionated defaults and component integration.</p>
17
17
  </div></section>
18
- <section class="tsd-panel tsd-hierarchy" data-refl="713">
18
+ <section class="tsd-panel tsd-hierarchy" data-refl="729">
19
19
  <h4>Hierarchy</h4>
20
20
  <ul class="tsd-hierarchy">
21
21
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">Component</span>
@@ -14,7 +14,7 @@
14
14
  <div class="tsd-comment tsd-typography"><p>TypeScriptProject with standard configuration and component integration</p>
15
15
  <p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
16
16
  </div></section>
17
- <section class="tsd-panel tsd-hierarchy" data-refl="1353">
17
+ <section class="tsd-panel tsd-hierarchy" data-refl="1369">
18
18
  <h4>Hierarchy</h4>
19
19
  <ul class="tsd-hierarchy">
20
20
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">TypeScriptProject</span>
@@ -10,7 +10,7 @@
10
10
  <ul class="tsd-breadcrumb" aria-label="Breadcrumb">
11
11
  <li><a href="" aria-current="page">Vitest</a></li></ul>
12
12
  <h1>Class Vitest</h1></div>
13
- <section class="tsd-panel tsd-hierarchy" data-refl="511">
13
+ <section class="tsd-panel tsd-hierarchy" data-refl="519">
14
14
  <h4>Hierarchy</h4>
15
15
  <ul class="tsd-hierarchy">
16
16
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">Component</span>
@@ -122,6 +122,14 @@ the editor use, and the one <code>tsconfigDev</code> points at.</li>
122
122
 
123
123
  <p>Type checking runs against the project's development tsconfig (<code>test/tsconfig.json</code>) unless
124
124
  <code>config.typecheckTsconfig</code> says otherwise.</p>
125
+ <p>For Vitest settings that <code>config</code> doesn't cover, use <code>extraTestConfig</code> (merged into <code>test</code>) and
126
+ <code>extraConfig</code> (top-level options next to <code>test</code>):</p>
127
+ <pre><code class="typescript"><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Vitest</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">extraTestConfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">setupFiles:</span><span class="hl-1"> [</span><span class="hl-2">&quot;test/setup.ts&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">extraConfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">resolve:</span><span class="hl-1"> { </span><span class="hl-5">alias:</span><span class="hl-1"> { </span><span class="hl-2">&quot;@&quot;</span><span class="hl-5">:</span><span class="hl-1"> </span><span class="hl-2">&quot;/src&quot;</span><span class="hl-1"> } },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
128
+ </code><button type="button">Copy</button></pre>
129
+
130
+ <p><code>extraTestConfig</code> is deep-merged over the generated <code>test</code> options: objects merge, and other values
131
+ (including arrays) replace the generated value. Both options are rendered as JSON, so their values
132
+ can't contain functions or regular expressions, which rules out plugins.</p>
125
133
  <h4 id="typedoc" class="tsd-anchor-link">TypeDoc<a href="#typedoc" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4>
126
134
  <p><a href="https://typedoc.org">TypeDoc</a> documentation generation component.</p>
127
135
  <pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">TypeDoc</span><span class="hl-1">, </span><span class="hl-5">EntryPointStrategy</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-2">&quot;@nikovirtala/projen-constructs&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">TypeDoc</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">version:</span><span class="hl-1"> </span><span class="hl-2">&quot;^0.28&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">typeDocConfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">entryPointStrategy:</span><span class="hl-1"> </span><span class="hl-5">EntryPointStrategy</span><span class="hl-1">.</span><span class="hl-4">EXPAND</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">out:</span><span class="hl-1"> </span><span class="hl-2">&quot;docs/api&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">exclude:</span><span class="hl-1"> [</span><span class="hl-2">&quot;**/*.test.ts&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
@@ -16,7 +16,7 @@
16
16
  with standard configuration and component integration.</p>
17
17
  </div></section>
18
18
  <div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">ProjectGeneratorOptions</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#additionaloptions">additionalOptions</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#components">components</a><span class="tsd-signature-symbol">?:</span> <a href="Component.html" class="tsd-signature-type tsd-kind-interface">Component</a><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#executable">executable</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#filepath">filePath</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#indent">indent</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#name">name</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#omitoptions">omitOptions</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#projecttype">projectType</a><span class="tsd-signature-symbol">:</span> <a href="../enums/ProjectType.html" class="tsd-signature-type tsd-kind-enum">ProjectType</a><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#readonly">readonly</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div>
19
- <section class="tsd-panel tsd-hierarchy" data-refl="703">
19
+ <section class="tsd-panel tsd-hierarchy" data-refl="719">
20
20
  <h4>Hierarchy</h4>
21
21
  <ul class="tsd-hierarchy">
22
22
  <li class="tsd-hierarchy-item"><span class="tsd-signature-type">SourceCodeOptions</span>
@@ -10,7 +10,7 @@
10
10
  <ul class="tsd-breadcrumb" aria-label="Breadcrumb">
11
11
  <li><a href="" aria-current="page">VitestOptions</a></li></ul>
12
12
  <h1>Interface VitestOptions</h1></div>
13
- <div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">VitestOptions</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#config">config</a><span class="tsd-signature-symbol">?:</span> <a href="VitestConfigOptions.html" class="tsd-signature-type tsd-kind-interface">VitestConfigOptions</a><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#configfilepath">configFilePath</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#vitestversion">vitestVersion</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div>
13
+ <div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">VitestOptions</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#config">config</a><span class="tsd-signature-symbol">?:</span> <a href="VitestConfigOptions.html" class="tsd-signature-type tsd-kind-interface">VitestConfigOptions</a><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#configfilepath">configFilePath</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#extraconfig">extraConfig</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-signature-symbol">[</span><span class="tsd-kind-index-signature">key</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]:</span> <span class="tsd-signature-type">unknown</span> <span class="tsd-signature-symbol">}</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#extratestconfig">extraTestConfig</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-signature-symbol">[</span><span class="tsd-kind-index-signature">key</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]:</span> <span class="tsd-signature-type">unknown</span> <span class="tsd-signature-symbol">}</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#vitestversion">vitestVersion</a><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div>
14
14
  <section class="tsd-panel-group tsd-index-group">
15
15
  <section class="tsd-panel tsd-index-panel">
16
16
  <details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>
@@ -20,6 +20,8 @@
20
20
  <h3 class="tsd-index-heading tsd-anchor-link" id="properties">Properties<a href="#properties" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
21
21
  <div class="tsd-index-list"><a href="#config" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config?</span></a>
22
22
  <a href="#configfilepath" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config<wbr/>File<wbr/>Path?</span></a>
23
+ <a href="#extraconfig" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>extra<wbr/>Config?</span></a>
24
+ <a href="#extratestconfig" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>extra<wbr/>Test<wbr/>Config?</span></a>
23
25
  <a href="#vitestversion" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>vitest<wbr/>Version?</span></a>
24
26
  </div></section></div></details></section></section>
25
27
  <details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>
@@ -40,6 +42,49 @@
40
42
  <h4 class="tsd-anchor-link" id="default">Default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-2">&quot;vitest.config.ts&quot;</span>
41
43
  </code><button type="button">Copy</button></pre>
42
44
 
45
+ </div></div></section>
46
+ <section class="tsd-panel tsd-member">
47
+ <h3 class="tsd-anchor-link" id="extraconfig"><code class="tsd-tag">Optional</code> <code class="tsd-tag">Readonly</code><span>extra<wbr/>Config</span><a href="#extraconfig" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
48
+ <div class="tsd-signature"><span class="tsd-kind-property">extraConfig</span><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-signature-symbol">[</span><span class="tsd-kind-index-signature">key</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]:</span> <span class="tsd-signature-type">unknown</span> <span class="tsd-signature-symbol">}</span></div>
49
+ <div class="tsd-comment tsd-typography"><p>Additional top-level config options, next to <code>test</code>, such as <code>resolve</code>.</p>
50
+ <p>Values are rendered as JSON, so they must be JSON-serializable (no functions or regular expressions,
51
+ which rules out plugins). Use <code>extraTestConfig</code> for <code>test</code> options.</p>
52
+ </div>
53
+ <div class="tsd-comment tsd-typography">
54
+ <div class="tsd-tag-example">
55
+ <h4 class="tsd-anchor-link" id="example">Example<a href="#example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">{ </span><span class="hl-10">resolve</span><span class="hl-1">: { </span><span class="hl-10">alias</span><span class="hl-1">: { </span><span class="hl-2">&quot;@&quot;</span><span class="hl-1">: </span><span class="hl-2">&quot;/src&quot;</span><span class="hl-1"> } } }</span>
56
+ </code><button type="button">Copy</button></pre>
57
+
58
+ </div>
59
+ <div class="tsd-tag-default">
60
+ <h4 class="tsd-anchor-link" id="default-1">Default<a href="#default-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">- </span><span class="hl-5">no</span><span class="hl-1"> </span><span class="hl-5">additional</span><span class="hl-1"> </span><span class="hl-5">top</span><span class="hl-1">-</span><span class="hl-5">level</span><span class="hl-1"> </span><span class="hl-5">options</span>
61
+ </code><button type="button">Copy</button></pre>
62
+
63
+ </div>
64
+ <div class="tsd-tag-see">
65
+ <h4 class="tsd-anchor-link" id="see">See<a href="#see" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p><a href="https://vitest.dev/config/">https://vitest.dev/config/</a></p>
66
+ </div></div></section>
67
+ <section class="tsd-panel tsd-member">
68
+ <h3 class="tsd-anchor-link" id="extratestconfig"><code class="tsd-tag">Optional</code> <code class="tsd-tag">Readonly</code><span>extra<wbr/>Test<wbr/>Config</span><a href="#extratestconfig" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
69
+ <div class="tsd-signature"><span class="tsd-kind-property">extraTestConfig</span><span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-signature-symbol">[</span><span class="tsd-kind-index-signature">key</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]:</span> <span class="tsd-signature-type">unknown</span> <span class="tsd-signature-symbol">}</span></div>
70
+ <div class="tsd-comment tsd-typography"><p>Additional <code>test</code> options for settings that <code>config</code> doesn't cover, such as <code>setupFiles</code> or <code>expect</code>.</p>
71
+ <p>Deep-merged over the options generated from <code>config</code>: objects are merged, other values (including
72
+ arrays) replace the generated value. Values are rendered as JSON, so they must be JSON-serializable
73
+ (no functions or regular expressions).</p>
74
+ </div>
75
+ <div class="tsd-comment tsd-typography">
76
+ <div class="tsd-tag-example">
77
+ <h4 class="tsd-anchor-link" id="example-1">Example<a href="#example-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">{ </span><span class="hl-10">setupFiles</span><span class="hl-1">: [</span><span class="hl-2">&quot;test/setup.ts&quot;</span><span class="hl-1">], </span><span class="hl-10">expect</span><span class="hl-1">: { </span><span class="hl-10">requireAssertions</span><span class="hl-1">: </span><span class="hl-3">true</span><span class="hl-1"> } }</span>
78
+ </code><button type="button">Copy</button></pre>
79
+
80
+ </div>
81
+ <div class="tsd-tag-default">
82
+ <h4 class="tsd-anchor-link" id="default-2">Default<a href="#default-2" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-1">- </span><span class="hl-5">no</span><span class="hl-1"> </span><span class="hl-5">additional</span><span class="hl-1"> </span><span class="hl-5">test</span><span class="hl-1"> </span><span class="hl-5">options</span>
83
+ </code><button type="button">Copy</button></pre>
84
+
85
+ </div>
86
+ <div class="tsd-tag-see">
87
+ <h4 class="tsd-anchor-link" id="see-1">See<a href="#see-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p><a href="https://vitest.dev/config/">https://vitest.dev/config/</a></p>
43
88
  </div></div></section>
44
89
  <section class="tsd-panel tsd-member">
45
90
  <h3 class="tsd-anchor-link" id="vitestversion"><code class="tsd-tag">Optional</code> <code class="tsd-tag">Readonly</code><span>vitest<wbr/>Version</span><a href="#vitestversion" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
@@ -48,7 +93,7 @@
48
93
  </div>
49
94
  <div class="tsd-comment tsd-typography">
50
95
  <div class="tsd-tag-default">
51
- <h4 class="tsd-anchor-link" id="default-1">Default<a href="#default-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-2">&quot;^4&quot;</span>
96
+ <h4 class="tsd-anchor-link" id="default-3">Default<a href="#default-3" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-2">&quot;^4&quot;</span>
52
97
  </code><button type="button">Copy</button></pre>
53
98
 
54
99
  </div></div></section></section></details></div>
@@ -68,7 +113,7 @@
68
113
  <h3>On This Page</h3></summary>
69
114
  <div class="tsd-accordion-details">
70
115
  <details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary>
71
- <div><a href="#config"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config</span></a><a href="#configfilepath"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config<wbr/>File<wbr/>Path</span></a><a href="#vitestversion"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>vitest<wbr/>Version</span></a></div></details></div></details></div>
116
+ <div><a href="#config"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config</span></a><a href="#configfilepath"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>config<wbr/>File<wbr/>Path</span></a><a href="#extraconfig"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>extra<wbr/>Config</span></a><a href="#extratestconfig"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>extra<wbr/>Test<wbr/>Config</span></a><a href="#vitestversion"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>vitest<wbr/>Version</span></a></div></details></div></details></div>
72
117
  <div class="site-menu">
73
118
  <nav class="tsd-navigation"><a href="../modules.html">@nikovirtala/projen-constructs</a>
74
119
  <ul class="tsd-small-nested-navigation" id="tsd-nav-container">
@@ -55,7 +55,7 @@ function convertToPosixPath(p) {
55
55
  return p.split(node_path_1.sep).join(node_path_1.posix.sep);
56
56
  }
57
57
  class Bundler extends projen_1.Component {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.78" };
58
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.79" };
59
59
  static of(project) {
60
60
  const isBundler = (o) => o instanceof Bundler;
61
61
  return project.components.find(isBundler);
@@ -157,7 +157,7 @@ class Bundler extends projen_1.Component {
157
157
  }
158
158
  exports.Bundler = Bundler;
159
159
  class LambdaFunctionCodeBundle extends projen_1.Component {
160
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.78" };
160
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.79" };
161
161
  constructor(project, options) {
162
162
  super(project);
163
163
  const bundler = Bundler.of(project);
@@ -203,7 +203,7 @@ exports.LambdaFunctionCodeBundle = LambdaFunctionCodeBundle;
203
203
  * Creates Lambda Function code bundles from entrypoints discovered in the project's source tree.
204
204
  */
205
205
  class LambdaFunctionCodeBundler extends projen_1.cdk.AutoDiscoverBase {
206
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.78" };
206
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.79" };
207
207
  constructor(project, options) {
208
208
  super(project, {
209
209
  projectdir: options.srcdir,
@@ -6,7 +6,7 @@ const component_1 = require("projen/lib/component");
6
6
  const task_shell_1 = require("projen/lib/task-shell");
7
7
  const homebrew_1 = require("./homebrew");
8
8
  class Colima extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.78" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.79" };
10
10
  constructor(scope) {
11
11
  super(scope);
12
12
  const project = this.project;
@@ -6,7 +6,7 @@ const component_1 = require("projen/lib/component");
6
6
  const task_shell_1 = require("projen/lib/task-shell");
7
7
  const textfile_1 = require("projen/lib/textfile");
8
8
  class Homebrew extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.78" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.79" };
10
10
  static of(project) {
11
11
  const isHomebrew = (c) => c instanceof Homebrew;
12
12
  return project.components.find(isHomebrew);
@@ -39,7 +39,7 @@ const path = __importStar(require("node:path"));
39
39
  const projen_1 = require("projen");
40
40
  const utils_1 = require("../utils");
41
41
  class LambdaFunctionConstructGenerator extends projen_1.Component {
42
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.78" };
42
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.79" };
43
43
  sourceDir;
44
44
  outputDir;
45
45
  filePattern;
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
7
7
  const colima_1 = require("./colima");
8
8
  const homebrew_1 = require("./homebrew");
9
9
  class LocalStack extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.78" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.79" };
11
11
  constructor(scope, options = {}) {
12
12
  super(scope);
13
13
  const project = javascript_1.NodeProject.of(this);
@@ -7,7 +7,7 @@ const component_1 = require("projen/lib/component");
7
7
  const textfile_1 = require("projen/lib/textfile");
8
8
  const homebrew_1 = require("./homebrew");
9
9
  class Mise extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.78" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.79" };
11
11
  static of(project) {
12
12
  const isMise = (c) => c instanceof Mise;
13
13
  return project.components.find(isMise);
@@ -34,7 +34,7 @@ const DEFAULT_CONFIG = {
34
34
  * TypeDoc component for projen projects
35
35
  */
36
36
  class TypeDoc extends component_1.Component {
37
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.78" };
37
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.79" };
38
38
  static of(project) {
39
39
  const isTypeDoc = (c) => c instanceof TypeDoc;
40
40
  return project.components.find(isTypeDoc);
@@ -244,6 +244,33 @@ export interface VitestOptions {
244
244
  * @default "^4"
245
245
  */
246
246
  readonly vitestVersion?: string;
247
+ /**
248
+ * Additional `test` options for settings that `config` doesn't cover, such as `setupFiles` or `expect`.
249
+ *
250
+ * Deep-merged over the options generated from `config`: objects are merged, other values (including
251
+ * arrays) replace the generated value. Values are rendered as JSON, so they must be JSON-serializable
252
+ * (no functions or regular expressions).
253
+ *
254
+ * @example { setupFiles: ["test/setup.ts"], expect: { requireAssertions: true } }
255
+ * @default - no additional test options
256
+ * @see https://vitest.dev/config/
257
+ */
258
+ readonly extraTestConfig?: {
259
+ [key: string]: unknown;
260
+ };
261
+ /**
262
+ * Additional top-level config options, next to `test`, such as `resolve`.
263
+ *
264
+ * Values are rendered as JSON, so they must be JSON-serializable (no functions or regular expressions,
265
+ * which rules out plugins). Use `extraTestConfig` for `test` options.
266
+ *
267
+ * @example { resolve: { alias: { "@": "/src" } } }
268
+ * @default - no additional top-level options
269
+ * @see https://vitest.dev/config/
270
+ */
271
+ readonly extraConfig?: {
272
+ [key: string]: unknown;
273
+ };
247
274
  }
248
275
  export declare class Vitest extends Component {
249
276
  static of(project: NodeProject): Vitest | undefined;
@@ -267,6 +294,8 @@ export declare class Vitest extends Component {
267
294
  private version;
268
295
  private readonly printConsoleTrace;
269
296
  private readonly slowTestThreshold;
297
+ private readonly extraTestConfig;
298
+ private readonly extraConfig;
270
299
  constructor(project: NodeProject, options?: VitestOptions);
271
300
  preSynthesize(): void;
272
301
  addInclude(pattern: string): void;
@@ -140,7 +140,7 @@ var CoverageReporter;
140
140
  CoverageReporter["TEXT"] = "text";
141
141
  })(CoverageReporter || (exports.CoverageReporter = CoverageReporter = {}));
142
142
  class Vitest extends component_1.Component {
143
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.3.78" };
143
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.3.79" };
144
144
  static of(project) {
145
145
  const isVitest = (c) => c instanceof Vitest;
146
146
  return project.components.find(isVitest);
@@ -165,8 +165,15 @@ class Vitest extends component_1.Component {
165
165
  version;
166
166
  printConsoleTrace;
167
167
  slowTestThreshold;
168
+ extraTestConfig;
169
+ extraConfig;
168
170
  constructor(project, options = {}) {
169
171
  super(project);
172
+ if (options.extraConfig && "test" in options.extraConfig) {
173
+ throw new Error("vitest extraConfig must not contain `test`, use extraTestConfig for test options");
174
+ }
175
+ this.extraTestConfig = options.extraTestConfig ?? {};
176
+ this.extraConfig = options.extraConfig ?? {};
170
177
  this.configFilePath = options.configFilePath ?? "vitest.config.ts";
171
178
  this.include = new Set(options.config?.include ?? ["**/*.{test,spec}.?(c|m)[jt]s?(x)"]);
172
179
  this.exclude = new Set(options.config?.exclude ?? [
@@ -293,42 +300,38 @@ class Vitest extends component_1.Component {
293
300
  const defineConfigImport = packageName === "@nikovirtala/projen-constructs"
294
301
  ? 'import { defineConfig } from "./lib/vitest-define-config";'
295
302
  : 'import { defineConfig } from "@nikovirtala/projen-constructs/lib/vitest-define-config";';
296
- return [
297
- defineConfigImport,
298
- "",
299
- "export default defineConfig({",
300
- " test: {",
301
- ...this.renderTestOptions(),
302
- " },",
303
- "});",
304
- ];
303
+ const config = {
304
+ ...this.extraConfig,
305
+ test: (0, utils_1.deepMerge)(this.renderTestOptions(), this.extraTestConfig),
306
+ };
307
+ return [defineConfigImport, "", `export default defineConfig(${JSON.stringify(config, null, 2)});`];
305
308
  }
306
309
  renderTestOptions() {
307
- const lines = [];
308
- lines.push(` bail: ${this.bail},`);
309
- lines.push(" coverage: {");
310
- lines.push(` enabled: ${this.coverageEnabled},`);
311
- lines.push(` provider: "${this.coverageProvider}",`);
312
- lines.push(` reporter: ${JSON.stringify(this.coverageReporters)},`);
313
- lines.push(` reportsDirectory: "${this.coverageDirectory}",`);
314
- lines.push(" },");
315
- lines.push(` environment: "${this.environment}",`);
316
- lines.push(` exclude: ${JSON.stringify(Array.from(this.exclude))},`);
317
- lines.push(` globals: ${this.globals},`);
318
- lines.push(` include: ${JSON.stringify(Array.from(this.include))},`);
319
- lines.push(` isolate: ${this.isolate},`);
320
- lines.push(` passWithNoTests: ${this.passWithNoTests},`);
321
- lines.push(` printConsoleTrace: ${this.printConsoleTrace},`);
322
- lines.push(` pool: "${this.pool}",`);
323
- lines.push(` slowTestThreshold: ${this.slowTestThreshold},`);
324
- lines.push(" typecheck: {");
325
- lines.push(` enabled: ${this.typecheckEnabled},`);
326
- lines.push(` checker: "${this.typecheckChecker}",`);
327
- lines.push(` tsconfig: "${this.typecheckTsconfig}",`);
328
- lines.push(" },");
329
- lines.push(` update: ${this.updateSnapshots},`);
330
- return lines;
310
+ return {
311
+ bail: this.bail,
312
+ coverage: {
313
+ enabled: this.coverageEnabled,
314
+ provider: this.coverageProvider,
315
+ reporter: this.coverageReporters,
316
+ reportsDirectory: this.coverageDirectory,
317
+ },
318
+ environment: this.environment,
319
+ exclude: Array.from(this.exclude),
320
+ globals: this.globals,
321
+ include: Array.from(this.include),
322
+ isolate: this.isolate,
323
+ passWithNoTests: this.passWithNoTests,
324
+ printConsoleTrace: this.printConsoleTrace,
325
+ pool: this.pool,
326
+ slowTestThreshold: this.slowTestThreshold,
327
+ typecheck: {
328
+ enabled: this.typecheckEnabled,
329
+ checker: this.typecheckChecker,
330
+ tsconfig: this.typecheckTsconfig,
331
+ },
332
+ update: this.updateSnapshots,
333
+ };
331
334
  }
332
335
  }
333
336
  exports.Vitest = Vitest;
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBa0M7QUFDbEMsbUNBQXFDO0FBQ3JDLG9EQUFpRDtBQUNqRCwwREFBeUQ7QUFDekQsc0RBQStEO0FBQy9ELGtEQUErQztBQUMvQyxvQ0FBMkM7QUFFM0MsSUFBWSxXQTBCWDtBQTFCRCxXQUFZLFdBQVc7SUFDbkI7Ozs7T0FJRztJQUNILDRDQUE2QixDQUFBO0lBRTdCOzs7O09BSUc7SUFDSCxzQ0FBdUIsQ0FBQTtJQUV2Qjs7OztPQUlHO0lBQ0gsOEJBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtBQUNqQixDQUFDLEVBMUJXLFdBQVcsMkJBQVgsV0FBVyxRQTBCdEI7QUFFRCxJQUFZLElBbUNYO0FBbkNELFdBQVksSUFBSTtJQUNaOzs7Ozs7T0FNRztJQUNILHVCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMkJBQW1CLENBQUE7SUFFbkI7Ozs7Ozs7O09BUUc7SUFDSCwyQkFBbUIsQ0FBQTtJQUVuQjs7Ozs7T0FLRztJQUNILCtCQUF1QixDQUFBO0FBQzNCLENBQUMsRUFuQ1csSUFBSSxvQkFBSixJQUFJLFFBbUNmO0FBRUQsSUFBWSxnQkFjWDtBQWRELFdBQVksZ0JBQWdCO0lBQ3hCOzs7O09BSUc7SUFDSCx5Q0FBcUIsQ0FBQTtJQUVyQjs7OztPQUlHO0lBQ0gsNkJBQVMsQ0FBQTtBQUNiLENBQUMsRUFkVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQWMzQjtBQUVELElBQVksZ0JBeUJYO0FBekJELFdBQVksZ0JBQWdCO0lBQ3hCOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7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c0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBhd3NjZGssIGNkayB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW4vbGliL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwicHJvamVuL2xpYi9kZXBlbmRlbmNpZXNcIjtcbmltcG9ydCB7IEplc3QsIHR5cGUgTm9kZVByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCJwcm9qZW4vbGliL3RleHRmaWxlXCI7XG5pbXBvcnQgeyB0c2NvbmZpZ0RldlBhdGggfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGVudW0gRW52aXJvbm1lbnQge1xuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBWZXJjZWwncyBFZGdlIFJ1bnRpbWUgVk0uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZWRnZS1ydW50aW1lLnZlcmNlbC5hcHAvcGFja2FnZXMvdm1cbiAgICAgKi9cbiAgICBFREdFX1JVTlRJTUUgPSBcImVkZ2UtcnVudGltZVwiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGBoYXBweS1kb21gIGVudmlyb25tZW50LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2Fwcmljb3JuODYvaGFwcHktZG9tXG4gICAgICovXG4gICAgSEFQUFlfRE9NID0gXCJoYXBweS1kb21cIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBganNkb21gIGVudmlyb25tZW50LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vanNkb20vanNkb21cbiAgICAgKi9cbiAgICBKU0RPTSA9IFwianNkb21cIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gICAgICovXG4gICAgTk9ERSA9IFwibm9kZVwiLFxufVxuXG5leHBvcnQgZW51bSBQb29sIHtcbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYG5vZGU6Y2hpbGRfcHJvY2Vzc2AgdXNpbmcgZm9yaygpXG4gICAgICpcbiAgICAgKiBUZXN0IGlzb2xhdGlvbiAod2hlbiBlbmFibGVkKSBpcyBkb25lIGJ5IHNwYXduaW5nIGEgbmV3IGNoaWxkIHByb2Nlc3MgZm9yIGVhY2ggdGVzdCBmaWxlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2NoaWxkX3Byb2Nlc3MuaHRtbCNjaGlsZF9wcm9jZXNzZm9ya21vZHVsZXBhdGgtYXJncy1vcHRpb25zXG4gICAgICovXG4gICAgRk9SS1MgPSBcImZvcmtzXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYG5vZGU6d29ya2VyX3RocmVhZHNgLlxuICAgICAqXG4gICAgICogVGVzdCBpc29sYXRpb24gKHdoZW4gZW5hYmxlZCkgaXMgZG9uZSBieSBzcGF3bmluZyBhIG5ldyB0aHJlYWQgZm9yIGVhY2ggdGVzdCBmaWxlLlxuICAgICAqL1xuICAgIFRIUkVBRFMgPSBcInRocmVhZHNcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBpc29sYXRlZCBgbm9kZTp2bWAuXG4gICAgICpcbiAgICAgKiBUZXN0IGZpbGVzIGFyZSBydW4gcGFyYWxsZWwgdXNpbmcgYG5vZGU6Y2hpbGRfcHJvY2Vzc2AgZm9yaygpXG4gICAgICpcbiAgICAgKiBUaGlzIG1ha2VzIHRlc3RzIHJ1biBmYXN0ZXIsIGJ1dCBWTSBtb2R1bGUgaXMgdW5zdGFibGUuIFlvdXIgdGVzdHMgbWlnaHQgbGVhayBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3Nmb3JrbW9kdWxlcGF0aC1hcmdzLW9wdGlvbnNcbiAgICAgKi9cbiAgICBWTUZPUktTID0gXCJ2bWZvcmtzXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gaXNvbGF0ZWQgYG5vZGU6dm1gLlxuICAgICAqIFRlc3QgZmlsZXMgYXJlIHJ1biBwYXJhbGxlbCB1c2luZyBgbm9kZTp3b3JrZXJfdGhyZWFkc2AuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ha2VzIHRlc3RzIHJ1biBmYXN0ZXIsIGJ1dCBWTSBtb2R1bGUgaXMgdW5zdGFibGUuIFlvdXIgdGVzdHMgbWlnaHQgbGVhayBtZW1vcnkuXG4gICAgICovXG4gICAgVk1USFJFQURTID0gXCJ2bXRocmVhZHNcIixcbn1cblxuZXhwb3J0IGVudW0gQ292ZXJhZ2VQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogUHJvdmlkZSBjb3ZlcmFnZSByZXBvcnQgdXNpbmcgaXN0YW5idWwuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaXN0YW5idWwuanMub3JnXG4gICAgICovXG4gICAgSVNUQU5CVUwgPSBcImlzdGFuYnVsXCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGNvdmVyYWdlIHJlcG9ydHMgdXNpbmcgdjguXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdjguZGV2L2Jsb2cvamF2YXNjcmlwdC1jb2RlLWNvdmVyYWdlXG4gICAgICovXG4gICAgVjggPSBcInY4XCIsXG59XG5cbmV4cG9ydCBlbnVtIENvdmVyYWdlUmVwb3J0ZXIge1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGBjbG92ZXJgIHJlcG9ydC5cbiAgICAgKi9cbiAgICBDTE9WRVIgPSBcImNsb3ZlclwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYEhUTUxgIHJlcG9ydC5cbiAgICAgKi9cbiAgICBIVE1MID0gXCJodG1sXCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgSlNPTmAgcmVwb3J0LlxuICAgICAqL1xuICAgIEpTT04gPSBcImpzb25cIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGBMQ09WYCByZXBvcnQuXG4gICAgICovXG4gICAgTENPViA9IFwibGNvdlwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYHRleHRgIHJlcG9ydC5cbiAgICAgKi9cbiAgICBURVhUID0gXCJ0ZXh0XCIsXG59XG5cbi8qKlxuICogVml0ZXN0IENvbmZpZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml0ZXN0Q29uZmlnT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGdsb2IgcGF0dGVybnMgdGhhdCBtYXRjaCB5b3VyIHRlc3QgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIFZpdGVzdCdzIGBjb25maWdEZWZhdWx0cy5pbmNsdWRlYFxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jaW5jbHVkZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGluY2x1ZGU/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGdsb2IgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB5b3VyIHRlc3QgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIFZpdGVzdCdzIGBjb25maWdEZWZhdWx0cy5leGNsdWRlYFxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jZXhjbHVkZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGU/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVudmlyb25tZW50IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJub2RlXCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2Vudmlyb25tZW50XG4gICAgICovXG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBhbiBpc29sYXRlZCBlbnZpcm9ubWVudC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB2bVRocmVhZHMgcG9vbC5cbiAgICAgKlxuICAgICAqIERpc2FibGluZyB0aGlzIG9wdGlvbiBtaWdodCBpbXByb3ZlIHBlcmZvcm1hbmNlIGlmIHlvdXIgY29kZSBkb2Vzbid0IHJlbHkgb24gc2lkZSBlZmZlY3RzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jaXNvbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlzb2xhdGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUG9vbCB1c2VkIHRvIHJ1biB0ZXN0cyBpbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZm9ya3NcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jcG9vbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBvb2w/OiBQb29sO1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYXBpcyBnbG9iYWxseS4gSWYgeW91IHByZWZlciB0byB1c2UgdGhlIEFQSXMgZ2xvYmFsbHkgbGlrZSBKZXN0LCBzZXQgdG8gYHRydWVgLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2dsb2JhbHNcbiAgICAgKi9cbiAgICByZWFkb25seSBnbG9iYWxzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNjb3ZlcmFnZS1lbmFibGVkXG4gICAgICovXG4gICAgcmVhZG9ubHkgY292ZXJhZ2VFbmFibGVkPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIHByb3ZpZGVyIHR5cGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcInY4XCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvdmVyYWdlLXByb3ZpZGVyXG4gICAgICovXG4gICAgcmVhZG9ubHkgY292ZXJhZ2VQcm92aWRlcj86IENvdmVyYWdlUHJvdmlkZXI7XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlcmFnZSByZXBvcnRlcnMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAnW1widGV4dFwiLCBcImxjb3ZcIl0nXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNjb3ZlcmFnZS1yZXBvcnRlclxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvdmVyYWdlUmVwb3J0ZXJzPzogQXJyYXk8Q292ZXJhZ2VSZXBvcnRlcj47XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlcmFnZSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJjb3ZlcmFnZVwiXG4gICAgICovXG4gICAgcmVhZG9ubHkgY292ZXJhZ2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdHlwZWNoZWNraW5nIGFsb25nc2lkZSB5b3VyIHJlZ3VsYXIgdGVzdHMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlIChmb3IgVHlwZVNjcmlwdCBwcm9qZWN0cylcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3R5cGVjaGVjay1lbmFibGVkXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZWNoZWNrRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBUb29sIHRvIHVzZSBmb3IgdHlwZSBjaGVja2luZy4gQ2hlY2tlciBzaG91bGQgaW1wbGVtZW50IHRoZSBzYW1lIG91dHB1dCBmb3JtYXQgYXMgYHRzY2AuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcInRzYyAtLW5vRW1pdFwiXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyN0eXBlY2hlY2stY2hlY2tlclxuICAgICAqL1xuICAgIHJlYWRvbmx5IHR5cGVjaGVja0NoZWNrZXI/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQYXRoIHRvIGN1c3RvbSB0c2NvbmZpZywgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gdGhlIHByb2plY3QncyBkZXZlbG9wbWVudCB0c2NvbmZpZyAoZS5nLiBcInRlc3QvdHNjb25maWcuanNvblwiKVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jdHlwZWNoZWNrLXRzY29uZmlnXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZWNoZWNrVHNjb25maWc/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBWaXRlc3Qgd2lsbCBub3QgZmFpbCwgaWYgbm8gdGVzdHMgd2lsbCBiZSBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3Bhc3N3aXRobm90ZXN0c1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhc3NXaXRoTm9UZXN0cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHJ1bm5pbmcgdGVzdHMgYWZ0ZXIgY2VydGFpbiBudW1iZXIgb2YgZmFpbHVyZXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNiYWlsXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmFpbD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBzbmFwc2hvdCBmaWxlcy4gVGhpcyB3aWxsIHVwZGF0ZSBhbGwgY2hhbmdlZCBzbmFwc2hvdHMgYW5kIGRlbGV0ZSBvYnNvbGV0ZSBvbmVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2d1aWRlL3NuYXBzaG90Lmh0bWwjdXBkYXRpbmctc25hcHNob3RzXG4gICAgICovXG4gICAgcmVhZG9ubHkgdXBkYXRlU25hcHNob3RzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEFsd2F5cyBwcmludCBjb25zb2xlIHRyYWNlcyB3aGVuIGNhbGxpbmcgYW55IGNvbnNvbGUgbWV0aG9kLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jY29uc29sZXRyYWNlXG4gICAgICovXG4gICAgcmVhZG9ubHkgcHJpbnRDb25zb2xlVHJhY2U/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0ZXN0IG9yIHN1aXRlIGlzIGNvbnNpZGVyZWQgc2xvdy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDMwMFxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jc2xvd3Rlc3R0aHJlc2hvbGRcbiAgICAgKi9cbiAgICByZWFkb25seSBzbG93VGVzdFRocmVzaG9sZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDb25maWcgZmlsZSBwYXRoLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJ2aXRlc3QuY29uZmlnLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb25maWdGaWxlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWwgY29uZmlnIG9wdGlvbnMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uZmlnPzogVml0ZXN0Q29uZmlnT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFZpdGVzdCB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJeNFwiXG4gICAgICovXG4gICAgcmVhZG9ubHkgdml0ZXN0VmVyc2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFZpdGVzdCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcHVibGljIHN0YXRpYyBvZihwcm9qZWN0OiBOb2RlUHJvamVjdCk6IFZpdGVzdCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGlzVml0ZXN0ID0gKGM6IENvbXBvbmVudCk6IGMgaXMgVml0ZXN0ID0+IGMgaW5zdGFuY2VvZiBWaXRlc3Q7XG4gICAgICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc1ZpdGVzdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdGaWxlUGF0aDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5jbHVkZTogU2V0PHN0cmluZz47XG4gICAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlOiBTZXQ8c3RyaW5nPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzb2xhdGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQb29sO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY292ZXJhZ2VFbmFibGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWNoZWNrRW5hYmxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGVjaGVja0NoZWNrZXI6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGVjaGVja1RzY29uZmlnOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzV2l0aE5vVGVzdHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYWlsOiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVTbmFwc2hvdHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAgIHByaXZhdGUgZ2xvYmFsczogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNvdmVyYWdlUHJvdmlkZXI6IENvdmVyYWdlUHJvdmlkZXI7XG4gICAgcHJpdmF0ZSBjb3ZlcmFnZVJlcG9ydGVyczogQXJyYXk8Q292ZXJhZ2VSZXBvcnRlcj47XG4gICAgcHJpdmF0ZSBjb3ZlcmFnZURpcmVjdG9yeTogc3RyaW5nO1xuICAgIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbnRDb25zb2xlVHJhY2U6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzbG93VGVzdFRocmVzaG9sZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFZpdGVzdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgICAgICB0aGlzLmNvbmZpZ0ZpbGVQYXRoID0gb3B0aW9ucy5jb25maWdGaWxlUGF0aCA/PyBcInZpdGVzdC5jb25maWcudHNcIjtcbiAgICAgICAgdGhpcy5pbmNsdWRlID0gbmV3IFNldChvcHRpb25zLmNvbmZpZz8uaW5jbHVkZSA/PyBbXCIqKi8qLnt0ZXN0LHNwZWN9Lj8oY3xtKVtqdF1zPyh4KVwiXSk7XG4gICAgICAgIHRoaXMuZXhjbHVkZSA9IG5ldyBTZXQoXG4gICAgICAgICAgICBvcHRpb25zLmNvbmZpZz8uZXhjbHVkZSA/PyBbXG4gICAgICAgICAgICAgICAgXCIqKi9ub2RlX21vZHVsZXMvKipcIixcbiAgICAgICAgICAgICAgICBcIioqL2Rpc3QvKipcIixcbiAgICAgICAgICAgICAgICBcIioqL2N5cHJlc3MvKipcIixcbiAgICAgICAgICAgICAgICBcIioqLy57aWRlYSxnaXQsY2FjaGUsb3V0cHV0LHRlbXB9LyoqXCIsXG4gICAgICAgICAgICAgICAgXCIqKi97a2FybWEscm9sbHVwLHdlYnBhY2ssdml0ZSx2aXRlc3QsamVzdCxhdmEsYmFiZWwsbnljLGN5cHJlc3MsdHN1cCxidWlsZCxlc2xpbnQscHJldHRpZXJ9LmNvbmZpZy4qXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzb2xhdGUgPSBvcHRpb25zLmNvbmZpZz8uaXNvbGF0ZSA/PyB0cnVlO1xuICAgICAgICB0aGlzLnBvb2wgPSBvcHRpb25zLmNvbmZpZz8ucG9vbCA/PyBQb29sLkZPUktTO1xuICAgICAgICB0aGlzLmNvdmVyYWdlRW5hYmxlZCA9IG9wdGlvbnMuY29uZmlnPy5jb3ZlcmFnZUVuYWJsZWQgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlY2hlY2tFbmFibGVkID0gb3B0aW9ucy5jb25maWc/LnR5cGVjaGVja0VuYWJsZWQgPz8gdGhpcy5pc1R5cGVzY3JpcHRQcm9qZWN0KCk7XG4gICAgICAgIHRoaXMudHlwZWNoZWNrQ2hlY2tlciA9IG9wdGlvbnMuY29uZmlnPy50eXBlY2hlY2tDaGVja2VyID8/IFwidHNjIC0tbm9FbWl0XCI7XG4gICAgICAgIHRoaXMudHlwZWNoZWNrVHNjb25maWcgPSBvcHRpb25zLmNvbmZpZz8udHlwZWNoZWNrVHNjb25maWcgPz8gdHNjb25maWdEZXZQYXRoKHByb2plY3QpO1xuICAgICAgICB0aGlzLnBhc3NXaXRoTm9UZXN0cyA9IG9wdGlvbnMuY29uZmlnPy5wYXNzV2l0aE5vVGVzdHMgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5iYWlsID0gb3B0aW9ucy5jb25maWc/LmJhaWwgPz8gMDtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IG9wdGlvbnMuY29uZmlnPy5lbnZpcm9ubWVudCA/PyBFbnZpcm9ubWVudC5OT0RFO1xuICAgICAgICB0aGlzLmdsb2JhbHMgPSBvcHRpb25zLmNvbmZpZz8uZ2xvYmFscyA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVByb3ZpZGVyID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlUHJvdmlkZXIgPz8gQ292ZXJhZ2VQcm92aWRlci5WODtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyA9IG9wdGlvbnMuY29uZmlnPy5jb3ZlcmFnZVJlcG9ydGVycyA/PyBbQ292ZXJhZ2VSZXBvcnRlci5URVhULCBDb3ZlcmFnZVJlcG9ydGVyLkxDT1ZdO1xuICAgICAgICB0aGlzLmNvdmVyYWdlRGlyZWN0b3J5ID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlRGlyZWN0b3J5ID8/IFwiY292ZXJhZ2VcIjtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52aXRlc3RWZXJzaW9uID8/IFwiXjRcIjtcbiAgICAgICAgdGhpcy51cGRhdGVTbmFwc2hvdHMgPSBvcHRpb25zLmNvbmZpZz8udXBkYXRlU25hcHNob3RzID8/IHRydWU7XG4gICAgICAgIHRoaXMucHJpbnRDb25zb2xlVHJhY2UgPSBvcHRpb25zLmNvbmZpZz8ucHJpbnRDb25zb2xlVHJhY2UgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5zbG93VGVzdFRocmVzaG9sZCA9IG9wdGlvbnMuY29uZmlnPy5zbG93VGVzdFRocmVzaG9sZCA/PyAzMDA7XG5cbiAgICAgICAgcHJvamVjdC5hZGREZXZEZXBzKGB2aXRlc3RAJHt0aGlzLnZlcnNpb259YCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlQ292ZXJhZ2VQcm92aWRlcih0aGlzLmNvdmVyYWdlUHJvdmlkZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbHMgJiYgdGhpcy5pc1R5cGVzY3JpcHRQcm9qZWN0KCkgJiYgdGhpcy5wcm9qZWN0LnRyeUZpbmRPYmplY3RGaWxlKHRoaXMudHlwZWNoZWNrVHNjb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZUdsb2JhbHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdmVyYWdlRGlyZWN0b3J5UGF0aCA9IHBhdGgucG9zaXguam9pbihcIi9cIiwgdGhpcy5jb3ZlcmFnZURpcmVjdG9yeSwgXCIvXCIpO1xuICAgICAgICBwcm9qZWN0Lm5wbWlnbm9yZT8uZXhjbHVkZShjb3ZlcmFnZURpcmVjdG9yeVBhdGgpO1xuICAgICAgICBwcm9qZWN0LmdpdGlnbm9yZS5leGNsdWRlKGNvdmVyYWdlRGlyZWN0b3J5UGF0aCk7XG5cbiAgICAgICAgdGhpcy5hZGRUZXN0Q29tbWFuZCgpO1xuICAgICAgICB0aGlzLnN5bnRoZXNpemVDb25maWcoKTtcblxuICAgICAgICBpZiAocHJvamVjdCBpbnN0YW5jZW9mIGNkay5Kc2lpUHJvamVjdCB8fCBwcm9qZWN0IGluc3RhbmNlb2YgYXdzY2RrLkF3c0Nka0NvbnN0cnVjdExpYnJhcnkpIHtcbiAgICAgICAgICAgIHByb2plY3QubnBtaWdub3JlPy5hZGRQYXR0ZXJucyhcInZpdGVzdC5jb25maWcudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcHJlU3ludGhlc2l6ZSgpIHtcbiAgICAgICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMucHJvamVjdC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgSmVzdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpdGVzdCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIGplc3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW5jbHVkZShwYXR0ZXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmNsdWRlLmFkZChwYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEV4Y2x1ZGUocGF0dGVybjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhjbHVkZS5hZGQocGF0dGVybik7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVFbnZpcm9ubWVudChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgICAgICB0aGlzLnN5bnRoZXNpemVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uZmlndXJlQ292ZXJhZ2VQcm92aWRlcihwcm92aWRlcjogQ292ZXJhZ2VQcm92aWRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm92aWRlclBhY2thZ2VzID0ge1xuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuVjhdOiBgQHZpdGVzdC9jb3ZlcmFnZS12OEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuSVNUQU5CVUxdOiBgQHZpdGVzdC9jb3ZlcmFnZS1pc3RhbmJ1bEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXJQYWNrYWdlIG9mIE9iamVjdC52YWx1ZXMocHJvdmlkZXJQYWNrYWdlcykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMucmVtb3ZlRGVwZW5kZW5jeShwcm92aWRlclBhY2thZ2UpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KHByb3ZpZGVyUGFja2FnZXNbcHJvdmlkZXJdLCBEZXBlbmRlbmN5VHlwZS5ERVZFTlYpO1xuICAgICAgICB0aGlzLmNvdmVyYWdlUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUNvdmVyYWdlUmVwb3J0ZXJzKHJlcG9ydGVyczogQXJyYXk8Q292ZXJhZ2VSZXBvcnRlcj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyA9IHJlcG9ydGVycztcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUdsb2JhbHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVHNDb25maWcoKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUc0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHNjb25maWcgPSB0aGlzLnByb2plY3QudHJ5RmluZE9iamVjdEZpbGUodGhpcy50eXBlY2hlY2tUc2NvbmZpZyk7XG5cbiAgICAgICAgaWYgKCF0c2NvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGZpbmQgdHNjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0c2NvbmZpZy5hZGRUb0FycmF5KFwiY29tcGlsZXJPcHRpb25zLnR5cGVzXCIsIFwidml0ZXN0L2dsb2JhbHNcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1R5cGVzY3JpcHRQcm9qZWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmRlcHMudHJ5R2V0RGVwZW5kZW5jeShcInR5cGVzY3JpcHRcIikgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRlc3RDb21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudGVzdFRhc2suZXhlYyhcInZpdGVzdCBydW5cIiwge1xuICAgICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRlc3RXYXRjaCA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp3YXRjaFwiKTtcbiAgICAgICAgaWYgKCF0ZXN0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKFwidGVzdDp3YXRjaFwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3Qgd2F0Y2hcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVzdFVwZGF0ZVNuYXBzaG90cyA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp1cGRhdGVcIik7XG4gICAgICAgIGlmICghdGVzdFVwZGF0ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJ0ZXN0OnVwZGF0ZVwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3QgLS11cGRhdGVcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW50aGVzaXplQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudHJ5UmVtb3ZlRmlsZSh0aGlzLmNvbmZpZ0ZpbGVQYXRoKTtcblxuICAgICAgICBuZXcgVGV4dEZpbGUodGhpcywgdGhpcy5jb25maWdGaWxlUGF0aCwge1xuICAgICAgICAgICAgbGluZXM6IHRoaXMucmVuZGVyQ29uZmlnKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ29uZmlnKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIE5vZGVQcm9qZWN0O1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHByb2plY3QucGFja2FnZS5wYWNrYWdlTmFtZTtcbiAgICAgICAgY29uc3QgZGVmaW5lQ29uZmlnSW1wb3J0ID1cbiAgICAgICAgICAgIHBhY2thZ2VOYW1lID09PSBcIkBuaWtvdmlydGFsYS9wcm9qZW4tY29uc3RydWN0c1wiXG4gICAgICAgICAgICAgICAgPyAnaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7J1xuICAgICAgICAgICAgICAgIDogJ2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMvbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7JztcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZGVmaW5lQ29uZmlnSW1wb3J0LFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcIixcbiAgICAgICAgICAgIFwiICB0ZXN0OiB7XCIsXG4gICAgICAgICAgICAuLi50aGlzLnJlbmRlclRlc3RPcHRpb25zKCksXG4gICAgICAgICAgICBcIiAgfSxcIixcbiAgICAgICAgICAgIFwifSk7XCIsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJUZXN0T3B0aW9ucygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgICAgICBsaW5lcy5wdXNoKGAgICAgYmFpbDogJHt0aGlzLmJhaWx9LGApO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICAgIGNvdmVyYWdlOiB7XCIpO1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgICBlbmFibGVkOiAke3RoaXMuY292ZXJhZ2VFbmFibGVkfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgICAgcHJvdmlkZXI6IFwiJHt0aGlzLmNvdmVyYWdlUHJvdmlkZXJ9XCIsYCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAgIHJlcG9ydGVyOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY292ZXJhZ2VSZXBvcnRlcnMpfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgICAgcmVwb3J0c0RpcmVjdG9yeTogXCIke3RoaXMuY292ZXJhZ2VEaXJlY3Rvcnl9XCIsYCk7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgICAgfSxcIik7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICBlbnZpcm9ubWVudDogXCIke3RoaXMuZW52aXJvbm1lbnR9XCIsYCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICBleGNsdWRlOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5leGNsdWRlKSl9LGApO1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgZ2xvYmFsczogJHt0aGlzLmdsb2JhbHN9LGApO1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgaW5jbHVkZTogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHRoaXMuaW5jbHVkZSkpfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgIGlzb2xhdGU6ICR7dGhpcy5pc29sYXRlfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgIHBhc3NXaXRoTm9UZXN0czogJHt0aGlzLnBhc3NXaXRoTm9UZXN0c30sYCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICBwcmludENvbnNvbGVUcmFjZTogJHt0aGlzLnByaW50Q29uc29sZVRyYWNlfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgIHBvb2w6IFwiJHt0aGlzLnBvb2x9XCIsYCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICBzbG93VGVzdFRocmVzaG9sZDogJHt0aGlzLnNsb3dUZXN0VGhyZXNob2xkfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAgICB0eXBlY2hlY2s6IHtcIik7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAgIGVuYWJsZWQ6ICR7dGhpcy50eXBlY2hlY2tFbmFibGVkfSxgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgICAgY2hlY2tlcjogXCIke3RoaXMudHlwZWNoZWNrQ2hlY2tlcn1cIixgKTtcbiAgICAgICAgbGluZXMucHVzaChgICAgICAgdHNjb25maWc6IFwiJHt0aGlzLnR5cGVjaGVja1RzY29uZmlnfVwiLGApO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICAgIH0sXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgdXBkYXRlOiAke3RoaXMudXBkYXRlU25hcHNob3RzfSxgKTtcblxuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxufVxuIl19
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBa0M7QUFDbEMsbUNBQXFDO0FBQ3JDLG9EQUFpRDtBQUNqRCwwREFBeUQ7QUFDekQsc0RBQStEO0FBQy9ELGtEQUErQztBQUMvQyxvQ0FBc0Q7QUFFdEQsSUFBWSxXQTBCWDtBQTFCRCxXQUFZLFdBQVc7SUFDbkI7Ozs7T0FJRztJQUNILDRDQUE2QixDQUFBO0lBRTdCOzs7O09BSUc7SUFDSCxzQ0FBdUIsQ0FBQTtJQUV2Qjs7OztPQUlHO0lBQ0gsOEJBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtBQUNqQixDQUFDLEVBMUJXLFdBQVcsMkJBQVgsV0FBVyxRQTBCdEI7QUFFRCxJQUFZLElBbUNYO0FBbkNELFdBQVksSUFBSTtJQUNaOzs7Ozs7T0FNRztJQUNILHVCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMkJBQW1CLENBQUE7SUFFbkI7Ozs7Ozs7O09BUUc7SUFDSCwyQkFBbUIsQ0FBQTtJQUVuQjs7Ozs7T0FLRztJQUNILCtCQUF1QixDQUFBO0FBQzNCLENBQUMsRUFuQ1csSUFBSSxvQkFBSixJQUFJLFFBbUNmO0FBRUQsSUFBWSxnQkFjWDtBQWRELFdBQVksZ0JBQWdCO0lBQ3hCOzs7O09BSUc7SUFDSCx5Q0FBcUIsQ0FBQTtJQUVyQjs7OztPQUlHO0lBQ0gsNkJBQVMsQ0FBQTtBQUNiLENBQUMsRUFkVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQWMzQjtBQUVELElBQVksZ0JBeUJYO0FBekJELFdBQVksZ0JBQWdCO0lBQ3hCOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7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QixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLFNBQVMsRUFBRTtnQkFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtnQkFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQy9CLENBQUM7SUFDTixDQUFDOztBQWxPTCx3QkFtT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGF3c2NkaywgY2RrIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plbi9saWIvY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5VHlwZSB9IGZyb20gXCJwcm9qZW4vbGliL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHsgSmVzdCwgdHlwZSBOb2RlUHJvamVjdCB9IGZyb20gXCJwcm9qZW4vbGliL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSBcInByb2plbi9saWIvdGV4dGZpbGVcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSwgdHNjb25maWdEZXZQYXRoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBlbnVtIEVudmlyb25tZW50IHtcbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gVmVyY2VsJ3MgRWRnZSBSdW50aW1lIFZNLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2VkZ2UtcnVudGltZS52ZXJjZWwuYXBwL3BhY2thZ2VzL3ZtXG4gICAgICovXG4gICAgRURHRV9SVU5USU1FID0gXCJlZGdlLXJ1bnRpbWVcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBgaGFwcHktZG9tYCBlbnZpcm9ubWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NhcHJpY29ybjg2L2hhcHB5LWRvbVxuICAgICAqL1xuICAgIEhBUFBZX0RPTSA9IFwiaGFwcHktZG9tXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYGpzZG9tYCBlbnZpcm9ubWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pzZG9tL2pzZG9tXG4gICAgICovXG4gICAgSlNET00gPSBcImpzZG9tXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICAgICAqL1xuICAgIE5PREUgPSBcIm5vZGVcIixcbn1cblxuZXhwb3J0IGVudW0gUG9vbCB7XG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGBub2RlOmNoaWxkX3Byb2Nlc3NgIHVzaW5nIGZvcmsoKVxuICAgICAqXG4gICAgICogVGVzdCBpc29sYXRpb24gKHdoZW4gZW5hYmxlZCkgaXMgZG9uZSBieSBzcGF3bmluZyBhIG5ldyBjaGlsZCBwcm9jZXNzIGZvciBlYWNoIHRlc3QgZmlsZS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc2Zvcmttb2R1bGVwYXRoLWFyZ3Mtb3B0aW9uc1xuICAgICAqL1xuICAgIEZPUktTID0gXCJmb3Jrc1wiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGBub2RlOndvcmtlcl90aHJlYWRzYC5cbiAgICAgKlxuICAgICAqIFRlc3QgaXNvbGF0aW9uICh3aGVuIGVuYWJsZWQpIGlzIGRvbmUgYnkgc3Bhd25pbmcgYSBuZXcgdGhyZWFkIGZvciBlYWNoIHRlc3QgZmlsZS5cbiAgICAgKi9cbiAgICBUSFJFQURTID0gXCJ0aHJlYWRzXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gaXNvbGF0ZWQgYG5vZGU6dm1gLlxuICAgICAqXG4gICAgICogVGVzdCBmaWxlcyBhcmUgcnVuIHBhcmFsbGVsIHVzaW5nIGBub2RlOmNoaWxkX3Byb2Nlc3NgIGZvcmsoKVxuICAgICAqXG4gICAgICogVGhpcyBtYWtlcyB0ZXN0cyBydW4gZmFzdGVyLCBidXQgVk0gbW9kdWxlIGlzIHVuc3RhYmxlLiBZb3VyIHRlc3RzIG1pZ2h0IGxlYWsgbWVtb3J5LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2NoaWxkX3Byb2Nlc3MuaHRtbCNjaGlsZF9wcm9jZXNzZm9ya21vZHVsZXBhdGgtYXJncy1vcHRpb25zXG4gICAgICovXG4gICAgVk1GT1JLUyA9IFwidm1mb3Jrc1wiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGlzb2xhdGVkIGBub2RlOnZtYC5cbiAgICAgKiBUZXN0IGZpbGVzIGFyZSBydW4gcGFyYWxsZWwgdXNpbmcgYG5vZGU6d29ya2VyX3RocmVhZHNgLlxuICAgICAqXG4gICAgICogVGhpcyBtYWtlcyB0ZXN0cyBydW4gZmFzdGVyLCBidXQgVk0gbW9kdWxlIGlzIHVuc3RhYmxlLiBZb3VyIHRlc3RzIG1pZ2h0IGxlYWsgbWVtb3J5LlxuICAgICAqL1xuICAgIFZNVEhSRUFEUyA9IFwidm10aHJlYWRzXCIsXG59XG5cbmV4cG9ydCBlbnVtIENvdmVyYWdlUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgY292ZXJhZ2UgcmVwb3J0IHVzaW5nIGlzdGFuYnVsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2lzdGFuYnVsLmpzLm9yZ1xuICAgICAqL1xuICAgIElTVEFOQlVMID0gXCJpc3RhbmJ1bFwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZSBjb3ZlcmFnZSByZXBvcnRzIHVzaW5nIHY4LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3Y4LmRldi9ibG9nL2phdmFzY3JpcHQtY29kZS1jb3ZlcmFnZVxuICAgICAqL1xuICAgIFY4ID0gXCJ2OFwiLFxufVxuXG5leHBvcnQgZW51bSBDb3ZlcmFnZVJlcG9ydGVyIHtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgY2xvdmVyYCByZXBvcnQuXG4gICAgICovXG4gICAgQ0xPVkVSID0gXCJjbG92ZXJcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGBIVE1MYCByZXBvcnQuXG4gICAgICovXG4gICAgSFRNTCA9IFwiaHRtbFwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYEpTT05gIHJlcG9ydC5cbiAgICAgKi9cbiAgICBKU09OID0gXCJqc29uXCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgTENPVmAgcmVwb3J0LlxuICAgICAqL1xuICAgIExDT1YgPSBcImxjb3ZcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGB0ZXh0YCByZXBvcnQuXG4gICAgICovXG4gICAgVEVYVCA9IFwidGV4dFwiLFxufVxuXG4vKipcbiAqIFZpdGVzdCBDb25maWcuXG4gKlxuICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHRoYXQgbWF0Y2ggeW91ciB0ZXN0IGZpbGVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSBWaXRlc3QncyBgY29uZmlnRGVmYXVsdHMuaW5jbHVkZWBcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2luY2x1ZGVcbiAgICAgKi9cbiAgICByZWFkb25seSBpbmNsdWRlPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20geW91ciB0ZXN0IGZpbGVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSBWaXRlc3QncyBgY29uZmlnRGVmYXVsdHMuZXhjbHVkZWBcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2V4Y2x1ZGVcbiAgICAgKi9cbiAgICByZWFkb25seSBleGNsdWRlPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbnZpcm9ubWVudCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwibm9kZVwiXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYW4gaXNvbGF0ZWQgZW52aXJvbm1lbnQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdm1UaHJlYWRzIHBvb2wuXG4gICAgICpcbiAgICAgKiBEaXNhYmxpbmcgdGhpcyBvcHRpb24gbWlnaHQgaW1wcm92ZSBwZXJmb3JtYW5jZSBpZiB5b3VyIGNvZGUgZG9lc24ndCByZWx5IG9uIHNpZGUgZWZmZWN0cy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2lzb2xhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBpc29sYXRlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBvb2wgdXNlZCB0byBydW4gdGVzdHMgaW4uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImZvcmtzXCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3Bvb2xcbiAgICAgKi9cbiAgICByZWFkb25seSBwb29sPzogUG9vbDtcblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFwaXMgZ2xvYmFsbHkuIElmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBBUElzIGdsb2JhbGx5IGxpa2UgSmVzdCwgc2V0IHRvIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNnbG9iYWxzXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2xvYmFscz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlcmFnZSBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jY292ZXJhZ2UtZW5hYmxlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvdmVyYWdlRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlcmFnZSBwcm92aWRlciB0eXBlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJ2OFwiXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNjb3ZlcmFnZS1wcm92aWRlclxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvdmVyYWdlUHJvdmlkZXI/OiBDb3ZlcmFnZVByb3ZpZGVyO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2UgcmVwb3J0ZXJzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgJ1tcInRleHRcIiwgXCJsY292XCJdJ1xuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jY292ZXJhZ2UtcmVwb3J0ZXJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZVJlcG9ydGVycz86IEFycmF5PENvdmVyYWdlUmVwb3J0ZXI+O1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2Ugb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiY292ZXJhZ2VcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvdmVyYWdlRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHR5cGVjaGVja2luZyBhbG9uZ3NpZGUgeW91ciByZWd1bGFyIHRlc3RzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZSAoZm9yIFR5cGVTY3JpcHQgcHJvamVjdHMpXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyN0eXBlY2hlY2stZW5hYmxlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHR5cGVjaGVja0VuYWJsZWQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVG9vbCB0byB1c2UgZm9yIHR5cGUgY2hlY2tpbmcuIENoZWNrZXIgc2hvdWxkIGltcGxlbWVudCB0aGUgc2FtZSBvdXRwdXQgZm9ybWF0IGFzIGB0c2NgLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJ0c2MgLS1ub0VtaXRcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jdHlwZWNoZWNrLWNoZWNrZXJcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlY2hlY2tDaGVja2VyPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUGF0aCB0byBjdXN0b20gdHNjb25maWcsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIHRoZSBwcm9qZWN0J3MgZGV2ZWxvcG1lbnQgdHNjb25maWcgKGUuZy4gXCJ0ZXN0L3RzY29uZmlnLmpzb25cIilcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3R5cGVjaGVjay10c2NvbmZpZ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHR5cGVjaGVja1RzY29uZmlnPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVml0ZXN0IHdpbGwgbm90IGZhaWwsIGlmIG5vIHRlc3RzIHdpbGwgYmUgZm91bmQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNwYXNzd2l0aG5vdGVzdHNcbiAgICAgKi9cbiAgICByZWFkb25seSBwYXNzV2l0aE5vVGVzdHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3RvcCBydW5uaW5nIHRlc3RzIGFmdGVyIGNlcnRhaW4gbnVtYmVyIG9mIGZhaWx1cmVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jYmFpbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhaWw/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgc25hcHNob3QgZmlsZXMuIFRoaXMgd2lsbCB1cGRhdGUgYWxsIGNoYW5nZWQgc25hcHNob3RzIGFuZCBkZWxldGUgb2Jzb2xldGUgb25lcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9ndWlkZS9zbmFwc2hvdC5odG1sI3VwZGF0aW5nLXNuYXBzaG90c1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHVwZGF0ZVNuYXBzaG90cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBbHdheXMgcHJpbnQgY29uc29sZSB0cmFjZXMgd2hlbiBjYWxsaW5nIGFueSBjb25zb2xlIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvbnNvbGV0cmFjZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHByaW50Q29uc29sZVRyYWNlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGVzdCBvciBzdWl0ZSBpcyBjb25zaWRlcmVkIHNsb3cuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAzMDBcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3Nsb3d0ZXN0dGhyZXNob2xkXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2xvd1Rlc3RUaHJlc2hvbGQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml0ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ29uZmlnIGZpbGUgcGF0aC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwidml0ZXN0LmNvbmZpZy50c1wiXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uZmlnRmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsIGNvbmZpZyBvcHRpb25zLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbmZpZz86IFZpdGVzdENvbmZpZ09wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBWaXRlc3QgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiXjRcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHZpdGVzdFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGB0ZXN0YCBvcHRpb25zIGZvciBzZXR0aW5ncyB0aGF0IGBjb25maWdgIGRvZXNuJ3QgY292ZXIsIHN1Y2ggYXMgYHNldHVwRmlsZXNgIG9yIGBleHBlY3RgLlxuICAgICAqXG4gICAgICogRGVlcC1tZXJnZWQgb3ZlciB0aGUgb3B0aW9ucyBnZW5lcmF0ZWQgZnJvbSBgY29uZmlnYDogb2JqZWN0cyBhcmUgbWVyZ2VkLCBvdGhlciB2YWx1ZXMgKGluY2x1ZGluZ1xuICAgICAqIGFycmF5cykgcmVwbGFjZSB0aGUgZ2VuZXJhdGVkIHZhbHVlLiBWYWx1ZXMgYXJlIHJlbmRlcmVkIGFzIEpTT04sIHNvIHRoZXkgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZVxuICAgICAqIChubyBmdW5jdGlvbnMgb3IgcmVndWxhciBleHByZXNzaW9ucykuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSB7IHNldHVwRmlsZXM6IFtcInRlc3Qvc2V0dXAudHNcIl0sIGV4cGVjdDogeyByZXF1aXJlQXNzZXJ0aW9uczogdHJ1ZSB9IH1cbiAgICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgdGVzdCBvcHRpb25zXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnL1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4dHJhVGVzdENvbmZpZz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCB0b3AtbGV2ZWwgY29uZmlnIG9wdGlvbnMsIG5leHQgdG8gYHRlc3RgLCBzdWNoIGFzIGByZXNvbHZlYC5cbiAgICAgKlxuICAgICAqIFZhbHVlcyBhcmUgcmVuZGVyZWQgYXMgSlNPTiwgc28gdGhleSBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlIChubyBmdW5jdGlvbnMgb3IgcmVndWxhciBleHByZXNzaW9ucyxcbiAgICAgKiB3aGljaCBydWxlcyBvdXQgcGx1Z2lucykuIFVzZSBgZXh0cmFUZXN0Q29uZmlnYCBmb3IgYHRlc3RgIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSB7IHJlc29sdmU6IHsgYWxpYXM6IHsgXCJAXCI6IFwiL3NyY1wiIH0gfSB9XG4gICAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIHRvcC1sZXZlbCBvcHRpb25zXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnL1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4dHJhQ29uZmlnPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59XG5cbmV4cG9ydCBjbGFzcyBWaXRlc3QgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogTm9kZVByb2plY3QpOiBWaXRlc3QgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBpc1ZpdGVzdCA9IChjOiBDb21wb25lbnQpOiBjIGlzIFZpdGVzdCA9PiBjIGluc3RhbmNlb2YgVml0ZXN0O1xuICAgICAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbmQoaXNWaXRlc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnRmlsZVBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGU6IFNldDxzdHJpbmc+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZTogU2V0PHN0cmluZz47XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc29sYXRlOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9vbDogUG9vbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvdmVyYWdlRW5hYmxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGVjaGVja0VuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlY2hlY2tDaGVja2VyOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlY2hlY2tUc2NvbmZpZzogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFzc1dpdGhOb1Rlc3RzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFpbDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlU25hcHNob3RzOiBib29sZWFuO1xuICAgIHByaXZhdGUgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgICBwcml2YXRlIGdsb2JhbHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjb3ZlcmFnZVByb3ZpZGVyOiBDb3ZlcmFnZVByb3ZpZGVyO1xuICAgIHByaXZhdGUgY292ZXJhZ2VSZXBvcnRlcnM6IEFycmF5PENvdmVyYWdlUmVwb3J0ZXI+O1xuICAgIHByaXZhdGUgY292ZXJhZ2VEaXJlY3Rvcnk6IHN0cmluZztcbiAgICBwcml2YXRlIHZlcnNpb246IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByaW50Q29uc29sZVRyYWNlOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2xvd1Rlc3RUaHJlc2hvbGQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4dHJhVGVzdENvbmZpZzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHRyYUNvbmZpZzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBOb2RlUHJvamVjdCwgb3B0aW9uczogVml0ZXN0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4dHJhQ29uZmlnICYmIFwidGVzdFwiIGluIG9wdGlvbnMuZXh0cmFDb25maWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpdGVzdCBleHRyYUNvbmZpZyBtdXN0IG5vdCBjb250YWluIGB0ZXN0YCwgdXNlIGV4dHJhVGVzdENvbmZpZyBmb3IgdGVzdCBvcHRpb25zXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHRyYVRlc3RDb25maWcgPSBvcHRpb25zLmV4dHJhVGVzdENvbmZpZyA/PyB7fTtcbiAgICAgICAgdGhpcy5leHRyYUNvbmZpZyA9IG9wdGlvbnMuZXh0cmFDb25maWcgPz8ge307XG5cbiAgICAgICAgdGhpcy5jb25maWdGaWxlUGF0aCA9IG9wdGlvbnMuY29uZmlnRmlsZVBhdGggPz8gXCJ2aXRlc3QuY29uZmlnLnRzXCI7XG4gICAgICAgIHRoaXMuaW5jbHVkZSA9IG5ldyBTZXQob3B0aW9ucy5jb25maWc/LmluY2x1ZGUgPz8gW1wiKiovKi57dGVzdCxzcGVjfS4/KGN8bSlbanRdcz8oeClcIl0pO1xuICAgICAgICB0aGlzLmV4Y2x1ZGUgPSBuZXcgU2V0KFxuICAgICAgICAgICAgb3B0aW9ucy5jb25maWc/LmV4Y2x1ZGUgPz8gW1xuICAgICAgICAgICAgICAgIFwiKiovbm9kZV9tb2R1bGVzLyoqXCIsXG4gICAgICAgICAgICAgICAgXCIqKi9kaXN0LyoqXCIsXG4gICAgICAgICAgICAgICAgXCIqKi9jeXByZXNzLyoqXCIsXG4gICAgICAgICAgICAgICAgXCIqKi8ue2lkZWEsZ2l0LGNhY2hlLG91dHB1dCx0ZW1wfS8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiove2thcm1hLHJvbGx1cCx3ZWJwYWNrLHZpdGUsdml0ZXN0LGplc3QsYXZhLGJhYmVsLG55YyxjeXByZXNzLHRzdXAsYnVpbGQsZXNsaW50LHByZXR0aWVyfS5jb25maWcuKlwiLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc29sYXRlID0gb3B0aW9ucy5jb25maWc/Lmlzb2xhdGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5wb29sID0gb3B0aW9ucy5jb25maWc/LnBvb2wgPz8gUG9vbC5GT1JLUztcbiAgICAgICAgdGhpcy5jb3ZlcmFnZUVuYWJsZWQgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VFbmFibGVkID8/IHRydWU7XG4gICAgICAgIHRoaXMudHlwZWNoZWNrRW5hYmxlZCA9IG9wdGlvbnMuY29uZmlnPy50eXBlY2hlY2tFbmFibGVkID8/IHRoaXMuaXNUeXBlc2NyaXB0UHJvamVjdCgpO1xuICAgICAgICB0aGlzLnR5cGVjaGVja0NoZWNrZXIgPSBvcHRpb25zLmNvbmZpZz8udHlwZWNoZWNrQ2hlY2tlciA/PyBcInRzYyAtLW5vRW1pdFwiO1xuICAgICAgICB0aGlzLnR5cGVjaGVja1RzY29uZmlnID0gb3B0aW9ucy5jb25maWc/LnR5cGVjaGVja1RzY29uZmlnID8/IHRzY29uZmlnRGV2UGF0aChwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5wYXNzV2l0aE5vVGVzdHMgPSBvcHRpb25zLmNvbmZpZz8ucGFzc1dpdGhOb1Rlc3RzID8/IHRydWU7XG4gICAgICAgIHRoaXMuYmFpbCA9IG9wdGlvbnMuY29uZmlnPy5iYWlsID8/IDA7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBvcHRpb25zLmNvbmZpZz8uZW52aXJvbm1lbnQgPz8gRW52aXJvbm1lbnQuTk9ERTtcbiAgICAgICAgdGhpcy5nbG9iYWxzID0gb3B0aW9ucy5jb25maWc/Lmdsb2JhbHMgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuY292ZXJhZ2VQcm92aWRlciA9IG9wdGlvbnMuY29uZmlnPy5jb3ZlcmFnZVByb3ZpZGVyID8/IENvdmVyYWdlUHJvdmlkZXIuVjg7XG4gICAgICAgIHRoaXMuY292ZXJhZ2VSZXBvcnRlcnMgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VSZXBvcnRlcnMgPz8gW0NvdmVyYWdlUmVwb3J0ZXIuVEVYVCwgQ292ZXJhZ2VSZXBvcnRlci5MQ09WXTtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZURpcmVjdG9yeSA9IG9wdGlvbnMuY29uZmlnPy5jb3ZlcmFnZURpcmVjdG9yeSA/PyBcImNvdmVyYWdlXCI7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudml0ZXN0VmVyc2lvbiA/PyBcIl40XCI7XG4gICAgICAgIHRoaXMudXBkYXRlU25hcHNob3RzID0gb3B0aW9ucy5jb25maWc/LnVwZGF0ZVNuYXBzaG90cyA/PyB0cnVlO1xuICAgICAgICB0aGlzLnByaW50Q29uc29sZVRyYWNlID0gb3B0aW9ucy5jb25maWc/LnByaW50Q29uc29sZVRyYWNlID8/IHRydWU7XG4gICAgICAgIHRoaXMuc2xvd1Rlc3RUaHJlc2hvbGQgPSBvcHRpb25zLmNvbmZpZz8uc2xvd1Rlc3RUaHJlc2hvbGQgPz8gMzAwO1xuXG4gICAgICAgIHByb2plY3QuYWRkRGV2RGVwcyhgdml0ZXN0QCR7dGhpcy52ZXJzaW9ufWApO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZUNvdmVyYWdlUHJvdmlkZXIodGhpcy5jb3ZlcmFnZVByb3ZpZGVyKTtcblxuICAgICAgICBpZiAodGhpcy5nbG9iYWxzICYmIHRoaXMuaXNUeXBlc2NyaXB0UHJvamVjdCgpICYmIHRoaXMucHJvamVjdC50cnlGaW5kT2JqZWN0RmlsZSh0aGlzLnR5cGVjaGVja1RzY29uZmlnKSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmVHbG9iYWxzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3ZlcmFnZURpcmVjdG9yeVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oXCIvXCIsIHRoaXMuY292ZXJhZ2VEaXJlY3RvcnksIFwiL1wiKTtcbiAgICAgICAgcHJvamVjdC5ucG1pZ25vcmU/LmV4Y2x1ZGUoY292ZXJhZ2VEaXJlY3RvcnlQYXRoKTtcbiAgICAgICAgcHJvamVjdC5naXRpZ25vcmUuZXhjbHVkZShjb3ZlcmFnZURpcmVjdG9yeVBhdGgpO1xuXG4gICAgICAgIHRoaXMuYWRkVGVzdENvbW1hbmQoKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG5cbiAgICAgICAgaWYgKHByb2plY3QgaW5zdGFuY2VvZiBjZGsuSnNpaVByb2plY3QgfHwgcHJvamVjdCBpbnN0YW5jZW9mIGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5KSB7XG4gICAgICAgICAgICBwcm9qZWN0Lm5wbWlnbm9yZT8uYWRkUGF0dGVybnMoXCJ2aXRlc3QuY29uZmlnLnRzXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHByZVN5bnRoZXNpemUoKSB7XG4gICAgICAgIHN1cGVyLnByZVN5bnRoZXNpemUoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLnByb2plY3QuY29tcG9uZW50cykge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEplc3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2aXRlc3QgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBqZXN0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEluY2x1ZGUocGF0dGVybjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jbHVkZS5hZGQocGF0dGVybik7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFeGNsdWRlKHBhdHRlcm46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmV4Y2x1ZGUuYWRkKHBhdHRlcm4pO1xuICAgICAgICB0aGlzLnN5bnRoZXNpemVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uZmlndXJlRW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUNvdmVyYWdlUHJvdmlkZXIocHJvdmlkZXI6IENvdmVyYWdlUHJvdmlkZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXJQYWNrYWdlcyA9IHtcbiAgICAgICAgICAgIFtDb3ZlcmFnZVByb3ZpZGVyLlY4XTogYEB2aXRlc3QvY292ZXJhZ2UtdjhAJHt0aGlzLnZlcnNpb259YCxcbiAgICAgICAgICAgIFtDb3ZlcmFnZVByb3ZpZGVyLklTVEFOQlVMXTogYEB2aXRlc3QvY292ZXJhZ2UtaXN0YW5idWxAJHt0aGlzLnZlcnNpb259YCxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyUGFja2FnZSBvZiBPYmplY3QudmFsdWVzKHByb3ZpZGVyUGFja2FnZXMpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdC5kZXBzLnJlbW92ZURlcGVuZGVuY3kocHJvdmlkZXJQYWNrYWdlKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShwcm92aWRlclBhY2thZ2VzW3Byb3ZpZGVyXSwgRGVwZW5kZW5jeVR5cGUuREVWRU5WKTtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVDb3ZlcmFnZVJlcG9ydGVycyhyZXBvcnRlcnM6IEFycmF5PENvdmVyYWdlUmVwb3J0ZXI+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY292ZXJhZ2VSZXBvcnRlcnMgPSByZXBvcnRlcnM7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVHbG9iYWxzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVRzQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVHNDb25maWcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRzY29uZmlnID0gdGhpcy5wcm9qZWN0LnRyeUZpbmRPYmplY3RGaWxlKHRoaXMudHlwZWNoZWNrVHNjb25maWcpO1xuXG4gICAgICAgIGlmICghdHNjb25maWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBmaW5kIHRzY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHNjb25maWcuYWRkVG9BcnJheShcImNvbXBpbGVyT3B0aW9ucy50eXBlc1wiLCBcInZpdGVzdC9nbG9iYWxzXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUeXBlc2NyaXB0UHJvamVjdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdC5kZXBzLnRyeUdldERlcGVuZGVuY3koXCJ0eXBlc2NyaXB0XCIpICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUZXN0Q29tbWFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0LnRlc3RUYXNrLmV4ZWMoXCJ2aXRlc3QgcnVuXCIsIHtcbiAgICAgICAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0ZXN0V2F0Y2ggPSB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInRlc3Q6d2F0Y2hcIik7XG4gICAgICAgIGlmICghdGVzdFdhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3QuYWRkVGFzayhcInRlc3Q6d2F0Y2hcIiwge1xuICAgICAgICAgICAgICAgIGV4ZWM6IFwidml0ZXN0IHdhdGNoXCIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRlc3RVcGRhdGVTbmFwc2hvdHMgPSB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInRlc3Q6dXBkYXRlXCIpO1xuICAgICAgICBpZiAoIXRlc3RVcGRhdGVTbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKFwidGVzdDp1cGRhdGVcIiwge1xuICAgICAgICAgICAgICAgIGV4ZWM6IFwidml0ZXN0IC0tdXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3ludGhlc2l6ZUNvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0LnRyeVJlbW92ZUZpbGUodGhpcy5jb25maWdGaWxlUGF0aCk7XG5cbiAgICAgICAgbmV3IFRleHRGaWxlKHRoaXMsIHRoaXMuY29uZmlnRmlsZVBhdGgsIHtcbiAgICAgICAgICAgIGxpbmVzOiB0aGlzLnJlbmRlckNvbmZpZygpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckNvbmZpZygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdCA9IHRoaXMucHJvamVjdCBhcyBOb2RlUHJvamVjdDtcbiAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBwcm9qZWN0LnBhY2thZ2UucGFja2FnZU5hbWU7XG4gICAgICAgIGNvbnN0IGRlZmluZUNvbmZpZ0ltcG9ydCA9XG4gICAgICAgICAgICBwYWNrYWdlTmFtZSA9PT0gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHNcIlxuICAgICAgICAgICAgICAgID8gJ2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCIuL2xpYi92aXRlc3QtZGVmaW5lLWNvbmZpZ1wiOydcbiAgICAgICAgICAgICAgICA6ICdpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzL2xpYi92aXRlc3QtZGVmaW5lLWNvbmZpZ1wiOyc7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgLi4udGhpcy5leHRyYUNvbmZpZyxcbiAgICAgICAgICAgIHRlc3Q6IGRlZXBNZXJnZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odGhpcy5yZW5kZXJUZXN0T3B0aW9ucygpLCB0aGlzLmV4dHJhVGVzdENvbmZpZyksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIFtkZWZpbmVDb25maWdJbXBvcnQsIFwiXCIsIGBleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfSk7YF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJUZXN0T3B0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYWlsOiB0aGlzLmJhaWwsXG4gICAgICAgICAgICBjb3ZlcmFnZToge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuY292ZXJhZ2VFbmFibGVkLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzLmNvdmVyYWdlUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgcmVwb3J0ZXI6IHRoaXMuY292ZXJhZ2VSZXBvcnRlcnMsXG4gICAgICAgICAgICAgICAgcmVwb3J0c0RpcmVjdG9yeTogdGhpcy5jb3ZlcmFnZURpcmVjdG9yeSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgIGV4Y2x1ZGU6IEFycmF5LmZyb20odGhpcy5leGNsdWRlKSxcbiAgICAgICAgICAgIGdsb2JhbHM6IHRoaXMuZ2xvYmFscyxcbiAgICAgICAgICAgIGluY2x1ZGU6IEFycmF5LmZyb20odGhpcy5pbmNsdWRlKSxcbiAgICAgICAgICAgIGlzb2xhdGU6IHRoaXMuaXNvbGF0ZSxcbiAgICAgICAgICAgIHBhc3NXaXRoTm9UZXN0czogdGhpcy5wYXNzV2l0aE5vVGVzdHMsXG4gICAgICAgICAgICBwcmludENvbnNvbGVUcmFjZTogdGhpcy5wcmludENvbnNvbGVUcmFjZSxcbiAgICAgICAgICAgIHBvb2w6IHRoaXMucG9vbCxcbiAgICAgICAgICAgIHNsb3dUZXN0VGhyZXNob2xkOiB0aGlzLnNsb3dUZXN0VGhyZXNob2xkLFxuICAgICAgICAgICAgdHlwZWNoZWNrOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy50eXBlY2hlY2tFbmFibGVkLFxuICAgICAgICAgICAgICAgIGNoZWNrZXI6IHRoaXMudHlwZWNoZWNrQ2hlY2tlcixcbiAgICAgICAgICAgICAgICB0c2NvbmZpZzogdGhpcy50eXBlY2hlY2tUc2NvbmZpZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IHRoaXMudXBkYXRlU25hcHNob3RzLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -428,7 +428,7 @@ class TypeScriptClassRenderer {
428
428
  */
429
429
  class ProjectGenerator extends projen.Component {
430
430
  options;
431
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.78" };
431
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.79" };
432
432
  renderer;
433
433
  static enumGenerated = false;
434
434
  /**
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class AwsCdkConstructLibraryProject extends projen_1.awscdk.AwsCdkConstructLibrary {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.3.78" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.3.79" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class AwsCdkTypeScriptAppProject extends projen_1.awscdk.AwsCdkTypeScriptApp {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.3.78" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.3.79" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
@@ -16,7 +16,7 @@ const utils_1 = require("../utils");
16
16
  * Extends Projen's base class with opinionated defaults and automatic component setup.
17
17
  */
18
18
  class JsiiProject extends projen_1.cdk.JsiiProject {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.3.78" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.3.79" };
20
20
  /**
21
21
  * @param options - Project configuration
22
22
  */
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class TypeScriptProject extends projen_1.typescript.TypeScriptProject {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.3.78" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.3.79" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
package/package.json CHANGED
@@ -60,7 +60,7 @@
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
- "version": "0.3.78",
63
+ "version": "0.3.79",
64
64
  "types": "lib/index.d.ts",
65
65
  "jsii": {
66
66
  "outdir": "dist",