@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +15 -1
- package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/index/package.json +6 -0
- package/bundlers/esbuild-impl/package.json +6 -0
- package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
- package/bundlers/index/package.json +6 -0
- package/bundlers/package.json +6 -0
- package/dist/lib/cjs/build.cjs +191 -0
- package/dist/lib/cjs/build.d.cts +59 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/index.cjs +99 -0
- package/dist/lib/cjs/bundlers/index.d.cts +2 -0
- package/dist/lib/cjs/check-project-types.cjs +163 -0
- package/dist/lib/cjs/check-project-types.d.cts +92 -0
- package/dist/lib/cjs/cli-utils.cjs +276 -0
- package/dist/lib/cjs/cli-utils.d.cts +123 -0
- package/dist/lib/cjs/code-generator.cjs +96 -0
- package/dist/lib/cjs/code-generator.d.cts +14 -0
- package/dist/lib/cjs/commitlint-config.cjs +110 -0
- package/dist/lib/cjs/commitlint-config.d.cts +14 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
- package/dist/lib/cjs/env-toggle.cjs +133 -0
- package/dist/lib/cjs/env-toggle.d.cts +42 -0
- package/dist/lib/cjs/exec.cjs +455 -0
- package/dist/lib/cjs/exec.d.cts +162 -0
- package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
- package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
- package/dist/lib/cjs/formatters/dprint.cjs +108 -0
- package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
- package/dist/lib/cjs/formatters/index.cjs +99 -0
- package/dist/lib/cjs/formatters/index.d.cts +2 -0
- package/dist/lib/cjs/fs.cjs +123 -0
- package/dist/lib/cjs/fs.d.cts +80 -0
- package/dist/lib/cjs/gate.cjs +140 -0
- package/dist/lib/cjs/gate.d.cts +93 -0
- package/dist/lib/cjs/git.cjs +109 -0
- package/dist/lib/cjs/git.d.cts +37 -0
- package/dist/lib/cjs/index.cjs +186 -0
- package/dist/lib/cjs/index.d.cts +35 -0
- package/dist/lib/cjs/json.cjs +141 -0
- package/dist/lib/cjs/json.d.cts +102 -0
- package/dist/lib/cjs/library-build.cjs +483 -0
- package/dist/lib/cjs/library-build.d.cts +101 -0
- package/dist/lib/cjs/library-references.d.cts +5 -0
- package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
- package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
- package/dist/lib/cjs/linters/cspell.cjs +103 -0
- package/dist/lib/cjs/linters/cspell.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
- package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
- package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
- package/dist/lib/cjs/linters/eslint.cjs +196 -0
- package/dist/lib/cjs/linters/eslint.d.cts +74 -0
- package/dist/lib/cjs/linters/index.cjs +138 -0
- package/dist/lib/cjs/linters/index.d.cts +15 -0
- package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
- package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
- package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
- package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
- package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
- package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
- package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
- package/dist/lib/cjs/nano-staged-config.cjs +148 -0
- package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
- package/dist/lib/cjs/npm-publish.cjs +93 -0
- package/dist/lib/cjs/npm-publish.d.cts +19 -0
- package/dist/lib/cjs/npm-run.cjs +120 -0
- package/dist/lib/cjs/npm-run.d.cts +34 -0
- package/dist/lib/cjs/npm.cjs +200 -0
- package/dist/lib/cjs/npm.d.cts +168 -0
- package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
- package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
- package/dist/lib/cjs/package-manager.cjs +291 -0
- package/dist/lib/cjs/package-manager.d.cts +93 -0
- package/dist/lib/cjs/released-issues.cjs +178 -0
- package/dist/lib/cjs/released-issues.d.cts +79 -0
- package/dist/lib/cjs/repo-paths.cjs +167 -0
- package/dist/lib/cjs/repo-paths.d.cts +318 -0
- package/dist/lib/cjs/root.cjs +150 -0
- package/dist/lib/cjs/root.d.cts +107 -0
- package/dist/lib/cjs/test-runners/index.cjs +102 -0
- package/dist/lib/cjs/test-runners/index.d.cts +3 -0
- package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
- package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
- package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
- package/dist/lib/cjs/validate-declarations.cjs +120 -0
- package/dist/lib/cjs/validate-declarations.d.cts +37 -0
- package/dist/lib/cjs/version.cjs +758 -0
- package/dist/lib/cjs/version.d.cts +418 -0
- package/dist/lib/esm/build.d.mts +59 -0
- package/dist/lib/esm/build.mjs +165 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
- package/dist/lib/esm/bundlers/index.d.mts +2 -0
- package/dist/lib/esm/bundlers/index.mjs +52 -0
- package/dist/lib/esm/check-project-types.d.mts +92 -0
- package/dist/lib/esm/check-project-types.mjs +123 -0
- package/dist/lib/esm/cli-utils.d.mts +123 -0
- package/dist/lib/esm/cli-utils.mjs +225 -0
- package/dist/lib/esm/code-generator.d.mts +14 -0
- package/dist/lib/esm/code-generator.mjs +59 -0
- package/dist/lib/esm/commitlint-config.d.mts +14 -0
- package/dist/lib/esm/commitlint-config.mjs +79 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
- package/dist/lib/esm/env-toggle.d.mts +42 -0
- package/dist/lib/esm/env-toggle.mjs +84 -0
- package/dist/lib/esm/exec.d.mts +162 -0
- package/dist/lib/esm/exec.mjs +410 -0
- package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
- package/dist/lib/esm/forbidden-patterns.mjs +108 -0
- package/dist/lib/esm/formatters/dprint.d.mts +33 -0
- package/dist/lib/esm/formatters/dprint.mjs +75 -0
- package/dist/lib/esm/formatters/index.d.mts +2 -0
- package/dist/lib/esm/formatters/index.mjs +52 -0
- package/dist/lib/esm/fs.d.mts +80 -0
- package/dist/lib/esm/fs.mjs +89 -0
- package/dist/lib/esm/gate.d.mts +93 -0
- package/dist/lib/esm/gate.mjs +106 -0
- package/dist/lib/esm/git.d.mts +37 -0
- package/dist/lib/esm/git.mjs +72 -0
- package/dist/lib/esm/index.d.mts +35 -0
- package/dist/lib/esm/index.mjs +110 -0
- package/dist/lib/esm/json.d.mts +102 -0
- package/dist/lib/esm/json.mjs +106 -0
- package/dist/lib/esm/library-build.d.mts +101 -0
- package/dist/lib/esm/library-build.mjs +443 -0
- package/dist/lib/esm/library-references.d.mts +5 -0
- package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
- package/dist/lib/esm/linters/cspell-content.mjs +87 -0
- package/dist/lib/esm/linters/cspell.d.mts +36 -0
- package/dist/lib/esm/linters/cspell.mjs +69 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
- package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
- package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
- package/dist/lib/esm/linters/eslint.d.mts +74 -0
- package/dist/lib/esm/linters/eslint.mjs +159 -0
- package/dist/lib/esm/linters/index.d.mts +15 -0
- package/dist/lib/esm/linters/index.mjs +78 -0
- package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
- package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
- package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
- package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
- package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
- package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint.mjs +124 -0
- package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
- package/dist/lib/esm/linters/over-exposure.mjs +672 -0
- package/dist/lib/esm/nano-staged-config.d.mts +54 -0
- package/dist/lib/esm/nano-staged-config.mjs +103 -0
- package/dist/lib/esm/npm-publish.d.mts +19 -0
- package/dist/lib/esm/npm-publish.mjs +56 -0
- package/dist/lib/esm/npm-run.d.mts +34 -0
- package/dist/lib/esm/npm-run.mjs +81 -0
- package/dist/lib/esm/npm.d.mts +168 -0
- package/dist/lib/esm/npm.mjs +155 -0
- package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
- package/dist/lib/esm/package-lock-integrity.mjs +99 -0
- package/dist/lib/esm/package-manager.d.mts +93 -0
- package/dist/lib/esm/package-manager.mjs +245 -0
- package/dist/lib/esm/released-issues.d.mts +79 -0
- package/dist/lib/esm/released-issues.mjs +143 -0
- package/dist/lib/esm/repo-paths.d.mts +318 -0
- package/dist/lib/esm/repo-paths.mjs +130 -0
- package/dist/lib/esm/root.d.mts +107 -0
- package/dist/lib/esm/root.mjs +115 -0
- package/dist/lib/esm/test-runners/index.d.mts +3 -0
- package/dist/lib/esm/test-runners/index.mjs +54 -0
- package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
- package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
- package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
- package/dist/lib/esm/test-runners/vitest.mjs +76 -0
- package/dist/lib/esm/validate-declarations.d.mts +37 -0
- package/dist/lib/esm/validate-declarations.mjs +87 -0
- package/dist/lib/esm/version.d.mts +418 -0
- package/dist/lib/esm/version.mjs +723 -0
- package/formatters/dprint/package.json +6 -0
- package/formatters/index/package.json +6 -0
- package/formatters/package.json +6 -0
- package/linters/cspell/package.json +6 -0
- package/linters/cspell-content/package.json +6 -0
- package/linters/eslint/package.json +6 -0
- package/linters/eslint-agnostic-core-boundary/package.json +6 -0
- package/linters/eslint-config/package.json +6 -0
- package/linters/eslint-no-restricted-syntax/package.json +6 -0
- package/linters/eslint-rules/in-house-plugin/package.json +6 -0
- package/linters/eslint-rules/index/package.json +6 -0
- package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
- package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
- package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
- package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
- package/linters/eslint-rules/package.json +6 -0
- package/linters/eslint-rules/params-options-name-match/package.json +6 -0
- package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
- package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
- package/linters/eslint-rules/require-method-template/package.json +6 -0
- package/linters/eslint-rules/require-super-call/package.json +6 -0
- package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
- package/linters/eslint-rules/ts-estree-node/package.json +6 -0
- package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
- package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
- package/linters/index/package.json +6 -0
- package/linters/lint-ignores/package.json +6 -0
- package/linters/markdownlint/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-content/package.json +6 -0
- package/linters/markdownlint-ignores/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
- package/linters/over-exposure/package.json +6 -0
- package/linters/package.json +6 -0
- package/package.json +329 -13
- package/test-runners/index/package.json +6 -0
- package/test-runners/package.json +6 -0
- package/test-runners/vitest/package.json +6 -0
- package/test-runners/vitest-config/package.json +6 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The build pipeline of a TypeScript LIBRARY package: one `dist/lib/{cjs,esm}` tree of unbundled modules beside its
|
|
6
|
+
* `.d.cts` / `.d.mts` declarations, the generated `index.ts` barrels, and the generated `package.json` `exports` map.
|
|
7
|
+
*
|
|
8
|
+
* Each step works on the current working folder, which is the package being built. A repository's
|
|
9
|
+
* `scripts/build-*.ts` entry points are thin `wrapCliTask` wrappers around these functions, and its `build` script
|
|
10
|
+
* runs them in order through {@link runBuildSteps}.
|
|
11
|
+
*/
|
|
12
|
+
import type { Plugin } from 'esbuild';
|
|
13
|
+
/**
|
|
14
|
+
* The banner every emitted library module opens with.
|
|
15
|
+
*/
|
|
16
|
+
export declare const LIBRARY_BANNER = "/*\nTHIS IS A GENERATED/BUNDLED FILE BY ESBUILD\nif you want to view the source, please visit the github repository of this plugin\n*/\n";
|
|
17
|
+
/**
|
|
18
|
+
* The steps of a library build, in the order {@link runBuildSteps} runs them.
|
|
19
|
+
*/
|
|
20
|
+
export declare const LIBRARY_BUILD_STEPS: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* The export condition the `obsidian-dev-utils` workspace maps every subpath onto its TypeScript source with, so a
|
|
23
|
+
* package there can import a sibling package's source before anything is built. Pass it to
|
|
24
|
+
* {@link generateLibraryExports} through {@link GenerateLibraryExportsOptions.sourceCondition}.
|
|
25
|
+
*/
|
|
26
|
+
export declare const SOURCE_CONDITION = "@mnaoumov/source";
|
|
27
|
+
/**
|
|
28
|
+
* Options for {@link buildLibrary}.
|
|
29
|
+
*/
|
|
30
|
+
export interface BuildLibraryOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Creates the preprocess plugin for one output format. Defaults to the generic one, which carries no
|
|
33
|
+
* environment-specific `require` patch.
|
|
34
|
+
*/
|
|
35
|
+
readonly preprocessPluginFactory?: (isEsm: boolean) => Plugin;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for {@link generateLibraryExports}.
|
|
39
|
+
*/
|
|
40
|
+
export interface GenerateLibraryExportsOptions {
|
|
41
|
+
/**
|
|
42
|
+
* An export condition to put first in every entry, mapping the subpath onto its TypeScript source. Only a
|
|
43
|
+
* repository holding several packages that import each other needs one; nothing outside it sets the condition, and
|
|
44
|
+
* the sources it points at do not ship, so the publish has to strip it again. Omitted, the map has none.
|
|
45
|
+
*/
|
|
46
|
+
readonly sourceCondition?: string | undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Removes everything an earlier build left: `dist/`, the generated `index.ts` barrels, the `.d.ts` files `tsc` wrote
|
|
50
|
+
* beside the sources (hand-authored ones under `@types` stay), and the per-subpath `package.json` stubs.
|
|
51
|
+
*
|
|
52
|
+
* @returns A {@link Promise} that resolves when everything has been removed.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildCleanLibrary(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Builds every source module, unbundled, into `dist/lib/cjs` (`.cjs`) and `dist/lib/esm` (`.mjs`).
|
|
57
|
+
*
|
|
58
|
+
* The output folders must already exist; {@link buildLibraryTypes} creates them.
|
|
59
|
+
*
|
|
60
|
+
* @param options - The build options.
|
|
61
|
+
* @returns A {@link Promise} that resolves when both formats have been built.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildLibrary(options?: BuildLibraryOptions): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Emits the declarations with `tsc --project ./tsconfig.types.json`, then copies each one into `dist/lib` twice: as a
|
|
66
|
+
* `.d.cts` whose relative imports name `.cjs` files and whose bare type imports carry `resolution-mode: import`, and
|
|
67
|
+
* as a `.d.mts` whose relative imports name `.mjs` files.
|
|
68
|
+
*
|
|
69
|
+
* The library's root declaration (`library.ts` where the package has one, otherwise the generated `index.ts`) carries
|
|
70
|
+
* every `lib` and `types` reference the package needs, and so does a `library-references` declaration beside it that
|
|
71
|
+
* carries nothing else. Every other declaration references that one by path, never the root: the root barrel
|
|
72
|
+
* re-exports every module, so referencing it made each subpath load the whole package, and a consumer type-checking
|
|
73
|
+
* with `skipLibCheck: false` then needed every optional peer installed.
|
|
74
|
+
*
|
|
75
|
+
* @returns A {@link Promise} that resolves when the declarations have been written.
|
|
76
|
+
* @throws If a source module is named `library-references`, which would collide with the generated declaration.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildLibraryTypes(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Regenerates the `exports` map of the package's `package.json` from its source folders, and writes a `package.json`
|
|
81
|
+
* stub per subpath for resolvers that do not read `exports`.
|
|
82
|
+
*
|
|
83
|
+
* @param options - The {@link GenerateLibraryExportsOptions}.
|
|
84
|
+
* @returns A {@link Promise} that resolves when the map is current.
|
|
85
|
+
* @throws If the map changed, so the change gets reviewed and committed rather than shipped unseen.
|
|
86
|
+
*/
|
|
87
|
+
export declare function generateLibraryExports(options?: GenerateLibraryExportsOptions): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Generates an `index.ts` barrel in every source folder that has something to export, re-exporting each module and
|
|
90
|
+
* each sub-barrel under its own name.
|
|
91
|
+
*
|
|
92
|
+
* @returns A {@link Promise} that resolves when the barrels have been written.
|
|
93
|
+
*/
|
|
94
|
+
export declare function generateLibraryIndex(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Runs each named npm script the package defines, in order, skipping the ones it does not define.
|
|
97
|
+
*
|
|
98
|
+
* @param steps - The npm script names.
|
|
99
|
+
* @returns A {@link Promise} that resolves when every step has run.
|
|
100
|
+
*/
|
|
101
|
+
export declare function runBuildSteps(steps?: readonly string[]): Promise<void>;
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const existingProcess = globalThis.process;
|
|
23
|
+
|
|
24
|
+
if (!existingProcess) {
|
|
25
|
+
globalThis.process = browserProcess;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (existingProcess.versions?.node) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const existingProcessRecord = existingProcess;
|
|
34
|
+
|
|
35
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
36
|
+
existingProcessRecord[key] ??= value;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
existingProcessRecord['browser'] = true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
(function initEsm() {
|
|
43
|
+
ensureDisposeSymbols();
|
|
44
|
+
ensureBrowserProcess();
|
|
45
|
+
})();
|
|
46
|
+
})();
|
|
47
|
+
|
|
48
|
+
import { asyncMap } from "@mnaoumov/typescript-lib/async";
|
|
49
|
+
import { isDeepEqual } from "@mnaoumov/typescript-lib/object-utils";
|
|
50
|
+
import {
|
|
51
|
+
basename,
|
|
52
|
+
dirname,
|
|
53
|
+
extname,
|
|
54
|
+
join,
|
|
55
|
+
normalizeIfRelative,
|
|
56
|
+
relative
|
|
57
|
+
} from "@mnaoumov/typescript-lib/path";
|
|
58
|
+
import { replaceAll } from "@mnaoumov/typescript-lib/string";
|
|
59
|
+
import { context } from "esbuild";
|
|
60
|
+
import {
|
|
61
|
+
existsSync,
|
|
62
|
+
readFileSync
|
|
63
|
+
} from "node:fs";
|
|
64
|
+
import {
|
|
65
|
+
mkdir,
|
|
66
|
+
readFile,
|
|
67
|
+
rm,
|
|
68
|
+
writeFile
|
|
69
|
+
} from "node:fs/promises";
|
|
70
|
+
import { relative as relativeNative } from "node:path";
|
|
71
|
+
import process from "node:process";
|
|
72
|
+
import { buildClean } from "./build.mjs";
|
|
73
|
+
import { changeExtensionPlugin } from "./bundlers/esbuild-impl/change-extension-plugin.mjs";
|
|
74
|
+
import { fixEsmPlugin } from "./bundlers/esbuild-impl/fix-esm-plugin.mjs";
|
|
75
|
+
import { preprocessPlugin } from "./bundlers/esbuild-impl/preprocess-plugin.mjs";
|
|
76
|
+
import { parseTsConfig } from "./check-project-types.mjs";
|
|
77
|
+
import { generate } from "./code-generator.mjs";
|
|
78
|
+
import { readdirPosix } from "./fs.mjs";
|
|
79
|
+
import { writeJson } from "./json.mjs";
|
|
80
|
+
import { npmRunOptional } from "./npm-run.mjs";
|
|
81
|
+
import { editPackageJson } from "./npm.mjs";
|
|
82
|
+
import { resolveToolCommand } from "./package-manager.mjs";
|
|
83
|
+
import { RepoPaths } from "./repo-paths.mjs";
|
|
84
|
+
import { execFromRoot } from "./root.mjs";
|
|
85
|
+
const LIBRARY_BANNER = `/*
|
|
86
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
87
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
88
|
+
*/
|
|
89
|
+
`;
|
|
90
|
+
const LIBRARY_BUILD_STEPS = [
|
|
91
|
+
"build:clean",
|
|
92
|
+
"build:generate-index",
|
|
93
|
+
"build:compile",
|
|
94
|
+
"build:types",
|
|
95
|
+
"build:validate-declarations",
|
|
96
|
+
"build:lib",
|
|
97
|
+
"build:generate-exports"
|
|
98
|
+
];
|
|
99
|
+
const SOURCE_CONDITION = "@mnaoumov/source";
|
|
100
|
+
const DECLARATION_REFERENCE_TYPES = /* @__PURE__ */ new Set(["node"]);
|
|
101
|
+
const LIBRARY_REFERENCES_FILE_NAME = "library-references";
|
|
102
|
+
const REFERENCE_LIB_DIRECTIVE = ["<reference", "lib="].join(" ");
|
|
103
|
+
const REFERENCE_LIB_REG_EXP = /\/\/\/ <reference lib="(?<Lib>[^"]+)" \/>/gm;
|
|
104
|
+
const BARE_TYPE_IMPORT_REG_EXP = /^import type (?<Clause>.+?) from '(?<Specifier>[^.'][^']*)';$/gm;
|
|
105
|
+
const BARE_INLINE_IMPORT_TYPE_REG_EXP = /import\("(?<Specifier>[^."][^"]*)"\)/g;
|
|
106
|
+
const STATIC_IMPORT_REG_EXP = /from '(?<ImportPath>.+?)\.ts';/gm;
|
|
107
|
+
const DYNAMIC_IMPORT_REG_EXP = /import\((?<Quote>['"])(?<ImportPath>.+?)\.ts\k<Quote>\)/gm;
|
|
108
|
+
async function buildCleanLibrary() {
|
|
109
|
+
await buildClean();
|
|
110
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
111
|
+
if (basename(file) === RepoPaths.IndexTs) {
|
|
112
|
+
await rm(join(RepoPaths.Src, file));
|
|
113
|
+
}
|
|
114
|
+
if (file.endsWith(RepoPaths.DtsExtension) && !file.split("/").includes(RepoPaths.Types)) {
|
|
115
|
+
await rm(join(RepoPaths.Src, file));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
for (const file of await readdirPosix(RepoPaths.CurrentFolder, { recursive: true })) {
|
|
119
|
+
if (basename(file) !== RepoPaths.PackageJson || file === RepoPaths.PackageJson || file.startsWith(RepoPaths.NodeModules)) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
await rm(file);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function buildLibrary(options = {}) {
|
|
126
|
+
const { preprocessPluginFactory = (isEsm) => preprocessPlugin({ isEsm }) } = options;
|
|
127
|
+
const libFiles = await getLibFiles();
|
|
128
|
+
await buildLibraryFormat({ format: "cjs", libFiles, preprocessPluginFactory });
|
|
129
|
+
await buildLibraryFormat({ format: "esm", libFiles, preprocessPluginFactory });
|
|
130
|
+
}
|
|
131
|
+
async function buildLibraryTypes() {
|
|
132
|
+
if (existsSync(join(RepoPaths.Src, `${LIBRARY_REFERENCES_FILE_NAME}${RepoPaths.TsExtension}`))) {
|
|
133
|
+
throw new Error(`src/${LIBRARY_REFERENCES_FILE_NAME}${RepoPaths.TsExtension} collides with the generated declaration of the same name.`);
|
|
134
|
+
}
|
|
135
|
+
await execFromRoot([...resolveToolCommand({ tool: "tsc" }), "--project", "./tsconfig.types.json"]);
|
|
136
|
+
const libraryFileName = existsSync(join(RepoPaths.Src, "library.ts")) ? "library" : "index";
|
|
137
|
+
const allLibs = await collectAllLibs();
|
|
138
|
+
const allTypes = collectAllTypes();
|
|
139
|
+
const directives = buildAllReferenceLibDirectives(allLibs) + buildAllReferenceTypesDirectives(allTypes);
|
|
140
|
+
await mkdir(join(RepoPaths.DistLib, RepoPaths.Cjs), { recursive: true });
|
|
141
|
+
await mkdir(join(RepoPaths.DistLib, RepoPaths.Esm), { recursive: true });
|
|
142
|
+
await writeFile(join(RepoPaths.DistLib, RepoPaths.Cjs, LIBRARY_REFERENCES_FILE_NAME + RepoPaths.DctsExtension), directives);
|
|
143
|
+
await writeFile(join(RepoPaths.DistLib, RepoPaths.Esm, LIBRARY_REFERENCES_FILE_NAME + RepoPaths.DmtsExtension), directives);
|
|
144
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
145
|
+
if (!file.endsWith(RepoPaths.DtsExtension) || file.startsWith(RepoPaths.TestHelpers)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const folder = dirname(file);
|
|
149
|
+
const name = basename(file, RepoPaths.DtsExtension);
|
|
150
|
+
const content = await readFile(join(RepoPaths.Src, file), "utf-8");
|
|
151
|
+
const ctsPath = join(RepoPaths.DistLib, RepoPaths.Cjs, folder, name + RepoPaths.DctsExtension);
|
|
152
|
+
const mtsPath = join(RepoPaths.DistLib, RepoPaths.Esm, folder, name + RepoPaths.DmtsExtension);
|
|
153
|
+
await mkdir(dirname(ctsPath), { recursive: true });
|
|
154
|
+
await mkdir(dirname(mtsPath), { recursive: true });
|
|
155
|
+
let ctsContent = toCtsContent(content);
|
|
156
|
+
let mtsContent = toMtsContent(content);
|
|
157
|
+
if (name === libraryFileName && folder === ".") {
|
|
158
|
+
ctsContent = directives + ctsContent;
|
|
159
|
+
mtsContent = directives + mtsContent;
|
|
160
|
+
} else {
|
|
161
|
+
ctsContent = buildReferencePathDirective({ declarationFilePath: ctsPath, extension: RepoPaths.DctsExtension, moduleDirectory: RepoPaths.Cjs }) + ctsContent;
|
|
162
|
+
mtsContent = buildReferencePathDirective({ declarationFilePath: mtsPath, extension: RepoPaths.DmtsExtension, moduleDirectory: RepoPaths.Esm }) + mtsContent;
|
|
163
|
+
}
|
|
164
|
+
await writeFile(ctsPath, ctsContent);
|
|
165
|
+
await writeFile(mtsPath, mtsContent);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function generateLibraryExports(options = {}) {
|
|
169
|
+
const { sourceCondition } = options;
|
|
170
|
+
const srcFolders = [RepoPaths.Src];
|
|
171
|
+
for (const dirent of await readdirPosix(RepoPaths.Src, { recursive: true, withFileTypes: true })) {
|
|
172
|
+
if (!dirent.isDirectory()) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const path = join(dirent.parentPath, dirent.name);
|
|
176
|
+
if (path.includes(RepoPaths.Styles) || path.includes(RepoPaths.TestHelpers)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
srcFolders.push(path);
|
|
180
|
+
}
|
|
181
|
+
srcFolders.sort();
|
|
182
|
+
let isChanged = false;
|
|
183
|
+
await editPackageJson(async (packageJson) => {
|
|
184
|
+
const oldExports = packageJson.exports;
|
|
185
|
+
const exportConditions = {};
|
|
186
|
+
packageJson.exports = exportConditions;
|
|
187
|
+
for (const srcFolder of srcFolders) {
|
|
188
|
+
await setExport({ exportConditions, isWildcard: false, sourceCondition, srcFolder });
|
|
189
|
+
await setExport({ exportConditions, isWildcard: true, sourceCondition, srcFolder });
|
|
190
|
+
}
|
|
191
|
+
isChanged = !isDeepEqual(oldExports, packageJson.exports);
|
|
192
|
+
});
|
|
193
|
+
if (isChanged) {
|
|
194
|
+
throw new Error("Package exports have changed. Please review the changes and commit them.");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function generateLibraryIndex() {
|
|
198
|
+
await generateIndex(RepoPaths.Src);
|
|
199
|
+
}
|
|
200
|
+
async function runBuildSteps(steps = LIBRARY_BUILD_STEPS) {
|
|
201
|
+
for (const step of steps) {
|
|
202
|
+
await npmRunOptional(step);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function buildAllReferenceLibDirectives(libs) {
|
|
206
|
+
return `${libs.map((lib) => `/// ${REFERENCE_LIB_DIRECTIVE}"${lib}" />`).join("\n")}
|
|
207
|
+
`;
|
|
208
|
+
}
|
|
209
|
+
function buildAllReferenceTypesDirectives(types) {
|
|
210
|
+
return types.length === 0 ? "" : `${types.map((type) => `/// <reference types="${type}" />`).join("\n")}
|
|
211
|
+
`;
|
|
212
|
+
}
|
|
213
|
+
async function buildLibraryFormat(params) {
|
|
214
|
+
const { format, libFiles, preprocessPluginFactory } = params;
|
|
215
|
+
const extension = format === "cjs" ? RepoPaths.CjsExtension : RepoPaths.MjsExtension;
|
|
216
|
+
const buildOptions = {
|
|
217
|
+
// Explicit, because esbuild otherwise takes the folder its service process started in.
|
|
218
|
+
// eslint-disable-next-line unicorn/name-replacements -- esbuild's own option name.
|
|
219
|
+
absWorkingDir: process.cwd(),
|
|
220
|
+
banner: {
|
|
221
|
+
js: LIBRARY_BANNER
|
|
222
|
+
},
|
|
223
|
+
bundle: false,
|
|
224
|
+
entryPoints: libFiles,
|
|
225
|
+
format,
|
|
226
|
+
logLevel: "info",
|
|
227
|
+
outdir: join(RepoPaths.DistLib, format),
|
|
228
|
+
platform: "node",
|
|
229
|
+
plugins: [
|
|
230
|
+
preprocessPluginFactory(format === "esm"),
|
|
231
|
+
fixEsmPlugin(),
|
|
232
|
+
changeExtensionPlugin(extension)
|
|
233
|
+
],
|
|
234
|
+
sourcemap: "inline",
|
|
235
|
+
target: "ES2022",
|
|
236
|
+
treeShaking: true,
|
|
237
|
+
write: false
|
|
238
|
+
};
|
|
239
|
+
const buildContext = await context(buildOptions);
|
|
240
|
+
try {
|
|
241
|
+
await buildContext.rebuild();
|
|
242
|
+
} finally {
|
|
243
|
+
await buildContext.dispose();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function buildReferencePathDirective(params) {
|
|
247
|
+
const { declarationFilePath, extension, moduleDirectory } = params;
|
|
248
|
+
const libraryFilePath = join(RepoPaths.DistLib, moduleDirectory, LIBRARY_REFERENCES_FILE_NAME + extension);
|
|
249
|
+
let relativePath = relativeNative(dirname(declarationFilePath), libraryFilePath).replaceAll("\\", "/");
|
|
250
|
+
if (!relativePath.startsWith(".")) {
|
|
251
|
+
relativePath = `./${relativePath}`;
|
|
252
|
+
}
|
|
253
|
+
return `/// <reference path="${relativePath}" />
|
|
254
|
+
`;
|
|
255
|
+
}
|
|
256
|
+
async function collectAllLibs() {
|
|
257
|
+
const { options } = parseTsConfig(RepoPaths.TsConfigJson);
|
|
258
|
+
const libs = new Set((options.lib ?? []).map((lib) => lib.toLowerCase().replace(/^lib\./, "").replace(/\.d\.ts$/, "")));
|
|
259
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
260
|
+
if (!file.endsWith(".ts")) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const sourceContent = readFileSync(join(RepoPaths.Src, file), "utf-8");
|
|
264
|
+
for (const [, lib] of sourceContent.matchAll(REFERENCE_LIB_REG_EXP)) {
|
|
265
|
+
libs.add(String(lib).toLowerCase());
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return [...libs].sort();
|
|
269
|
+
}
|
|
270
|
+
function collectAllTypes() {
|
|
271
|
+
const { options } = parseTsConfig(RepoPaths.TsConfigJson);
|
|
272
|
+
return (options.types ?? []).filter((type) => DECLARATION_REFERENCE_TYPES.has(type)).sort();
|
|
273
|
+
}
|
|
274
|
+
async function generateIndex(folder) {
|
|
275
|
+
const dirents = await readdirPosix(folder, { withFileTypes: true });
|
|
276
|
+
const maybeLines = await asyncMap(dirents, (dirent) => handleIndexDirent(folder, dirent));
|
|
277
|
+
const lines = maybeLines.filter((line) => line !== void 0);
|
|
278
|
+
if (lines.length === 0) {
|
|
279
|
+
return "skipped" /* Skipped */;
|
|
280
|
+
}
|
|
281
|
+
await generate(join(folder, RepoPaths.IndexTs), lines);
|
|
282
|
+
return "success" /* Success */;
|
|
283
|
+
}
|
|
284
|
+
async function getLibFiles() {
|
|
285
|
+
let files = await readdirPosix(RepoPaths.Src, { recursive: true });
|
|
286
|
+
files = files.map((file) => normalizeIfRelative(join(RepoPaths.Src, file)));
|
|
287
|
+
return files.filter(
|
|
288
|
+
(file) => file.endsWith(RepoPaths.TsExtension) && !file.endsWith(RepoPaths.DtsExtension) && !file.endsWith(".test.ts") && !file.includes(`/${RepoPaths.TestHelpers}/`)
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
async function handleIndexDirent(folder, dirent) {
|
|
292
|
+
if (isExcludedFromIndex(folder, dirent)) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
let sourceFile;
|
|
296
|
+
let name;
|
|
297
|
+
if (dirent.isDirectory()) {
|
|
298
|
+
const result = await generateIndex(join(folder, dirent.name));
|
|
299
|
+
if (result !== "success" /* Success */) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
sourceFile = normalizeIfRelative(join(dirent.name, RepoPaths.IndexTs));
|
|
303
|
+
name = dirent.name;
|
|
304
|
+
} else {
|
|
305
|
+
const extension = extname(dirent.name);
|
|
306
|
+
name = basename(dirent.name, extension);
|
|
307
|
+
sourceFile = normalizeIfRelative(dirent.name);
|
|
308
|
+
}
|
|
309
|
+
return `export * as '${name}' from '${sourceFile}';`;
|
|
310
|
+
}
|
|
311
|
+
function isExcludedFileName(name) {
|
|
312
|
+
return !name.endsWith(RepoPaths.TsExtension) || name.endsWith(".test.ts") || name === "setup.ts" || name.endsWith("-setup.ts");
|
|
313
|
+
}
|
|
314
|
+
function isExcludedFromIndex(folder, dirent) {
|
|
315
|
+
const excludedNames = [RepoPaths.IndexTs, RepoPaths.Types, RepoPaths.Styles, RepoPaths.TestHelpers];
|
|
316
|
+
const isExcludedEntry = excludedNames.includes(dirent.name) || dirent.name.endsWith(RepoPaths.DtsExtension) || folder.split("/").includes(RepoPaths.Types);
|
|
317
|
+
return isExcludedEntry || dirent.isFile() && isExcludedFileName(dirent.name);
|
|
318
|
+
}
|
|
319
|
+
async function setExport(params) {
|
|
320
|
+
const { exportConditions, isWildcard, sourceCondition, srcFolder } = params;
|
|
321
|
+
const importPath = replaceAll({
|
|
322
|
+
$string: srcFolder,
|
|
323
|
+
replacer: RepoPaths.CurrentFolder,
|
|
324
|
+
searchValue: RepoPaths.Src
|
|
325
|
+
});
|
|
326
|
+
const conditionPath = isWildcard ? `${importPath}/${RepoPaths.Any}` : importPath;
|
|
327
|
+
const dmtsPath = toDistPath({ format: RepoPaths.Esm, importPath, name: isWildcard ? RepoPaths.AnyDmts : RepoPaths.IndexDmts });
|
|
328
|
+
const dctsPath = toDistPath({ format: RepoPaths.Cjs, importPath, name: isWildcard ? RepoPaths.AnyDcts : RepoPaths.IndexDcts });
|
|
329
|
+
const dmtsFolderPath = dirname(dmtsPath);
|
|
330
|
+
const dctsFolderPath = dirname(dctsPath);
|
|
331
|
+
if (!isWildcard && !existsSync(dctsPath)) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const isTypesOnly = importPath.includes(RepoPaths.Types);
|
|
335
|
+
const mjsPath = toDistPath({ format: RepoPaths.Esm, importPath, name: isWildcard ? RepoPaths.AnyMjs : RepoPaths.IndexMjs });
|
|
336
|
+
const cjsPath = toDistPath({ format: RepoPaths.Cjs, importPath, name: isWildcard ? RepoPaths.AnyCjs : RepoPaths.IndexCjs });
|
|
337
|
+
if (isTypesOnly) {
|
|
338
|
+
exportConditions[conditionPath] = {
|
|
339
|
+
import: {
|
|
340
|
+
types: dmtsPath
|
|
341
|
+
},
|
|
342
|
+
require: {
|
|
343
|
+
types: dctsPath
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
} else {
|
|
347
|
+
const sourcePath = normalizeIfRelative(join(RepoPaths.Src, importPath, isWildcard ? RepoPaths.AnyTs : RepoPaths.IndexTs));
|
|
348
|
+
exportConditions[conditionPath] = {
|
|
349
|
+
/* eslint-disable perfectionist/sort-objects -- Order matters once it is written to `package.json`. */
|
|
350
|
+
// First, so it wins wherever it is set: inside the repository, before anything is built.
|
|
351
|
+
...sourceCondition !== void 0 && { [sourceCondition]: sourcePath },
|
|
352
|
+
import: {
|
|
353
|
+
types: dmtsPath,
|
|
354
|
+
default: mjsPath
|
|
355
|
+
},
|
|
356
|
+
require: {
|
|
357
|
+
types: dctsPath,
|
|
358
|
+
default: cjsPath
|
|
359
|
+
}
|
|
360
|
+
/* eslint-enable perfectionist/sort-objects -- Order matters once it is written to `package.json`. */
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
if (importPath === RepoPaths.CurrentFolder) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (!isWildcard) {
|
|
367
|
+
await writeSubpathPackageJson(
|
|
368
|
+
importPath,
|
|
369
|
+
isTypesOnly ? { type: "module", types: relative(importPath, dctsPath) } : { main: relative(importPath, cjsPath), module: relative(importPath, mjsPath), type: "module", types: relative(importPath, dctsPath) }
|
|
370
|
+
);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
for (const file of await readdirPosix(dctsFolderPath)) {
|
|
374
|
+
if (!file.endsWith(RepoPaths.DctsExtension)) {
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
const name = basename(file, RepoPaths.DctsExtension);
|
|
378
|
+
const packageJsonFolderPath = join(importPath, name);
|
|
379
|
+
const types = relative(packageJsonFolderPath, join(dctsFolderPath, name + RepoPaths.DctsExtension));
|
|
380
|
+
await writeSubpathPackageJson(
|
|
381
|
+
packageJsonFolderPath,
|
|
382
|
+
isTypesOnly ? { type: "module", types } : {
|
|
383
|
+
main: relative(packageJsonFolderPath, join(dctsFolderPath, name + RepoPaths.CjsExtension)),
|
|
384
|
+
module: relative(packageJsonFolderPath, join(dmtsFolderPath, name + RepoPaths.MjsExtension)),
|
|
385
|
+
type: "module",
|
|
386
|
+
types
|
|
387
|
+
}
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function toCtsContent(content) {
|
|
392
|
+
let ctsContent = replaceAll({
|
|
393
|
+
$string: content,
|
|
394
|
+
replacer: "from '$<ImportPath>.cjs';",
|
|
395
|
+
searchValue: STATIC_IMPORT_REG_EXP
|
|
396
|
+
});
|
|
397
|
+
ctsContent = replaceAll({
|
|
398
|
+
$string: ctsContent,
|
|
399
|
+
replacer: "import($<Quote>$<ImportPath>.cjs$<Quote>)",
|
|
400
|
+
searchValue: DYNAMIC_IMPORT_REG_EXP
|
|
401
|
+
});
|
|
402
|
+
ctsContent = replaceAll({
|
|
403
|
+
$string: ctsContent,
|
|
404
|
+
replacer: "import type $<Clause> from '$<Specifier>' with { 'resolution-mode': 'import' };",
|
|
405
|
+
searchValue: BARE_TYPE_IMPORT_REG_EXP
|
|
406
|
+
});
|
|
407
|
+
return replaceAll({
|
|
408
|
+
$string: ctsContent,
|
|
409
|
+
replacer: `import("$<Specifier>", { with: { 'resolution-mode': 'import' } })`,
|
|
410
|
+
searchValue: BARE_INLINE_IMPORT_TYPE_REG_EXP
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
function toDistPath(params) {
|
|
414
|
+
return normalizeIfRelative(join(RepoPaths.DistLib, params.format, params.importPath, params.name));
|
|
415
|
+
}
|
|
416
|
+
function toMtsContent(content) {
|
|
417
|
+
const mtsContent = replaceAll({
|
|
418
|
+
$string: content,
|
|
419
|
+
replacer: "from '$<ImportPath>.mjs';",
|
|
420
|
+
searchValue: STATIC_IMPORT_REG_EXP
|
|
421
|
+
});
|
|
422
|
+
return replaceAll({
|
|
423
|
+
$string: mtsContent,
|
|
424
|
+
replacer: "import($<Quote>$<ImportPath>.mjs$<Quote>)",
|
|
425
|
+
searchValue: DYNAMIC_IMPORT_REG_EXP
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
async function writeSubpathPackageJson(folder, packageJson) {
|
|
429
|
+
await mkdir(folder, { recursive: true });
|
|
430
|
+
await writeJson(join(folder, RepoPaths.PackageJson), packageJson);
|
|
431
|
+
}
|
|
432
|
+
export {
|
|
433
|
+
LIBRARY_BANNER,
|
|
434
|
+
LIBRARY_BUILD_STEPS,
|
|
435
|
+
SOURCE_CONDITION,
|
|
436
|
+
buildCleanLibrary,
|
|
437
|
+
buildLibrary,
|
|
438
|
+
buildLibraryTypes,
|
|
439
|
+
generateLibraryExports,
|
|
440
|
+
generateLibraryIndex,
|
|
441
|
+
runBuildSteps
|
|
442
|
+
};
|
|
443
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnktYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgYnVpbGRDbGVhbiB9IGZyb20gJy4vYnVpbGQudHMnO1xuaW1wb3J0IHsgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvY2hhbmdlLWV4dGVuc2lvbi1wbHVnaW4udHMnO1xuaW1wb3J0IHsgZml4RXNtUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvZml4LWVzbS1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vYnVuZGxlcnMvZXNidWlsZC1pbXBsL3ByZXByb2Nlc3MtcGx1Z2luLnRzJztcbmltcG9ydCB7IHBhcnNlVHNDb25maWcgfSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgd3JpdGVKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7IG5wbVJ1bk9wdGlvbmFsIH0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7IGVkaXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBleGVjRnJvbVJvb3QgfSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIFRoZSBiYW5uZXIgZXZlcnkgZW1pdHRlZCBsaWJyYXJ5IG1vZHVsZSBvcGVucyB3aXRoLlxuICovXG5leHBvcnQgY29uc3QgTElCUkFSWV9CQU5ORVIgPSBgLypcblRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEVTQlVJTERcbmlmIHlvdSB3YW50IHRvIHZpZXcgdGhlIHNvdXJjZSwgcGxlYXNlIHZpc2l0IHRoZSBnaXRodWIgcmVwb3NpdG9yeSBvZiB0aGlzIHBsdWdpblxuKi9cbmA7XG5cbi8qKlxuICogVGhlIHN0ZXBzIG9mIGEgbGlicmFyeSBidWlsZCwgaW4gdGhlIG9yZGVyIHtAbGluayBydW5CdWlsZFN0ZXBzfSBydW5zIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JVSUxEX1NURVBTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ2J1aWxkOmNsZWFuJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWluZGV4JyxcbiAgJ2J1aWxkOmNvbXBpbGUnLFxuICAnYnVpbGQ6dHlwZXMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVjbGFyYXRpb25zJyxcbiAgJ2J1aWxkOmxpYicsXG4gICdidWlsZDpnZW5lcmF0ZS1leHBvcnRzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2Agd29ya3NwYWNlIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzbyBhXG4gKiBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcywgYW5kIHNvIGRvZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYCBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgdGhhdFxuICogY2FycmllcyBub3RoaW5nIGVsc2UuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgdGhhdCBvbmUgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbFxuICogcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaCBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmdcbiAqIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBkaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIGRpcmVjdGl2ZXMpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiBsaWIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJykpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsbUJBQW1CO0FBQzVCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVksc0JBQXNCO0FBQzNDLE9BQU8sYUFBYTtBQUlwQixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHdCQUF3QjtBQUNq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
|