@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,418 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* This module provides functions for managing version updates in a project.
|
|
6
|
+
* It includes tasks such as validating version update types, checking the state
|
|
7
|
+
* of Git and GitHub CLI, updating version numbers in files, and performing
|
|
8
|
+
* Git operations such as tagging and pushing.
|
|
9
|
+
*/
|
|
10
|
+
import { parseArgs } from 'node:util';
|
|
11
|
+
/**
|
|
12
|
+
* Options for {@link addUpdatedFilesToGit}.
|
|
13
|
+
*/
|
|
14
|
+
export interface AddUpdatedFilesToGitOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Whether to run the pre-commit hook when creating the release commit. When `false`, `--no-verify`
|
|
17
|
+
* is passed to the release commit to skip the hook.
|
|
18
|
+
*
|
|
19
|
+
* @default `true`
|
|
20
|
+
*/
|
|
21
|
+
readonly shouldVerifyCommit?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The result of parsing the command-line arguments for a version update.
|
|
25
|
+
*/
|
|
26
|
+
export interface ParsedVersionArguments {
|
|
27
|
+
/**
|
|
28
|
+
* The {@link UpdateVersionOptions} parsed from the flags.
|
|
29
|
+
*/
|
|
30
|
+
readonly options: UpdateVersionOptions;
|
|
31
|
+
/**
|
|
32
|
+
* The positional version update type argument, or `undefined` if none was provided.
|
|
33
|
+
*/
|
|
34
|
+
readonly versionUpdateType: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for {@link publishGitHubRelease}.
|
|
38
|
+
*/
|
|
39
|
+
export interface PublishGitHubReleaseOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Returns the files to attach to the GitHub release, as paths relative to the project root. A path that does
|
|
42
|
+
* not exist is skipped.
|
|
43
|
+
*
|
|
44
|
+
* @default the `npm pack` tarball of the project, written into `dist/`, and `dist/styles.css`
|
|
45
|
+
*/
|
|
46
|
+
readonly getReleaseAssetPaths?: (() => Promise<string[]>) | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Whether to close the issues the release carries once it is published: every issue a commit since the previous
|
|
49
|
+
* tag names with a closing keyword (`fixes #12`) is closed with a `Fixed in` / `Implemented in` comment linking
|
|
50
|
+
* the release. See {@link closeReleasedIssues}.
|
|
51
|
+
*
|
|
52
|
+
* @default `true`
|
|
53
|
+
*/
|
|
54
|
+
readonly shouldCloseReleasedIssues?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Options for {@link updateChangelog}.
|
|
58
|
+
*/
|
|
59
|
+
export interface UpdateChangelogOptions {
|
|
60
|
+
/**
|
|
61
|
+
* A path to a file whose contents become the body of the new version's changelog section, instead of
|
|
62
|
+
* the bullets derived from the commit messages. Use it to supply prepared release notes from a
|
|
63
|
+
* non-interactive caller (a background process, CI, an agent).
|
|
64
|
+
*
|
|
65
|
+
* Setting it implies no interactive review: the commit log is not read, and the changelog is never
|
|
66
|
+
* opened in the editor nor waited on at the console, regardless of {@link shouldEditChangelog}.
|
|
67
|
+
*
|
|
68
|
+
* @default the first-parent commit subjects since the previous version
|
|
69
|
+
*/
|
|
70
|
+
readonly changelogFilePath?: string | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Whether to open the generated changelog in the editor for an interactive review. When `false`,
|
|
73
|
+
* the changelog is still generated from commit messages, but it is not opened in the editor for
|
|
74
|
+
* manual review.
|
|
75
|
+
*
|
|
76
|
+
* Ignored when {@link changelogFilePath} is set.
|
|
77
|
+
*
|
|
78
|
+
* @default `true`
|
|
79
|
+
*/
|
|
80
|
+
readonly shouldEditChangelog?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Options for {@link updateVersion}.
|
|
84
|
+
*/
|
|
85
|
+
export interface UpdateVersionOptions {
|
|
86
|
+
/**
|
|
87
|
+
* A path to a file whose contents become the body of the new version's changelog section, instead of
|
|
88
|
+
* the bullets derived from the commit messages. Use it to supply prepared release notes from a
|
|
89
|
+
* non-interactive caller (a background process, CI, an agent).
|
|
90
|
+
*
|
|
91
|
+
* Setting it implies no interactive review: the commit log is not read, and the changelog is never
|
|
92
|
+
* opened in the editor nor waited on at the console, regardless of {@link shouldEditChangelog}.
|
|
93
|
+
*
|
|
94
|
+
* @default the first-parent commit subjects since the previous version
|
|
95
|
+
*/
|
|
96
|
+
readonly changelogFilePath?: string | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Returns the files to attach to the GitHub release. See {@link PublishGitHubReleaseOptions.getReleaseAssetPaths}.
|
|
99
|
+
*/
|
|
100
|
+
readonly getReleaseAssetPaths?: (() => Promise<string[]>) | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* A callback function to prepare the GitHub release.
|
|
103
|
+
*
|
|
104
|
+
* @param newVersion - The new version number for the release.
|
|
105
|
+
* @returns A {@link Promise} that resolves when the GitHub release has been prepared.
|
|
106
|
+
*/
|
|
107
|
+
readonly prepareGitHubRelease?: (newVersion: string) => Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Whether to run the build step. The build is a publishing prerequisite, not a verification check,
|
|
110
|
+
* so it is governed by this flag independently of {@link shouldRunChecks} — it runs even when the
|
|
111
|
+
* checks are skipped, so a fast release still ships fresh artifacts. Set to `false` only when the
|
|
112
|
+
* build output is known to already match the current code; otherwise the release would publish
|
|
113
|
+
* stale artifacts.
|
|
114
|
+
*
|
|
115
|
+
* @default `true`
|
|
116
|
+
*/
|
|
117
|
+
readonly shouldBuild?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Whether to close the issues the release carries once it is published. See
|
|
120
|
+
* {@link PublishGitHubReleaseOptions.shouldCloseReleasedIssues}.
|
|
121
|
+
*
|
|
122
|
+
* @default `true`
|
|
123
|
+
*/
|
|
124
|
+
readonly shouldCloseReleasedIssues?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Whether to open the generated changelog in the editor for an interactive review.
|
|
127
|
+
*
|
|
128
|
+
* Ignored when {@link changelogFilePath} is set. When it is neither set nor disabled, the release
|
|
129
|
+
* requires an interactive terminal, and {@link updateVersion} refuses up front without one rather
|
|
130
|
+
* than blocking on an editor nobody will close.
|
|
131
|
+
*
|
|
132
|
+
* @default `true`
|
|
133
|
+
*/
|
|
134
|
+
readonly shouldEditChangelog?: boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Whether to publish the release. When `false`, all local steps are executed (version bump,
|
|
137
|
+
* changelog, commit, tag), but the changes are not pushed and no GitHub release is published.
|
|
138
|
+
*
|
|
139
|
+
* @default `true`
|
|
140
|
+
*/
|
|
141
|
+
readonly shouldRelease?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Whether to run the preflight verification checks (clean-repo check, format, spellcheck, lint,
|
|
144
|
+
* over-exposure analysis, and tests). The build step is not one of these checks — it is governed
|
|
145
|
+
* separately by {@link shouldBuild}.
|
|
146
|
+
*
|
|
147
|
+
* @default `true`
|
|
148
|
+
*/
|
|
149
|
+
readonly shouldRunChecks?: boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Whether to run the pre-commit hook when creating the release commit. When `false`, `--no-verify`
|
|
152
|
+
* is passed to the release commit to skip the hook.
|
|
153
|
+
*
|
|
154
|
+
* @default `true`
|
|
155
|
+
*/
|
|
156
|
+
readonly shouldVerifyCommit?: boolean;
|
|
157
|
+
/**
|
|
158
|
+
* Updates the version in any file beyond `package.json` and the lockfiles, once the new version is known and
|
|
159
|
+
* before the release commit is made. An Obsidian plugin's `manifest.json` and `versions.json` are the case this
|
|
160
|
+
* exists for.
|
|
161
|
+
*
|
|
162
|
+
* @param newVersion - The version being released.
|
|
163
|
+
* @returns A {@link Promise} that resolves when the files are updated.
|
|
164
|
+
*/
|
|
165
|
+
readonly updateVersionInExtraFiles?: ((newVersion: string) => Promise<void>) | undefined;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Enum representing different types of version updates.
|
|
169
|
+
*
|
|
170
|
+
* Aligns with npm's `npm version` increment types plus `Manual` for explicit versions.
|
|
171
|
+
*/
|
|
172
|
+
export declare enum VersionUpdateType {
|
|
173
|
+
Invalid = "invalid",
|
|
174
|
+
Major = "major",
|
|
175
|
+
Manual = "manual",
|
|
176
|
+
Minor = "minor",
|
|
177
|
+
Patch = "patch",
|
|
178
|
+
PreMajor = "premajor",
|
|
179
|
+
PreMinor = "preminor",
|
|
180
|
+
PrePatch = "prepatch",
|
|
181
|
+
PreRelease = "prerelease"
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Creates a Git tag for the new version.
|
|
185
|
+
*
|
|
186
|
+
* @param newVersion - The new version number to use for the tag.
|
|
187
|
+
* @returns A {@link Promise} that resolves when the tag has been created.
|
|
188
|
+
*/
|
|
189
|
+
export declare function addGitTag(newVersion: string): Promise<void>;
|
|
190
|
+
/**
|
|
191
|
+
* Adds updated files to the Git staging area and commits them with the new version message.
|
|
192
|
+
*
|
|
193
|
+
* If the commit fails (for example, the pre-commit hook rejects a new word in the changelog) and the
|
|
194
|
+
* process is attached to an interactive terminal, the user is prompted to fix the issue (for example,
|
|
195
|
+
* add the missing word to `cspell.json`) and press Enter to retry. The retry re-stages all files, so the
|
|
196
|
+
* fix is picked up without restarting the whole release lifecycle. In a non-interactive environment (no
|
|
197
|
+
* TTY, such as CI), the error is re-thrown instead of prompting, so the script fails fast rather than
|
|
198
|
+
* hanging. Pass `shouldVerifyCommit: false` to skip the pre-commit hook entirely in such cases.
|
|
199
|
+
*
|
|
200
|
+
* @param newVersion - The new version number used as the commit message.
|
|
201
|
+
* @param options - The {@link AddUpdatedFilesToGitOptions} controlling the commit behavior.
|
|
202
|
+
* @returns A {@link Promise} that resolves when the files have been added and committed.
|
|
203
|
+
*/
|
|
204
|
+
export declare function addUpdatedFilesToGit(newVersion: string, options?: AddUpdatedFilesToGitOptions): Promise<void>;
|
|
205
|
+
/**
|
|
206
|
+
* Checks if the GitHub CLI is installed on the system.
|
|
207
|
+
*
|
|
208
|
+
* Throws an error if the GitHub CLI is not installed.
|
|
209
|
+
*
|
|
210
|
+
* @throws Error if the GitHub CLI is not installed.
|
|
211
|
+
*/
|
|
212
|
+
export declare function assertGitHubCliInstalled(): Promise<void>;
|
|
213
|
+
/**
|
|
214
|
+
* Checks if Git is installed on the system.
|
|
215
|
+
*
|
|
216
|
+
* Throws an error if Git is not installed.
|
|
217
|
+
*
|
|
218
|
+
* @throws Error if Git is not installed.
|
|
219
|
+
*/
|
|
220
|
+
export declare function assertGitInstalled(): Promise<void>;
|
|
221
|
+
/**
|
|
222
|
+
* Checks if the Git repository is clean, meaning there are no uncommitted changes.
|
|
223
|
+
*
|
|
224
|
+
* Throws an error if the Git repository is not clean.
|
|
225
|
+
*
|
|
226
|
+
* @throws Error if the Git repository is not clean.
|
|
227
|
+
*/
|
|
228
|
+
export declare function assertGitRepoClean(): Promise<void>;
|
|
229
|
+
/**
|
|
230
|
+
* Wraps any bare `http(s)://` URL in the given text in angle brackets (`<url>`) so that text emitted
|
|
231
|
+
* into a Markdown document (such as a generated changelog bullet) passes markdownlint's
|
|
232
|
+
* `MD034/no-bare-urls` rule while still rendering as a clickable autolink on GitHub.
|
|
233
|
+
*
|
|
234
|
+
* URLs that are already wrapped in angle brackets (`<url>`) or that form the target of a Markdown
|
|
235
|
+
* link (`[text](url)`) are left untouched, so the function is safe to run repeatedly. Trailing
|
|
236
|
+
* sentence punctuation (`.`, `,`, `;`, `:`, `!`, `?`) is kept outside the angle brackets so it does
|
|
237
|
+
* not become part of the link.
|
|
238
|
+
*
|
|
239
|
+
* @param text - The text possibly containing bare URLs.
|
|
240
|
+
* @returns The text with every bare URL wrapped in angle brackets.
|
|
241
|
+
*/
|
|
242
|
+
export declare function autolinkBareUrls(text: string): string;
|
|
243
|
+
/**
|
|
244
|
+
* Generates a new version string based on the current version and the specified update type.
|
|
245
|
+
*
|
|
246
|
+
* Uses the `semver` package to compute the next version, supporting all npm increment types:
|
|
247
|
+
* `major`, `minor`, `patch`, `premajor`, `preminor`, `prepatch`, and `prerelease`.
|
|
248
|
+
* Pre-release versions use the `beta` identifier by default (e.g., `1.2.4-beta.0`).
|
|
249
|
+
*
|
|
250
|
+
* @param versionUpdateType - The type of version update or an explicit version string.
|
|
251
|
+
* @returns A {@link Promise} that resolves to the new version string.
|
|
252
|
+
* @throws Error if the current version is invalid or the increment fails.
|
|
253
|
+
*/
|
|
254
|
+
export declare function getNewVersion(versionUpdateType: string): Promise<string>;
|
|
255
|
+
/**
|
|
256
|
+
* Retrieves the release notes for a specific version from the changelog.
|
|
257
|
+
*
|
|
258
|
+
* @param newVersion - The new version number for which to get the release notes.
|
|
259
|
+
* @returns A {@link Promise} that resolves to the release notes for the specified version.
|
|
260
|
+
*/
|
|
261
|
+
export declare function getReleaseNotes(newVersion: string): Promise<string>;
|
|
262
|
+
/**
|
|
263
|
+
* Determines the type of version update based on the input string.
|
|
264
|
+
*
|
|
265
|
+
* @param versionUpdateType - The input string representing the version update type.
|
|
266
|
+
* @returns The corresponding `VersionUpdateType`.
|
|
267
|
+
*/
|
|
268
|
+
export declare function getVersionUpdateType(versionUpdateType: string): VersionUpdateType;
|
|
269
|
+
/**
|
|
270
|
+
* Pushes commits and tags to the remote Git repository.
|
|
271
|
+
*
|
|
272
|
+
* @returns A {@link Promise} that resolves when the push operation is complete.
|
|
273
|
+
*/
|
|
274
|
+
export declare function gitPush(): Promise<void>;
|
|
275
|
+
/**
|
|
276
|
+
* The flags {@link parseVersionArguments} recognizes, in the shape Node's `parseArgs` takes. Exported so a wrapper
|
|
277
|
+
* that adds flags of its own can parse them all in one pass and still read these through
|
|
278
|
+
* {@link toUpdateVersionOptions}.
|
|
279
|
+
*/
|
|
280
|
+
export declare const VERSION_ARGUMENT_OPTIONS: {
|
|
281
|
+
readonly 'changelog-file': {
|
|
282
|
+
readonly type: "string";
|
|
283
|
+
};
|
|
284
|
+
readonly 'no-build': {
|
|
285
|
+
readonly type: "boolean";
|
|
286
|
+
};
|
|
287
|
+
readonly 'no-changelog-editing': {
|
|
288
|
+
readonly type: "boolean";
|
|
289
|
+
};
|
|
290
|
+
readonly 'no-checks': {
|
|
291
|
+
readonly type: "boolean";
|
|
292
|
+
};
|
|
293
|
+
readonly 'no-commit-verification': {
|
|
294
|
+
readonly type: "boolean";
|
|
295
|
+
};
|
|
296
|
+
readonly 'no-issue-closing': {
|
|
297
|
+
readonly type: "boolean";
|
|
298
|
+
};
|
|
299
|
+
readonly 'no-release': {
|
|
300
|
+
readonly type: "boolean";
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
/**
|
|
304
|
+
* The values `parseArgs` reports for {@link VERSION_ARGUMENT_OPTIONS}.
|
|
305
|
+
*/
|
|
306
|
+
export type VersionArgumentValues = ReturnType<typeof parseArgs<VersionArgumentParseConfig>>['values'];
|
|
307
|
+
/**
|
|
308
|
+
* The `parseArgs` configuration {@link VersionArgumentValues} is derived from.
|
|
309
|
+
*/
|
|
310
|
+
interface VersionArgumentParseConfig {
|
|
311
|
+
/**
|
|
312
|
+
* The recognized flags.
|
|
313
|
+
*/
|
|
314
|
+
readonly options: typeof VERSION_ARGUMENT_OPTIONS;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Whether a version is a pre-release, such as `1.2.4-beta.0`.
|
|
318
|
+
*
|
|
319
|
+
* @param version - The version.
|
|
320
|
+
* @returns Whether it carries a pre-release part.
|
|
321
|
+
*/
|
|
322
|
+
export declare function isPreRelease(version: string): boolean;
|
|
323
|
+
/**
|
|
324
|
+
* Parses the command-line arguments for a version update into a version update type and
|
|
325
|
+
* {@link UpdateVersionOptions}.
|
|
326
|
+
*
|
|
327
|
+
* Each behavior is enabled by default; the corresponding `--no-*` flag turns it off. `--changelog-file` takes a
|
|
328
|
+
* value instead and has no default. Recognized flags:
|
|
329
|
+
* - `--changelog-file=<path>` — use this file's contents as the new version's changelog section instead of
|
|
330
|
+
* the commit-derived bullets, and skip the interactive review entirely.
|
|
331
|
+
* - `--no-build` — skip the build step (only safe when the build output already matches the current code).
|
|
332
|
+
* - `--no-changelog-editing` — generate the changelog without opening it for manual review.
|
|
333
|
+
* - `--no-checks` — skip the clean-repo check, format, spellcheck, lint, over-exposure analysis, and tests (the build still runs).
|
|
334
|
+
* - `--no-commit-verification` — pass `--no-verify` to the release commit, skipping the pre-commit hook.
|
|
335
|
+
* - `--no-issue-closing` — do not close the issues the release carries once it is published.
|
|
336
|
+
* - `--no-release` — run all local steps but skip the push and the GitHub release.
|
|
337
|
+
*
|
|
338
|
+
* @param $arguments - The command-line arguments to parse (typically `process.argv.slice(2)`).
|
|
339
|
+
* @returns The {@link ParsedVersionArguments} containing the version update type and the options.
|
|
340
|
+
*/
|
|
341
|
+
export declare function parseVersionArguments($arguments: string[]): ParsedVersionArguments;
|
|
342
|
+
/**
|
|
343
|
+
* Publishes a GitHub release for the new version.
|
|
344
|
+
*
|
|
345
|
+
* Creates the release and attaches the files {@link PublishGitHubReleaseOptions.getReleaseAssetPaths} names.
|
|
346
|
+
*
|
|
347
|
+
* Once the release exists, the issues it carries are closed with a link to it (see {@link closeReleasedIssues}),
|
|
348
|
+
* unless {@link PublishGitHubReleaseOptions.shouldCloseReleasedIssues} is `false`. A failure there is reported and
|
|
349
|
+
* does not fail the release, which is already published.
|
|
350
|
+
*
|
|
351
|
+
* @param newVersion - The new version number for the release.
|
|
352
|
+
* @param options - The {@link PublishGitHubReleaseOptions}.
|
|
353
|
+
* @returns A {@link Promise} that resolves when the release has been published.
|
|
354
|
+
*/
|
|
355
|
+
export declare function publishGitHubRelease(newVersion: string, options?: PublishGitHubReleaseOptions): Promise<void>;
|
|
356
|
+
/**
|
|
357
|
+
* Maps the values `parseArgs` reports for {@link VERSION_ARGUMENT_OPTIONS} onto {@link UpdateVersionOptions}.
|
|
358
|
+
*
|
|
359
|
+
* @param values - The parsed values.
|
|
360
|
+
* @returns The options.
|
|
361
|
+
*/
|
|
362
|
+
export declare function toUpdateVersionOptions(values: VersionArgumentValues): UpdateVersionOptions;
|
|
363
|
+
/**
|
|
364
|
+
* Updates the changelog file with new version information and commit messages.
|
|
365
|
+
*
|
|
366
|
+
* This function reads the current changelog, appends new entries for the latest version,
|
|
367
|
+
* and prompts the user to review the changes.
|
|
368
|
+
*
|
|
369
|
+
* The review happens on a scratch copy in the OS temporary folder, and the repository's own
|
|
370
|
+
* `CHANGELOG.md` is written only once the review is over — so interrupting the review leaves the
|
|
371
|
+
* repository untouched.
|
|
372
|
+
*
|
|
373
|
+
* @param newVersion - The new version number to be added to the changelog.
|
|
374
|
+
* @param options - The {@link UpdateChangelogOptions} controlling the changelog review behavior.
|
|
375
|
+
* @returns A {@link Promise} that resolves when the changelog update is complete.
|
|
376
|
+
*/
|
|
377
|
+
export declare function updateChangelog(newVersion: string, options?: UpdateChangelogOptions): Promise<void>;
|
|
378
|
+
/**
|
|
379
|
+
* Updates the version of the project based on the specified update type.
|
|
380
|
+
*
|
|
381
|
+
* This function performs a series of tasks to handle version updates:
|
|
382
|
+
* 1. Validates the version update type.
|
|
383
|
+
* 2. Checks if Git and GitHub CLI are installed.
|
|
384
|
+
* 3. Verifies that the interactive changelog review, if one is due, can actually be answered.
|
|
385
|
+
* 4. Verifies that the bump is not lower than the commits since the last tag force it to be.
|
|
386
|
+
* 5. Verifies that the Git repository is clean.
|
|
387
|
+
* 6. Runs spellcheck and linting.
|
|
388
|
+
* 7. Builds the project.
|
|
389
|
+
* 8. Settles the changelog — the only step that can block on a human, and deliberately the last one before
|
|
390
|
+
* anything is written, so an interrupt here leaves the working tree clean and the release re-runnable.
|
|
391
|
+
* The settled text is linted here too: `lint:md` ran in step 6, before a character of it existed.
|
|
392
|
+
* 9. Updates version in files (and in whatever {@link UpdateVersionOptions.updateVersionInExtraFiles} adds), then
|
|
393
|
+
* writes the settled changelog.
|
|
394
|
+
* 10. Adds updated files to Git, tags the commit, and pushes to the repository.
|
|
395
|
+
* 11. Prepares and publishes a GitHub release.
|
|
396
|
+
* 12. Closes the issues the release carries, with a link to it.
|
|
397
|
+
*
|
|
398
|
+
* @param versionUpdateType - The type of version update to perform (major, minor, patch, premajor, preminor, prepatch, prerelease, or x.y.z[-suffix]).
|
|
399
|
+
* @param options - The {@link UpdateVersionOptions} controlling the release behavior.
|
|
400
|
+
* @returns A {@link Promise} that resolves when the version update is complete.
|
|
401
|
+
*/
|
|
402
|
+
export declare function updateVersion(versionUpdateType?: string, options?: UpdateVersionOptions): Promise<void>;
|
|
403
|
+
/**
|
|
404
|
+
* Updates the version in `package.json` and, where they exist, `package-lock.json` and `npm-shrinkwrap.json`.
|
|
405
|
+
*
|
|
406
|
+
* @param newVersion - The new version string to update in the files.
|
|
407
|
+
* @returns A {@link Promise} that resolves when the update is complete.
|
|
408
|
+
*/
|
|
409
|
+
export declare function updateVersionInFiles(newVersion: string): Promise<void>;
|
|
410
|
+
/**
|
|
411
|
+
* Validates the version update type to ensure it is either a recognized type
|
|
412
|
+
* or a valid manual version string.
|
|
413
|
+
*
|
|
414
|
+
* @param versionUpdateType - The version update type to validate.
|
|
415
|
+
* @throws Error if the version update type is invalid.
|
|
416
|
+
*/
|
|
417
|
+
export declare function validate(versionUpdateType: string): void;
|
|
418
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* This module provides utility functions to handle the build process for static assets and cleaning
|
|
6
|
+
* the build output folder. It includes functions to copy static files to the distribution folder
|
|
7
|
+
* and to remove the existing build output.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Removes the distribution folder and its contents.
|
|
11
|
+
*
|
|
12
|
+
* This function deletes the entire distribution folder to ensure a clean build environment.
|
|
13
|
+
*
|
|
14
|
+
* @returns A {@link Promise} that resolves when the folder has been removed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildClean(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Compiles the code.
|
|
19
|
+
*
|
|
20
|
+
* @returns A {@link Promise} that resolves when the code compiles successfully.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildCompile(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Compiles the Svelte code.
|
|
25
|
+
*
|
|
26
|
+
* The project's Svelte files are found by globbing the Svelte extensions directly. Globbing the tsconfig
|
|
27
|
+
* `include` patterns and filtering that list would never match: `include` lists TypeScript globs
|
|
28
|
+
* (`./src/**\/*.ts`, …), so no `.svelte` path can ever appear in it and the check would always be skipped.
|
|
29
|
+
*
|
|
30
|
+
* @returns A {@link Promise} that resolves when the code compiles successfully.
|
|
31
|
+
* @throws If the project has Svelte files but does not declare `svelte-check`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildCompileSvelte(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Compiles the TypeScript code.
|
|
36
|
+
*
|
|
37
|
+
* The general `tsc` pass runs with `skipLibCheck: true` (configured in `tsconfig.json`) so it does
|
|
38
|
+
* not fail on broken upstream `.d.ts` files we do not control. Afterwards, {@link areProjectTypesValid}
|
|
39
|
+
* re-runs the type-check in-memory with `skipLibCheck: false`, reporting only diagnostics from the
|
|
40
|
+
* files we own, so the declarations we author are still fully validated.
|
|
41
|
+
*
|
|
42
|
+
* @returns A {@link Promise} that resolves when the code compiles successfully.
|
|
43
|
+
* @throws If the project's own declarations fail validation.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildCompileTypeScript(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Copies all template files from the templates folder to the `templates` folder within the
|
|
48
|
+
* distribution folder.
|
|
49
|
+
*
|
|
50
|
+
* This function recursively reads the contents of the templates folder and copies each file to the
|
|
51
|
+
* corresponding path under {@link RepoPaths.DistTemplates}, so consumers can copy the
|
|
52
|
+
* templates from `node_modules/obsidian-dev-utils/dist/templates`. A trailing `.template` on a source
|
|
53
|
+
* file name is stripped in the destination (e.g. `eslint.config.mts.template` is copied as
|
|
54
|
+
* `eslint.config.mts`), so an active config template can live in the repo under a name that the
|
|
55
|
+
* corresponding tool does not auto-discover.
|
|
56
|
+
*
|
|
57
|
+
* @returns A {@link Promise} that resolves when all files have been copied.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildTemplates(): Promise<void>;
|
|
@@ -0,0 +1,165 @@
|
|
|
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 { toArray } from "@mnaoumov/typescript-lib/async";
|
|
49
|
+
import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
|
|
50
|
+
import { join } from "@mnaoumov/typescript-lib/path";
|
|
51
|
+
import { trimStart } from "@mnaoumov/typescript-lib/string";
|
|
52
|
+
import {
|
|
53
|
+
cp,
|
|
54
|
+
glob,
|
|
55
|
+
rm
|
|
56
|
+
} from "node:fs/promises";
|
|
57
|
+
import {
|
|
58
|
+
checkProjectTypes,
|
|
59
|
+
parseTsConfig,
|
|
60
|
+
toCanonical
|
|
61
|
+
} from "./check-project-types.mjs";
|
|
62
|
+
import { readdirPosix } from "./fs.mjs";
|
|
63
|
+
import { readJson } from "./json.mjs";
|
|
64
|
+
import {
|
|
65
|
+
npmRunOptional,
|
|
66
|
+
NpmRunOptionalResult
|
|
67
|
+
} from "./npm-run.mjs";
|
|
68
|
+
import { readPackageJson } from "./npm.mjs";
|
|
69
|
+
import { resolveToolCommand } from "./package-manager.mjs";
|
|
70
|
+
import { RepoPaths } from "./repo-paths.mjs";
|
|
71
|
+
import {
|
|
72
|
+
execFromRoot,
|
|
73
|
+
getRootFolder,
|
|
74
|
+
resolvePathFromRootSafe
|
|
75
|
+
} from "./root.mjs";
|
|
76
|
+
async function buildClean() {
|
|
77
|
+
await rm(RepoPaths.Dist, { force: true, recursive: true });
|
|
78
|
+
}
|
|
79
|
+
async function buildCompile() {
|
|
80
|
+
if (await npmRunOptional("build:compile:svelte") === NpmRunOptionalResult.Skipped) {
|
|
81
|
+
await buildCompileSvelte();
|
|
82
|
+
}
|
|
83
|
+
if (await npmRunOptional("build:compile:typescript") === NpmRunOptionalResult.Skipped) {
|
|
84
|
+
await buildCompileTypeScript();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function buildCompileSvelte() {
|
|
88
|
+
const tsConfigPath = resolvePathFromRootSafe({ path: RepoPaths.TsConfigJson });
|
|
89
|
+
const tsConfig = await readJson(tsConfigPath);
|
|
90
|
+
const svelteFiles = await toArray(glob(SVELTE_FILE_PATTERNS, {
|
|
91
|
+
cwd: resolvePathFromRootSafe({ path: RepoPaths.CurrentFolder }),
|
|
92
|
+
exclude: [...SVELTE_FILE_EXCLUDE_PATTERNS, ...tsConfig.exclude ?? []]
|
|
93
|
+
}));
|
|
94
|
+
const [firstSvelteFile] = svelteFiles;
|
|
95
|
+
if (firstSvelteFile === void 0) {
|
|
96
|
+
getLibDebugger("build:buildCompileSvelte")("No Svelte files found in the project, skipping Svelte compilation");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const packageJson = await readPackageJson();
|
|
100
|
+
if (!checkSvelteCheckDeclared(packageJson)) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Found Svelte file(s) in the project (e.g. ${firstSvelteFile}), but \`${SVELTE_CHECK_PACKAGE_NAME}\` is not declared in package.json. Add \`${SVELTE_CHECK_PACKAGE_NAME}\` as a devDependency to type-check the Svelte code.`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
await execFromRoot([...resolveToolCommand({ tool: SVELTE_CHECK_PACKAGE_NAME }), "--tsconfig", RepoPaths.TsConfigJson]);
|
|
106
|
+
}
|
|
107
|
+
async function buildCompileTypeScript() {
|
|
108
|
+
await execFromRoot([...resolveToolCommand({ tool: "tsc" }), "--build", "--force"]);
|
|
109
|
+
if (!areProjectTypesValid()) {
|
|
110
|
+
throw new Error("TypeScript declaration validation failed.");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function buildTemplates() {
|
|
114
|
+
for (const dirent of await readdirPosix(RepoPaths.Templates, { recursive: true, withFileTypes: true })) {
|
|
115
|
+
if (!dirent.isFile()) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const path = trimStart({
|
|
119
|
+
$string: join(dirent.parentPath, dirent.name),
|
|
120
|
+
prefix: `${RepoPaths.Templates}/`
|
|
121
|
+
});
|
|
122
|
+
const destinationPath = path.endsWith(TEMPLATE_FILE_SUFFIX) ? path.slice(0, -TEMPLATE_FILE_SUFFIX.length) : path;
|
|
123
|
+
await cp(join(RepoPaths.Templates, path), join(RepoPaths.DistTemplates, destinationPath));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const TEMPLATE_FILE_SUFFIX = ".template";
|
|
127
|
+
const NODE_MODULES_SEGMENT = "/node_modules/";
|
|
128
|
+
const SVELTE_CHECK_PACKAGE_NAME = "svelte-check";
|
|
129
|
+
const SVELTE_FILE_PATTERNS = [
|
|
130
|
+
`${RepoPaths.AnyPath}/*.svelte`,
|
|
131
|
+
`${RepoPaths.AnyPath}/*.svelte.js`,
|
|
132
|
+
`${RepoPaths.AnyPath}/*.svelte.ts`
|
|
133
|
+
];
|
|
134
|
+
const SVELTE_FILE_EXCLUDE_PATTERNS = [
|
|
135
|
+
`${RepoPaths.AnyPath}/${RepoPaths.NodeModules}/${RepoPaths.AnyPath}`,
|
|
136
|
+
`${RepoPaths.AnyPath}/${RepoPaths.Dist}/${RepoPaths.AnyPath}`
|
|
137
|
+
];
|
|
138
|
+
function areProjectTypesValid() {
|
|
139
|
+
const root = getRootFolder();
|
|
140
|
+
if (!root) {
|
|
141
|
+
throw new Error("Could not find root folder");
|
|
142
|
+
}
|
|
143
|
+
const rootCanonical = toCanonical(root);
|
|
144
|
+
const { fileNames, options } = parseTsConfig(join(root, RepoPaths.TsConfigJson));
|
|
145
|
+
return checkProjectTypes({
|
|
146
|
+
options,
|
|
147
|
+
rootNames: fileNames,
|
|
148
|
+
shouldKeepFile: (fileName) => shouldKeepProjectFile({ fileName, rootCanonical })
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function checkSvelteCheckDeclared(packageJson) {
|
|
152
|
+
return [packageJson.dependencies, packageJson.devDependencies, packageJson.peerDependencies].some((dependencies) => dependencies?.[SVELTE_CHECK_PACKAGE_NAME] !== void 0);
|
|
153
|
+
}
|
|
154
|
+
function shouldKeepProjectFile(params) {
|
|
155
|
+
const { fileName, rootCanonical } = params;
|
|
156
|
+
return fileName.startsWith(`${rootCanonical}/`) && !fileName.includes(NODE_MODULES_SEGMENT);
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
buildClean,
|
|
160
|
+
buildCompile,
|
|
161
|
+
buildCompileSvelte,
|
|
162
|
+
buildCompileTypeScript,
|
|
163
|
+
buildTemplates
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2J1aWxkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBidWlsZCBwcm9jZXNzIGZvciBzdGF0aWMgYXNzZXRzIGFuZCBjbGVhbmluZ1xuICogdGhlIGJ1aWxkIG91dHB1dCBmb2xkZXIuIEl0IGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5IHN0YXRpYyBmaWxlcyB0byB0aGUgZGlzdHJpYnV0aW9uIGZvbGRlclxuICogYW5kIHRvIHJlbW92ZSB0aGUgZXhpc3RpbmcgYnVpbGQgb3V0cHV0LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGFja2FnZUpzb24sXG4gIFRzQ29uZmlnSnNvblxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyB0cmltU3RhcnQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7XG4gIGNwLFxuICBnbG9iLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tQcm9qZWN0VHlwZXMsXG4gIHBhcnNlVHNDb25maWcsXG4gIHRvQ2Fub25pY2FsXG59IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IHJlYWRKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7XG4gIG5wbVJ1bk9wdGlvbmFsLFxuICBOcG1SdW5PcHRpb25hbFJlc3VsdFxufSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBkaXN0cmlidXRpb24gZm9sZGVyIGFuZCBpdHMgY29udGVudHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZWxldGVzIHRoZSBlbnRpcmUgZGlzdHJpYnV0aW9uIGZvbGRlciB0byBlbnN1cmUgYSBjbGVhbiBidWlsZCBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbGRlciBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcm0oUmVwb1BhdGhzLkRpc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6c3ZlbHRlJykgPT09IE5wbVJ1bk9wdGlvbmFsUmVzdWx0LlNraXBwZWQpIHtcbiAgICBhd2FpdCBidWlsZENvbXBpbGVTdmVsdGUoKTtcbiAgfVxuICBpZiAoYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6dHlwZXNjcmlwdCcpID09PSBOcG1SdW5PcHRpb25hbFJlc3VsdC5Ta2lwcGVkKSB7XG4gICAgYXdhaXQgYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIFN2ZWx0ZSBjb2RlLlxuICpcbiAqIFRoZSBwcm9qZWN0J3MgU3ZlbHRlIGZpbGVzIGFyZSBmb3VuZCBieSBnbG9iYmluZyB0aGUgU3ZlbHRlIGV4dGVuc2lvbnMgZGlyZWN0bHkuIEdsb2JiaW5nIHRoZSB0c2NvbmZpZ1xuICogYGluY2x1ZGVgIHBhdHRlcm5zIGFuZCBmaWx0ZXJpbmcgdGhhdCBsaXN0IHdvdWxkIG5ldmVyIG1hdGNoOiBgaW5jbHVkZWAgbGlzdHMgVHlwZVNjcmlwdCBnbG9ic1xuICogKGAuL3NyYy8qKlxcLyoudHNgLCBcdTIwMjYpLCBzbyBubyBgLnN2ZWx0ZWAgcGF0aCBjYW4gZXZlciBhcHBlYXIgaW4gaXQgYW5kIHRoZSBjaGVjayB3b3VsZCBhbHdheXMgYmUgc2tpcHBlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCBoYXMgU3ZlbHRlIGZpbGVzIGJ1dCBkb2VzIG5vdCBkZWNsYXJlIGBzdmVsdGUtY2hlY2tgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlU3ZlbHRlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0c0NvbmZpZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24gfSk7XG4gIGNvbnN0IHRzQ29uZmlnID0gYXdhaXQgcmVhZEpzb248VHNDb25maWdKc29uPih0c0NvbmZpZ1BhdGgpO1xuICBjb25zdCBzdmVsdGVGaWxlcyA9IGF3YWl0IHRvQXJyYXkoZ2xvYihTVkVMVEVfRklMRV9QQVRURVJOUywge1xuICAgIGN3ZDogcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciB9KSxcbiAgICBleGNsdWRlOiBbLi4uU1ZFTFRFX0ZJTEVfRVhDTFVERV9QQVRURVJOUywgLi4udHNDb25maWcuZXhjbHVkZSA/PyBbXV1cbiAgfSkpO1xuXG4gIGNvbnN0IFtmaXJzdFN2ZWx0ZUZpbGVdID0gc3ZlbHRlRmlsZXM7XG5cbiAgaWYgKGZpcnN0U3ZlbHRlRmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2J1aWxkOmJ1aWxkQ29tcGlsZVN2ZWx0ZScpKCdObyBTdmVsdGUgZmlsZXMgZm91bmQgaW4gdGhlIHByb2plY3QsIHNraXBwaW5nIFN2ZWx0ZSBjb21waWxhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG5cbiAgaWYgKCFjaGVja1N2ZWx0ZUNoZWNrRGVjbGFyZWQocGFja2FnZUpzb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZvdW5kIFN2ZWx0ZSBmaWxlKHMpIGluIHRoZSBwcm9qZWN0IChlLmcuICR7Zmlyc3RTdmVsdGVGaWxlfSksIGJ1dCBcXGAke1NWRUxURV9DSEVDS19QQUNLQUdFX05BTUV9XFxgIGlzIG5vdCBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24uYFxuICAgICAgICArIGAgQWRkIFxcYCR7U1ZFTFRFX0NIRUNLX1BBQ0tBR0VfTkFNRX1cXGAgYXMgYSBkZXZEZXBlbmRlbmN5IHRvIHR5cGUtY2hlY2sgdGhlIFN2ZWx0ZSBjb2RlLmBcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiBTVkVMVEVfQ0hFQ0tfUEFDS0FHRV9OQU1FIH0pLCAnLS10c2NvbmZpZycsIFJlcG9QYXRocy5Uc0NvbmZpZ0pzb25dKTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgVHlwZVNjcmlwdCBjb2RlLlxuICpcbiAqIFRoZSBnZW5lcmFsIGB0c2NgIHBhc3MgcnVucyB3aXRoIGBza2lwTGliQ2hlY2s6IHRydWVgIChjb25maWd1cmVkIGluIGB0c2NvbmZpZy5qc29uYCkgc28gaXQgZG9lc1xuICogbm90IGZhaWwgb24gYnJva2VuIHVwc3RyZWFtIGAuZC50c2AgZmlsZXMgd2UgZG8gbm90IGNvbnRyb2wuIEFmdGVyd2FyZHMsIHtAbGluayBhcmVQcm9qZWN0VHlwZXNWYWxpZH1cbiAqIHJlLXJ1bnMgdGhlIHR5cGUtY2hlY2sgaW4tbWVtb3J5IHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgLCByZXBvcnRpbmcgb25seSBkaWFnbm9zdGljcyBmcm9tIHRoZVxuICogZmlsZXMgd2Ugb3duLCBzbyB0aGUgZGVjbGFyYXRpb25zIHdlIGF1dGhvciBhcmUgc3RpbGwgZnVsbHkgdmFsaWRhdGVkLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29kZSBjb21waWxlcyBzdWNjZXNzZnVsbHkuXG4gKiBAdGhyb3dzIElmIHRoZSBwcm9qZWN0J3Mgb3duIGRlY2xhcmF0aW9ucyBmYWlsIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbXBpbGVUeXBlU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1idWlsZCcsICctLWZvcmNlJ10pO1xuXG4gIGlmICghYXJlUHJvamVjdFR5cGVzVmFsaWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZC4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyBhbGwgdGVtcGxhdGUgZmlsZXMgZnJvbSB0aGUgdGVtcGxhdGVzIGZvbGRlciB0byB0aGUgYHRlbXBsYXRlc2AgZm9sZGVyIHdpdGhpbiB0aGVcbiAqIGRpc3RyaWJ1dGlvbiBmb2xkZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSByZWFkcyB0aGUgY29udGVudHMgb2YgdGhlIHRlbXBsYXRlcyBmb2xkZXIgYW5kIGNvcGllcyBlYWNoIGZpbGUgdG8gdGhlXG4gKiBjb3JyZXNwb25kaW5nIHBhdGggdW5kZXIge0BsaW5rIFJlcG9QYXRocy5EaXN0VGVtcGxhdGVzfSwgc28gY29uc3VtZXJzIGNhbiBjb3B5IHRoZVxuICogdGVtcGxhdGVzIGZyb20gYG5vZGVfbW9kdWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMvZGlzdC90ZW1wbGF0ZXNgLiBBIHRyYWlsaW5nIGAudGVtcGxhdGVgIG9uIGEgc291cmNlXG4gKiBmaWxlIG5hbWUgaXMgc3RyaXBwZWQgaW4gdGhlIGRlc3RpbmF0aW9uIChlLmcuIGBlc2xpbnQuY29uZmlnLm10cy50ZW1wbGF0ZWAgaXMgY29waWVkIGFzXG4gKiBgZXNsaW50LmNvbmZpZy5tdHNgKSwgc28gYW4gYWN0aXZlIGNvbmZpZyB0ZW1wbGF0ZSBjYW4gbGl2ZSBpbiB0aGUgcmVwbyB1bmRlciBhIG5hbWUgdGhhdCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdG9vbCBkb2VzIG5vdCBhdXRvLWRpc2NvdmVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIGNvcGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlRlbXBsYXRlcywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IHRyaW1TdGFydCh7XG4gICAgICAkc3RyaW5nOiBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSksXG4gICAgICBwcmVmaXg6IGAke1JlcG9QYXRocy5UZW1wbGF0ZXN9L2BcbiAgICB9KTtcbiAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBwYXRoLmVuZHNXaXRoKFRFTVBMQVRFX0ZJTEVfU1VGRklYKSA/IHBhdGguc2xpY2UoMCwgLVRFTVBMQVRFX0ZJTEVfU1VGRklYLmxlbmd0aCkgOiBwYXRoO1xuICAgIGF3YWl0IGNwKGpvaW4oUmVwb1BhdGhzLlRlbXBsYXRlcywgcGF0aCksIGpvaW4oUmVwb1BhdGhzLkRpc3RUZW1wbGF0ZXMsIGRlc3RpbmF0aW9uUGF0aCkpO1xuICB9XG59XG5cbmNvbnN0IFRFTVBMQVRFX0ZJTEVfU1VGRklYID0gJy50ZW1wbGF0ZSc7XG5cbmNvbnN0IE5PREVfTU9EVUxFU19TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvJztcblxuY29uc3QgU1ZFTFRFX0NIRUNLX1BBQ0tBR0VfTkFNRSA9ICdzdmVsdGUtY2hlY2snO1xuXG5jb25zdCBTVkVMVEVfRklMRV9QQVRURVJOUyA9IFtcbiAgYCR7UmVwb1BhdGhzLkFueVBhdGh9Lyouc3ZlbHRlYCxcbiAgYCR7UmVwb1BhdGhzLkFueVBhdGh9Lyouc3ZlbHRlLmpzYCxcbiAgYCR7UmVwb1BhdGhzLkFueVBhdGh9Lyouc3ZlbHRlLnRzYFxuXTtcblxuLyoqXG4gKiBgbm9kZV9tb2R1bGVzYCBtdXN0IGJlIGxpc3RlZCBleHBsaWNpdGx5OiBhIHRzY29uZmlnIHRoYXQgc2V0cyBgZXhjbHVkZWAgYXQgYWxsICoqcmVwbGFjZXMqKiBUeXBlU2NyaXB0J3NcbiAqIGRlZmF1bHQgYG5vZGVfbW9kdWxlc2AgZXhjbHVzaW9uLCBzbyBpdCBjYW5ub3QgYmUgcmVsaWVkIG9uIHRvIGtlZXAgZGVwZW5kZW5jaWVzIG91dCBvZiB0aGUgZ2xvYi5cbiAqL1xuY29uc3QgU1ZFTFRFX0ZJTEVfRVhDTFVERV9QQVRURVJOUyA9IFtcbiAgYCR7UmVwb1BhdGhzLkFueVBhdGh9LyR7UmVwb1BhdGhzLk5vZGVNb2R1bGVzfS8ke1JlcG9QYXRocy5BbnlQYXRofWAsXG4gIGAke1JlcG9QYXRocy5BbnlQYXRofS8ke1JlcG9QYXRocy5EaXN0fS8ke1JlcG9QYXRocy5BbnlQYXRofWBcbl07XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNob3VsZEtlZXBQcm9qZWN0RmlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRLZWVwUHJvamVjdEZpbGVQYXJhbXMge1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENhbm9uaWNhbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlLXJ1bnMgdGhlIHByb2plY3QgdHlwZS1jaGVjayBpbi1tZW1vcnkgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAsIHJlcG9ydGluZyBvbmx5IGRpYWdub3N0aWNzXG4gKiB3aG9zZSBzb3VyY2UgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBwcm9qZWN0J3Mgb3duIGZpbGVzIGhhdmUgbm8gdHlwZSBlcnJvcnMsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHRocm93cyBJZiB0aGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiBhcmVQcm9qZWN0VHlwZXNWYWxpZCgpOiBib29sZWFuIHtcbiAgY29uc3Qgcm9vdCA9IGdldFJvb3RGb2xkZXIoKTtcblxuICBpZiAoIXJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJvb3QgZm9sZGVyJyk7XG4gIH1cblxuICBjb25zdCByb290Q2Fub25pY2FsID0gdG9DYW5vbmljYWwocm9vdCk7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKGpvaW4ocm9vdCwgUmVwb1BhdGhzLlRzQ29uZmlnSnNvbikpO1xuXG4gIHJldHVybiBjaGVja1Byb2plY3RUeXBlcyh7XG4gICAgb3B0aW9ucyxcbiAgICByb290TmFtZXM6IGZpbGVOYW1lcyxcbiAgICBzaG91bGRLZWVwRmlsZTogKGZpbGVOYW1lKSA9PiBzaG91bGRLZWVwUHJvamVjdEZpbGUoeyBmaWxlTmFtZSwgcm9vdENhbm9uaWNhbCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb2plY3QgZGVjbGFyZXMgYHN2ZWx0ZS1jaGVja2AuXG4gKlxuICogVGhlIGRlY2xhcmF0aW9uIGlzIHJlYWQgZnJvbSBgcGFja2FnZS5qc29uYCByYXRoZXIgdGhhbiBwcm9iZWQgaW4gYG5vZGVfbW9kdWxlcy8uYmluYCwgYmVjYXVzZVxuICoge0BsaW5rIHJlc29sdmVUb29sQ29tbWFuZH0gZGVsaWJlcmF0ZWx5IGZhbGxzIGJhY2sgdG8gdGhlIHBhY2thZ2UgbWFuYWdlcidzIGV4ZWMgZm9ybSBmb3IgdG9vbHMgdGhhdCBoYXZlXG4gKiBubyBiaW4gc2hpbSBcdTIwMTQgdGhlIG9ubHkgd2F5IGEgbG9jYWxseSBpbnN0YWxsZWQgdG9vbCByZXNvbHZlcyB1bmRlciB5YXJuIFBuUC4gVHJlYXRpbmcgYSBtaXNzaW5nIHNoaW0gYXMgYVxuICogbWlzc2luZyB0b29sIHdvdWxkIHRoZXJlZm9yZSBicmVhayBQblAgcHJvamVjdHMuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VKc29uIC0gVGhlIHByb2plY3QncyBwYXJzZWQgYHBhY2thZ2UuanNvbmAuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBgc3ZlbHRlLWNoZWNrYCBpcyBkZWNsYXJlZCBhcyBhIHJlZ3VsYXIsIGRldiwgb3IgcGVlciBkZXBlbmRlbmN5LlxuICovXG5mdW5jdGlvbiBjaGVja1N2ZWx0ZUNoZWNrRGVjbGFyZWQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIHJldHVybiBbcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXNdXG4gICAgLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy5bU1ZFTFRFX0NIRUNLX1BBQ0tBR0VfTkFNRV0gIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkS2VlcFByb2plY3RGaWxlKHBhcmFtczogU2hvdWxkS2VlcFByb2plY3RGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHJvb3RDYW5vbmljYWwgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7cm9vdENhbm9uaWNhbH0vYCkgJiYgIWZpbGVOYW1lLmluY2x1ZGVz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
|