@mnaoumov/obsidian-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/package.json +6 -0
- package/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/dependency/package.json +6 -0
- package/bundlers/esbuild-impl/fix-source-maps-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/index/package.json +6 -0
- package/bundlers/esbuild-impl/obsidian-plugin-builder/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/rename-css-plugin/package.json +6 -0
- package/bundlers/index/package.json +6 -0
- package/bundlers/package.json +6 -0
- package/dist/demo-vault-helper/main.js +1264 -0
- package/dist/demo-vault-helper/manifest.json +9 -0
- package/dist/integration-test-plugin/main.js +54167 -0
- package/dist/integration-test-plugin/manifest.json +8 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +322 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +38 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +240 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.d.cts +20 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +213 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +34 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +179 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +7 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +362 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +98 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +234 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +30 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +171 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/esbuild.cjs +164 -0
- package/dist/lib/cjs/bundlers/esbuild.d.cts +11 -0
- package/dist/lib/cjs/bundlers/index.cjs +167 -0
- package/dist/lib/cjs/bundlers/index.d.cts +3 -0
- package/dist/lib/cjs/demo-vault-app-json.cjs +186 -0
- package/dist/lib/cjs/demo-vault-app-json.d.cts +93 -0
- package/dist/lib/cjs/demo-vault-buttons.cjs +567 -0
- package/dist/lib/cjs/demo-vault-buttons.d.cts +259 -0
- package/dist/lib/cjs/demo-vault-coverage.cjs +713 -0
- package/dist/lib/cjs/demo-vault-coverage.d.cts +533 -0
- package/dist/lib/cjs/demo-vault.cjs +296 -0
- package/dist/lib/cjs/demo-vault.d.cts +33 -0
- package/dist/lib/cjs/formatters/dprint.cjs +160 -0
- package/dist/lib/cjs/formatters/dprint.d.cts +15 -0
- package/dist/lib/cjs/formatters/index.cjs +164 -0
- package/dist/lib/cjs/formatters/index.d.cts +2 -0
- package/dist/lib/cjs/index.cjs +194 -0
- package/dist/lib/cjs/index.d.cts +16 -0
- package/dist/lib/cjs/integration-test-setup.cjs +129 -0
- package/dist/lib/cjs/integration-test-setup.d.cts +33 -0
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +163 -0
- package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +39 -0
- package/dist/lib/cjs/jest-setup.cjs +134 -0
- package/dist/lib/cjs/jest-setup.d.cts +13 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +403 -0
- package/dist/lib/cjs/linters/eslint-config.d.cts +25 -0
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +200 -0
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +14 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +255 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +218 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +215 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +216 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +316 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +259 -0
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +657 -0
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +247 -0
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +181 -0
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +13 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +263 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +30 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +215 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +29 -0
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +278 -0
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.d.cts +18 -0
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +306 -0
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint.cjs +160 -0
- package/dist/lib/cjs/linters/eslint.d.cts +15 -0
- package/dist/lib/cjs/linters/index.cjs +185 -0
- package/dist/lib/cjs/linters/index.d.cts +9 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +171 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +12 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +164 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +246 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +32 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +160 -0
- package/dist/lib/cjs/linters/markdownlint.d.cts +15 -0
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +176 -0
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.d.cts +40 -0
- package/dist/lib/cjs/linters/plugin-names.cjs +249 -0
- package/dist/lib/cjs/linters/plugin-names.d.cts +81 -0
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +216 -0
- package/dist/lib/cjs/obsidian-plugin-repo-paths.d.cts +253 -0
- package/dist/lib/cjs/setup.cjs +163 -0
- package/dist/lib/cjs/setup.d.cts +21 -0
- package/dist/lib/cjs/templates.cjs +172 -0
- package/dist/lib/cjs/templates.d.cts +13 -0
- package/dist/lib/cjs/test-runners/index.cjs +170 -0
- package/dist/lib/cjs/test-runners/index.d.cts +4 -0
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +211 -0
- package/dist/lib/cjs/test-runners/integration-test-plugin.d.cts +44 -0
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +157 -0
- package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +27 -0
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +217 -0
- package/dist/lib/cjs/test-runners/stale-build-global-setup.d.cts +86 -0
- package/dist/lib/cjs/test-runners/vitest-config.cjs +484 -0
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +200 -0
- package/dist/lib/cjs/version.cjs +262 -0
- package/dist/lib/cjs/version.d.cts +92 -0
- package/dist/lib/cjs/vitest-setup.cjs +134 -0
- package/dist/lib/cjs/vitest-setup.d.cts +11 -0
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +38 -0
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +218 -0
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.d.mts +20 -0
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +130 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +34 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +108 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +7 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +56 -0
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +98 -0
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +247 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +30 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +126 -0
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +63 -0
- package/dist/lib/esm/bundlers/esbuild.d.mts +11 -0
- package/dist/lib/esm/bundlers/esbuild.mjs +58 -0
- package/dist/lib/esm/bundlers/index.d.mts +3 -0
- package/dist/lib/esm/bundlers/index.mjs +48 -0
- package/dist/lib/esm/demo-vault-app-json.d.mts +93 -0
- package/dist/lib/esm/demo-vault-app-json.mjs +75 -0
- package/dist/lib/esm/demo-vault-buttons.d.mts +259 -0
- package/dist/lib/esm/demo-vault-buttons.mjs +452 -0
- package/dist/lib/esm/demo-vault-coverage.d.mts +533 -0
- package/dist/lib/esm/demo-vault-coverage.mjs +619 -0
- package/dist/lib/esm/demo-vault.d.mts +33 -0
- package/dist/lib/esm/demo-vault.mjs +197 -0
- package/dist/lib/esm/formatters/dprint.d.mts +15 -0
- package/dist/lib/esm/formatters/dprint.mjs +52 -0
- package/dist/lib/esm/formatters/index.d.mts +2 -0
- package/dist/lib/esm/formatters/index.mjs +46 -0
- package/dist/lib/esm/index.d.mts +16 -0
- package/dist/lib/esm/index.mjs +66 -0
- package/dist/lib/esm/integration-test-setup.d.mts +33 -0
- package/dist/lib/esm/integration-test-setup.mjs +44 -0
- package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +39 -0
- package/dist/lib/esm/integration-test-vitest-global-setup.mjs +57 -0
- package/dist/lib/esm/jest-setup.d.mts +13 -0
- package/dist/lib/esm/jest-setup.mjs +53 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +25 -0
- package/dist/lib/esm/linters/eslint-config.mjs +290 -0
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +14 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +70 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +146 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +90 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +109 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +110 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +212 -0
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +150 -0
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +551 -0
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +138 -0
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +13 -0
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +73 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +157 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +29 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +108 -0
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.d.mts +18 -0
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +167 -0
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +197 -0
- package/dist/lib/esm/linters/eslint.d.mts +15 -0
- package/dist/lib/esm/linters/eslint.mjs +52 -0
- package/dist/lib/esm/linters/index.d.mts +9 -0
- package/dist/lib/esm/linters/index.mjs +60 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +12 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +66 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +46 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +130 -0
- package/dist/lib/esm/linters/markdownlint.d.mts +15 -0
- package/dist/lib/esm/linters/markdownlint.mjs +52 -0
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.d.mts +40 -0
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +67 -0
- package/dist/lib/esm/linters/plugin-names.d.mts +81 -0
- package/dist/lib/esm/linters/plugin-names.mjs +141 -0
- package/dist/lib/esm/obsidian-plugin-repo-paths.d.mts +253 -0
- package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +108 -0
- package/dist/lib/esm/setup.d.mts +21 -0
- package/dist/lib/esm/setup.mjs +55 -0
- package/dist/lib/esm/templates.d.mts +13 -0
- package/dist/lib/esm/templates.mjs +57 -0
- package/dist/lib/esm/test-runners/index.d.mts +4 -0
- package/dist/lib/esm/test-runners/index.mjs +50 -0
- package/dist/lib/esm/test-runners/integration-test-plugin.d.mts +44 -0
- package/dist/lib/esm/test-runners/integration-test-plugin.mjs +94 -0
- package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +27 -0
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +48 -0
- package/dist/lib/esm/test-runners/stale-build-global-setup.d.mts +86 -0
- package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +115 -0
- package/dist/lib/esm/test-runners/vitest-config.d.mts +200 -0
- package/dist/lib/esm/test-runners/vitest-config.mjs +369 -0
- package/dist/lib/esm/version.d.mts +92 -0
- package/dist/lib/esm/version.mjs +160 -0
- package/dist/lib/esm/vitest-setup.d.mts +11 -0
- package/dist/lib/esm/vitest-setup.mjs +53 -0
- package/dist/templates/.markdownlint-cli2.mjs +4 -0
- package/dist/templates/.nano-staged.mjs +4 -0
- package/dist/templates/commitlint.config.ts +3 -0
- package/dist/templates/dprint.json +26 -0
- package/dist/templates/eslint.config.mts +3 -0
- package/dist/templates/scripts/build/build-clean.ts +4 -0
- package/dist/templates/scripts/build/build-compile-svelte.ts +4 -0
- package/dist/templates/scripts/build/build-compile-typescript.ts +4 -0
- package/dist/templates/scripts/build/build-compile.ts +4 -0
- package/dist/templates/scripts/build/build-templates.ts +4 -0
- package/dist/templates/scripts/bundlers/esbuild/build.ts +4 -0
- package/dist/templates/scripts/bundlers/esbuild/dev.ts +4 -0
- package/dist/templates/scripts/commitlint-config.ts +3 -0
- package/dist/templates/scripts/eslint-config.ts +10 -0
- package/dist/templates/scripts/formatters/dprint/format-check.ts +8 -0
- package/dist/templates/scripts/formatters/dprint/format.ts +8 -0
- package/dist/templates/scripts/gate/gate.ts +10 -0
- package/dist/templates/scripts/linters/cspell/spellcheck.ts +8 -0
- package/dist/templates/scripts/linters/eslint/lint-fix.ts +8 -0
- package/dist/templates/scripts/linters/eslint/lint.ts +8 -0
- package/dist/templates/scripts/linters/markdownlint/lint-md-fix.ts +8 -0
- package/dist/templates/scripts/linters/markdownlint/lint-md.ts +8 -0
- package/dist/templates/scripts/linters/over-exposure/find-overexposed-fix.ts +25 -0
- package/dist/templates/scripts/linters/over-exposure/find-overexposed.ts +15 -0
- package/dist/templates/scripts/markdownlint-cli2-config.ts +3 -0
- package/dist/templates/scripts/nano-staged-config.ts +3 -0
- package/dist/templates/scripts/test-runners/vitest/test-coverage.ts +4 -0
- package/dist/templates/scripts/test-runners/vitest/test-watch.ts +4 -0
- package/dist/templates/scripts/test-runners/vitest/test.ts +4 -0
- package/dist/templates/scripts/version/version.ts +10 -0
- package/dist/templates/scripts/vitest-config.ts +3 -0
- package/dist/templates/vitest.config.ts +3 -0
- package/formatters/dprint/package.json +6 -0
- package/formatters/index/package.json +6 -0
- package/formatters/package.json +6 -0
- package/linters/eslint/package.json +6 -0
- package/linters/eslint-config/package.json +6 -0
- package/linters/eslint-rules/index/package.json +6 -0
- package/linters/eslint-rules/manifest-description/package.json +6 -0
- package/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/linters/eslint-rules/manifest-id/package.json +6 -0
- package/linters/eslint-rules/manifest-name/package.json +6 -0
- package/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/linters/eslint-rules/no-local-obsidian-internals/package.json +6 -0
- package/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian/package.json +6 -0
- package/linters/eslint-rules/no-untrusted-input-events/package.json +6 -0
- package/linters/eslint-rules/obsidian-dev-utils-plugin/package.json +6 -0
- package/linters/eslint-rules/package.json +6 -0
- package/linters/eslint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/eslint-rules/plugin-name-as-code-in-ui/package.json +6 -0
- package/linters/eslint-rules/require-component-suffix/package.json +6 -0
- package/linters/eslint-rules/require-plugin-api-contract-schemas/package.json +6 -0
- package/linters/index/package.json +6 -0
- package/linters/markdownlint/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/obsidianmd-rule-custom-message/package.json +6 -0
- package/linters/package.json +6 -0
- package/linters/plugin-names/package.json +6 -0
- package/package.json +302 -13
- package/test-runners/index/package.json +6 -0
- package/test-runners/integration-test-plugin/package.json +6 -0
- package/test-runners/package.json +6 -0
- package/test-runners/performance-eval-cap/package.json +6 -0
- package/test-runners/stale-build-global-setup/package.json +6 -0
- package/test-runners/vitest-config/package.json +6 -0
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
const existingProcess = globalThis.process;
|
|
22
|
+
if (!existingProcess) {
|
|
23
|
+
globalThis.process = browserProcess;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existingProcessRecord = existingProcess;
|
|
30
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
31
|
+
existingProcessRecord[key] ??= value;
|
|
32
|
+
}
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(function initEsm() {
|
|
37
|
+
ensureDisposeSymbols();
|
|
38
|
+
ensureBrowserProcess();
|
|
39
|
+
})();
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
import { createSetup } from "obsidian-integration-testing/vitest-global-setup-plugin";
|
|
43
|
+
import {
|
|
44
|
+
getIntegrationTestPluginPopulate,
|
|
45
|
+
OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID
|
|
46
|
+
} from "./test-runners/integration-test-plugin.mjs";
|
|
47
|
+
const globalSetup = createSetup({
|
|
48
|
+
enableCommunityPlugins: [OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID],
|
|
49
|
+
populate: getIntegrationTestPluginPopulate
|
|
50
|
+
});
|
|
51
|
+
const setup = globalSetup.setup;
|
|
52
|
+
const teardown = globalSetup.teardown;
|
|
53
|
+
export {
|
|
54
|
+
setup,
|
|
55
|
+
teardown
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLXRlc3Qtdml0ZXN0LWdsb2JhbC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFR1cm5rZXkgVml0ZXN0IGBnbG9iYWxTZXR1cGAgZm9yIGEgcGx1Z2luJ3MgaW50ZWdyYXRpb24gdGVzdHM6IGRvZXMgZXZlcnl0aGluZ1xuICogYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgJ3Mgb3duIGdsb2JhbCBzZXR1cCBkb2VzICh0ZW1wIHZhdWx0LCBpbnN0YWxsIGFuZCBlbmFibGUgdGhlXG4gKiBwbHVnaW4tdW5kZXItdGVzdCksIGFuZCBhZGRpdGlvbmFsbHkgc2VlZHMgYW5kIGVuYWJsZXMgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGludGVncmF0aW9uLXRlc3QgaGFybmVzc1xuICogcGx1Z2luLCBzbyBgbGliLjxoZWxwZXI+YCB3b3JrcyBpbnNpZGUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlcy5cbiAqXG4gKiBgYGB0c1xuICogZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4tZGV2LXV0aWxzL2ludGVncmF0aW9uLXRlc3Qtdml0ZXN0LWdsb2JhbC1zZXR1cCddLFxuICogc2V0dXBGaWxlczogW1xuICogICAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnLFxuICogICAnb2JzaWRpYW4tZGV2LXV0aWxzL2ludGVncmF0aW9uLXRlc3Qtc2V0dXAnXG4gKiBdXG4gKiBgYGBcbiAqXG4gKiBSZXBsYWNlcyBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbmA7IGRvIG5vdCBsaXN0IGJvdGguXG4gKlxuICogSWYgdGhlIHByb2plY3QgYWxyZWFkeSBuZWVkcyBpdHMgb3duIGBwb3B1bGF0ZWAgKGRlbW8tdmF1bHQgZml4dHVyZXMsIGEgbGFyZ2UgcGVyZm9ybWFuY2UgdmF1bHQpLCBza2lwXG4gKiB0aGlzIG1vZHVsZSBhbmQgY29tcG9zZSBpbnN0ZWFkIFx1MjAxNCBtZXJnZSB7QGxpbmsgZ2V0SW50ZWdyYXRpb25UZXN0UGx1Z2luUG9wdWxhdGV9IGludG8gdGhhdCBtYXAgYW5kIHBhc3NcbiAqIHtAbGluayBPQlNJRElBTl9ERVZfVVRJTFNfSU5URUdSQVRJT05fVEVTVF9QTFVHSU5fSUR9IHRvIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYDpcbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGNvbnN0IHsgc2V0dXAsIHRlYXJkb3duIH0gPSBjcmVhdGVTZXR1cCh7XG4gKiAgIGVuYWJsZUNvbW11bml0eVBsdWdpbnM6IFtPQlNJRElBTl9ERVZfVVRJTFNfSU5URUdSQVRJT05fVEVTVF9QTFVHSU5fSURdLFxuICogICBwb3B1bGF0ZTogKCkgPT4gKHsgLi4ubXlGaXh0dXJlcygpLCAuLi5nZXRJbnRlZ3JhdGlvblRlc3RQbHVnaW5Qb3B1bGF0ZSgpIH0pXG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGluIGdsb2JhbC1zZXR1cCBnbHVlOyBleGVyY2lzZWQgZW5kLXRvLWVuZCBieSB0aGUgT2JzaWRpYW4gaW50ZWdyYXRpb24gc3VpdGVzLiAqL1xuaW1wb3J0IHsgY3JlYXRlU2V0dXAgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcblxuaW1wb3J0IHtcbiAgZ2V0SW50ZWdyYXRpb25UZXN0UGx1Z2luUG9wdWxhdGUsXG4gIE9CU0lESUFOX0RFVl9VVElMU19JTlRFR1JBVElPTl9URVNUX1BMVUdJTl9JRFxufSBmcm9tICcuL3Rlc3QtcnVubmVycy9pbnRlZ3JhdGlvbi10ZXN0LXBsdWdpbi50cyc7XG5cbmNvbnN0IGdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoe1xuICBlbmFibGVDb21tdW5pdHlQbHVnaW5zOiBbT0JTSURJQU5fREVWX1VUSUxTX0lOVEVHUkFUSU9OX1RFU1RfUExVR0lOX0lEXSxcbiAgcG9wdWxhdGU6IGdldEludGVncmF0aW9uVGVzdFBsdWdpblBvcHVsYXRlXG59KTtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwOiBjcmVhdGVzIHRoZSB0ZW1wIHZhdWx0LCBpbnN0YWxscyBhbmQgZW5hYmxlcyB0aGUgcGx1Z2luLXVuZGVyLXRlc3QsIHRoZW4gc2VlZHMgYW5kXG4gKiBlbmFibGVzIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBpbnRlZ3JhdGlvbi10ZXN0IGhhcm5lc3MgcGx1Z2luIGFsb25nc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwID0gZ2xvYmFsU2V0dXAuc2V0dXA7XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93bjogcmVtb3ZlcyB0aGUgdGVtcCB2YXVsdCBhbmQgZGlzcG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlYXJkb3duID0gZ2xvYmFsU2V0dXAudGVhcmRvd247XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsU0FBUyxtQkFBbUI7QUFFNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLGNBQWMsWUFBWTtBQUFBLEVBQzlCLHdCQUF3QixDQUFDLDZDQUE2QztBQUFBLEVBQ3RFLFVBQVU7QUFDWixDQUFDO0FBTU0sTUFBTSxRQUFRLFlBQVk7QUFLMUIsTUFBTSxXQUFXLFlBQVk7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference path="./index.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Jest setup file for Obsidian plugins built on `@mnaoumov/obsidian-lib`.
|
|
6
|
+
*
|
|
7
|
+
* Add it to your Jest config's `setupFilesAfterEach` (or import it from another setup file). Before
|
|
8
|
+
* each test it resets the generic shared-state slot, the `__obsidianDevUtils` bag and the library contexts, and enables async-operation tracking; after each test it
|
|
9
|
+
* disables tracking, so tests can `await waitForAllAsyncOperations()` against isolated state.
|
|
10
|
+
*
|
|
11
|
+
* This is a per-test setup file, not a Jest `globalSetup` module, so it has no default export.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
const existingProcess = globalThis.process;
|
|
22
|
+
if (!existingProcess) {
|
|
23
|
+
globalThis.process = browserProcess;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existingProcessRecord = existingProcess;
|
|
30
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
31
|
+
existingProcessRecord[key] ??= value;
|
|
32
|
+
}
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(function initEsm() {
|
|
37
|
+
ensureDisposeSymbols();
|
|
38
|
+
ensureBrowserProcess();
|
|
39
|
+
})();
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
import {
|
|
43
|
+
afterAll,
|
|
44
|
+
afterEach,
|
|
45
|
+
beforeEach
|
|
46
|
+
} from "@jest/globals";
|
|
47
|
+
import { setup } from "./setup.mjs";
|
|
48
|
+
setup({
|
|
49
|
+
afterAll,
|
|
50
|
+
afterEach,
|
|
51
|
+
beforeEach
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2plc3Qtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBKZXN0IHNldHVwIGZpbGUgZm9yIE9ic2lkaWFuIHBsdWdpbnMgYnVpbHQgb24gYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgLlxuICpcbiAqIEFkZCBpdCB0byB5b3VyIEplc3QgY29uZmlnJ3MgYHNldHVwRmlsZXNBZnRlckVhY2hgIChvciBpbXBvcnQgaXQgZnJvbSBhbm90aGVyIHNldHVwIGZpbGUpLiBCZWZvcmVcbiAqIGVhY2ggdGVzdCBpdCByZXNldHMgdGhlIGdlbmVyaWMgc2hhcmVkLXN0YXRlIHNsb3QsIHRoZSBgX19vYnNpZGlhbkRldlV0aWxzYCBiYWcgYW5kIHRoZSBsaWJyYXJ5IGNvbnRleHRzLCBhbmQgZW5hYmxlcyBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmc7IGFmdGVyIGVhY2ggdGVzdCBpdFxuICogZGlzYWJsZXMgdHJhY2tpbmcsIHNvIHRlc3RzIGNhbiBgYXdhaXQgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpYCBhZ2FpbnN0IGlzb2xhdGVkIHN0YXRlLlxuICpcbiAqIFRoaXMgaXMgYSBwZXItdGVzdCBzZXR1cCBmaWxlLCBub3QgYSBKZXN0IGBnbG9iYWxTZXR1cGAgbW9kdWxlLCBzbyBpdCBoYXMgbm8gZGVmYXVsdCBleHBvcnQuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFRoaW4gSmVzdCBzZXR1cC1maWxlIGdsdWU7IHNldHVwIGlzIHVuaXQtdGVzdGVkIHNlcGFyYXRlbHkuICovXG5pbXBvcnQge1xuICBhZnRlckFsbCxcbiAgYWZ0ZXJFYWNoLFxuICBiZWZvcmVFYWNoXG59IGZyb20gJ0BqZXN0L2dsb2JhbHMnO1xuXG5pbXBvcnQgeyBzZXR1cCB9IGZyb20gJy4vc2V0dXAudHMnO1xuXG5zZXR1cCh7XG4gIGFmdGVyQWxsLFxuICBhZnRlckVhY2gsXG4gIGJlZm9yZUVhY2hcbn0pO1xuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxhQUFhO0FBRXRCLE1BQU07QUFBQSxFQUNKO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/// <reference path="../index.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The shared ESLint configuration for Obsidian plugins.
|
|
6
|
+
*
|
|
7
|
+
* It is the generic configuration of `@mnaoumov/typescript-dev-toolkit` plus the Obsidian layers alone:
|
|
8
|
+
* `eslint-plugin-obsidianmd`'s recommended rules, the root `manifest.json` and `LICENSE`, the Node-builtins exemptions
|
|
9
|
+
* of desktop-only modules and tests, the integration-test rules and the Obsidian in-house rules.
|
|
10
|
+
*/
|
|
11
|
+
import type { DefineEslintConfigsOptions } from '@mnaoumov/typescript-dev-toolkit/linters/eslint-config';
|
|
12
|
+
import type { Linter } from 'eslint';
|
|
13
|
+
import { EslintConfigContext } from '@mnaoumov/typescript-dev-toolkit/linters/eslint-config';
|
|
14
|
+
export type { DefineEslintConfigsOptions };
|
|
15
|
+
export { EslintConfigContext };
|
|
16
|
+
/**
|
|
17
|
+
* Build ESLint configurations.
|
|
18
|
+
*
|
|
19
|
+
* This function builds the ESLint configurations of an Obsidian plugin: the generic configuration of
|
|
20
|
+
* `@mnaoumov/typescript-dev-toolkit` plus the Obsidian layers.
|
|
21
|
+
*
|
|
22
|
+
* @param options - The parameters for defining ESLint configurations.
|
|
23
|
+
* @returns The ESLint configurations.
|
|
24
|
+
*/
|
|
25
|
+
export declare function defineEslintConfigs(options?: DefineEslintConfigsOptions): Linter.Config[];
|
|
@@ -0,0 +1,290 @@
|
|
|
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
|
+
const existingProcess = globalThis.process;
|
|
22
|
+
if (!existingProcess) {
|
|
23
|
+
globalThis.process = browserProcess;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existingProcessRecord = existingProcess;
|
|
30
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
31
|
+
existingProcessRecord[key] ??= value;
|
|
32
|
+
}
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(function initEsm() {
|
|
37
|
+
ensureDisposeSymbols();
|
|
38
|
+
ensureBrowserProcess();
|
|
39
|
+
})();
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
import {
|
|
43
|
+
createDefaultEslintConfigContext,
|
|
44
|
+
EslintConfigContext,
|
|
45
|
+
getEslintCoreConfigs,
|
|
46
|
+
getGlobalIgnoreConfigs,
|
|
47
|
+
getTypeScriptEslintConfigs
|
|
48
|
+
} from "@mnaoumov/typescript-dev-toolkit/linters/eslint-config";
|
|
49
|
+
import { join } from "@mnaoumov/typescript-lib/path";
|
|
50
|
+
import obsidianmd from "eslint-plugin-obsidianmd";
|
|
51
|
+
import { PlainTextParser } from "eslint-plugin-obsidianmd/dist/lib/plainTextParser.js";
|
|
52
|
+
import { defineConfig } from "eslint/config";
|
|
53
|
+
import { ObsidianPluginRepoPaths } from "../obsidian-plugin-repo-paths.mjs";
|
|
54
|
+
import { jsonPlugin } from "./eslint-rules/manifest-helpers.mjs";
|
|
55
|
+
import { obsidianDevUtilsPlugin } from "./eslint-rules/obsidian-dev-utils-plugin.mjs";
|
|
56
|
+
import { stripOwnedRuleCustomMessageEntries } from "./obsidianmd-rule-custom-message.mjs";
|
|
57
|
+
const MINIMUM_NODE_VERSION = ">=16.16.0";
|
|
58
|
+
function defineEslintConfigs(options = {}) {
|
|
59
|
+
const context = createDefaultEslintConfigContext();
|
|
60
|
+
if (options.editContext) {
|
|
61
|
+
options.editContext(context);
|
|
62
|
+
}
|
|
63
|
+
const customConfigs = options.customConfigs?.(context) ?? [];
|
|
64
|
+
return defineConfig(
|
|
65
|
+
...getGlobalIgnoreConfigs(),
|
|
66
|
+
...getObsidianLintConfigs(context),
|
|
67
|
+
...getTypeScriptEslintConfigs({ context, inHousePlugin: obsidianDevUtilsPlugin, minimumNodeVersion: MINIMUM_NODE_VERSION }),
|
|
68
|
+
...getObsidianOverrideConfigs(context),
|
|
69
|
+
...getNodeBuiltinsConfigs(context),
|
|
70
|
+
...getIntegrationTestConfigs(context),
|
|
71
|
+
...getManifestConfigs(),
|
|
72
|
+
...getLicenseConfigs(),
|
|
73
|
+
...customConfigs
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
function getIntegrationTestConfigs(context) {
|
|
77
|
+
return defineConfig([
|
|
78
|
+
{
|
|
79
|
+
/*
|
|
80
|
+
* An integration test that drives the UI with `dispatchEvent(new KeyboardEvent(...))` produces an
|
|
81
|
+
* UNTRUSTED event, and Obsidian and CodeMirror gate on `isTrusted` — so the test can exercise
|
|
82
|
+
* nothing while still passing. Only integration tests are covered: a unit test has no real input
|
|
83
|
+
* pipeline to reach, so dispatching is the only thing it can do.
|
|
84
|
+
*
|
|
85
|
+
* Android files used to be exempt BY FILENAME, on the grounds that the trusted helpers were built on
|
|
86
|
+
* `window.electron` and so could not be reached from a phone at all. That exemption is gone: the
|
|
87
|
+
* harness gained a mobile trusted-input path, and `clickElement`, `clickMouse`, `pressKey` and
|
|
88
|
+
* `typeIntoEditor` all work there. Only the hover helpers still throw, because `:hover` has no touch
|
|
89
|
+
* equivalent — a file reaching for those has to branch on `Platform.isDesktopApp`, which is the same
|
|
90
|
+
* thing a `*.cross-platform.*` file has always had to do.
|
|
91
|
+
*/
|
|
92
|
+
files: context.sourceFolders.map((sourceFolder) => join(sourceFolder, ObsidianPluginRepoPaths.AnyPath, ObsidianPluginRepoPaths.AnyIntegrationTestTs)),
|
|
93
|
+
rules: {
|
|
94
|
+
"obsidian-dev-utils/no-untrusted-input-events": "error"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
function getLicenseConfigs() {
|
|
100
|
+
return defineConfig([
|
|
101
|
+
{
|
|
102
|
+
files: [ObsidianPluginRepoPaths.License],
|
|
103
|
+
languageOptions: {
|
|
104
|
+
parser: PlainTextParser
|
|
105
|
+
},
|
|
106
|
+
plugins: {
|
|
107
|
+
obsidianmd
|
|
108
|
+
},
|
|
109
|
+
rules: {
|
|
110
|
+
"obsidianmd/validate-license": "error"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
function getManifestConfigs() {
|
|
116
|
+
return defineConfig([
|
|
117
|
+
{
|
|
118
|
+
files: [ObsidianPluginRepoPaths.ManifestJson],
|
|
119
|
+
language: "json/json",
|
|
120
|
+
plugins: {
|
|
121
|
+
"json": jsonPlugin,
|
|
122
|
+
"obsidian-dev-utils": obsidianDevUtilsPlugin
|
|
123
|
+
},
|
|
124
|
+
rules: {
|
|
125
|
+
"obsidian-dev-utils/manifest-description": "error",
|
|
126
|
+
"obsidian-dev-utils/manifest-id": "error",
|
|
127
|
+
"obsidian-dev-utils/manifest-name": "error",
|
|
128
|
+
"obsidian-dev-utils/manifest-schema": "error"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
function getNodeBuiltinsConfigs(context) {
|
|
134
|
+
return defineConfig([
|
|
135
|
+
{
|
|
136
|
+
// Integration tests run in a Node environment and legitimately read files / paths, so the Node-builtins bans do not apply to them.
|
|
137
|
+
files: context.sourceFolders.map((sourceFolder) => join(sourceFolder, ObsidianPluginRepoPaths.AnyPath, ObsidianPluginRepoPaths.AnyIntegrationTestTs)),
|
|
138
|
+
rules: {
|
|
139
|
+
"import-x/no-nodejs-modules": "off",
|
|
140
|
+
"obsidianmd/no-nodejs-modules": "off"
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
/*
|
|
145
|
+
* A `desktop-` prefixed module is desktop-only by convention: it is reached only through a
|
|
146
|
+
* `Platform.isDesktopApp`-gated dynamic `import()` in its caller, so its static Node imports never
|
|
147
|
+
* load on mobile. Neither rule can see that gate, because it sits one file up — the correctly-written pattern
|
|
148
|
+
* reports anyway, and no author-side rewrite silences it.
|
|
149
|
+
*
|
|
150
|
+
* Exempting BY FILENAME rather than by a disable comment carries a trade-off knowingly: the exemption keys
|
|
151
|
+
* off what the file is NAMED rather than what it does, so the prefix is load-bearing. A desktop-only module
|
|
152
|
+
* that skips the prefix keeps reporting, and a cross-platform module that wrongly takes it gets an exemption
|
|
153
|
+
* it should not have.
|
|
154
|
+
*/
|
|
155
|
+
files: context.sourceFolders.map((sourceFolder) => join(sourceFolder, ObsidianPluginRepoPaths.AnyPath, ObsidianPluginRepoPaths.AnyDesktopTs)),
|
|
156
|
+
rules: {
|
|
157
|
+
"import-x/no-nodejs-modules": "off",
|
|
158
|
+
"obsidianmd/no-nodejs-modules": "off"
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
/*
|
|
163
|
+
* A unit test runs under vitest in Node and is never bundled into `main.js`, so the Node-builtins bans do not
|
|
164
|
+
* apply to it either — the identical argument the integration-test block above already accepts. This also
|
|
165
|
+
* covers the SUT-grouped `*.desktop.test.ts` shape, which names the platform as a dot segment after the
|
|
166
|
+
* subject under test rather than as a `desktop-` prefix.
|
|
167
|
+
*/
|
|
168
|
+
files: context.testFiles,
|
|
169
|
+
rules: {
|
|
170
|
+
"import-x/no-nodejs-modules": "off",
|
|
171
|
+
"obsidianmd/no-nodejs-modules": "off"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
]);
|
|
175
|
+
}
|
|
176
|
+
function getObsidianLintConfigs(context) {
|
|
177
|
+
const obsidianRecommendedConfigs = obsidianmd.configs.recommended;
|
|
178
|
+
const ownedRuleNames = new Set(getEslintCoreConfigs(context).flatMap((config) => Object.keys(config.rules ?? {})));
|
|
179
|
+
const scopedObsidianRecommendedConfigs = obsidianRecommendedConfigs.map((config) => {
|
|
180
|
+
return config.files?.includes("package.json") ? config : {
|
|
181
|
+
...stripOwnedRuleCustomMessageEntries({ config, ownedRuleNames }),
|
|
182
|
+
files: context.sourceFiles
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
return defineConfig([
|
|
186
|
+
{
|
|
187
|
+
extends: [scopedObsidianRecommendedConfigs],
|
|
188
|
+
plugins: {
|
|
189
|
+
obsidianmd
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
]);
|
|
193
|
+
}
|
|
194
|
+
function getObsidianOverrideConfigs(context) {
|
|
195
|
+
return defineConfig([
|
|
196
|
+
{
|
|
197
|
+
files: context.sourceFolders.map((sourceFolder) => join(sourceFolder, ObsidianPluginRepoPaths.MainTs)),
|
|
198
|
+
rules: {
|
|
199
|
+
"import-x/no-default-export": "off"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
files: context.allFiles(),
|
|
204
|
+
plugins: {
|
|
205
|
+
"obsidian-dev-utils": obsidianDevUtilsPlugin
|
|
206
|
+
},
|
|
207
|
+
rules: {
|
|
208
|
+
/*
|
|
209
|
+
* Deliberately here, on `allFiles()`, rather than beside `no-untrusted-input-events` in
|
|
210
|
+
* `getIntegrationTestConfigs()` (owner, 2026-09-09). An `evalInObsidian` call is unmistakable, so a
|
|
211
|
+
* file that makes none is untouched and a broad glob costs nothing -- while script code that drives
|
|
212
|
+
* a real Obsidian outside a test (`demo-vault-buttons.ts`) is under the same transport cap and would
|
|
213
|
+
* otherwise be enforced nowhere.
|
|
214
|
+
*/
|
|
215
|
+
"obsidian-dev-utils/no-over-cap-wait-in-eval-in-obsidian": "error",
|
|
216
|
+
"obsidian-dev-utils/require-component-suffix": "error",
|
|
217
|
+
/*
|
|
218
|
+
* Obsidian's `Component` has its own `removeChild(component)` for the component lifecycle, unrelated
|
|
219
|
+
* to `Node#removeChild`. The rule matches on the method name alone, so every report here is a
|
|
220
|
+
* component being unloaded, and following the advice calls a `remove()` that does not exist -- which
|
|
221
|
+
* is what `tsc` said when the fixer was let loose on them.
|
|
222
|
+
*/
|
|
223
|
+
"unicorn/prefer-dom-node-remove": "off",
|
|
224
|
+
/*
|
|
225
|
+
* Directly contradicts `obsidianmd/no-global-this`: this rule rewrites `window.x` to `globalThis.x`, and
|
|
226
|
+
* that one forbids `globalThis` outright. With both enabled, `--fix` applies one and then the other
|
|
227
|
+
* reverts it, which ESLint reports as `ESLintCircularFixesWarning` across 29 files. Obsidian's own
|
|
228
|
+
* guidance wins in an Obsidian library, so this is the rule that gives way.
|
|
229
|
+
*/
|
|
230
|
+
"unicorn/prefer-global-this": "off"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
/*
|
|
235
|
+
* Obsidian's internal API is typed in `obsidian-typings`, so a `declare module 'obsidian'` augmentation in
|
|
236
|
+
* shipped source may carry only the plugin's own custom-event overloads. Tests are exempt: a mock shape or a
|
|
237
|
+
* harness global never ships.
|
|
238
|
+
*/
|
|
239
|
+
files: context.sourceFiles,
|
|
240
|
+
ignores: context.testFiles,
|
|
241
|
+
plugins: {
|
|
242
|
+
"obsidian-dev-utils": obsidianDevUtilsPlugin
|
|
243
|
+
},
|
|
244
|
+
rules: {
|
|
245
|
+
"obsidian-dev-utils/no-local-obsidian-internals": "error"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
/*
|
|
250
|
+
* Every method entry of a plugin API contract carries an `input` and an `output` schema, so a `{}` entry that
|
|
251
|
+
* validates nothing cannot come back where the contract type is untyped and the compiler does not refuse it.
|
|
252
|
+
* Tests are exempt: they may publish a deliberately broken contract.
|
|
253
|
+
*
|
|
254
|
+
* Registered but OFF: several providers and consumers still carry `{}` entries, and turning it on first would
|
|
255
|
+
* make their lint red. Switch it to `'error'` once none is left.
|
|
256
|
+
*/
|
|
257
|
+
files: context.sourceFiles,
|
|
258
|
+
ignores: context.testFiles,
|
|
259
|
+
plugins: {
|
|
260
|
+
"obsidian-dev-utils": obsidianDevUtilsPlugin
|
|
261
|
+
},
|
|
262
|
+
rules: {
|
|
263
|
+
"obsidian-dev-utils/require-plugin-api-contract-schemas": "off"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
/*
|
|
268
|
+
* A plugin's display name is marked as code: backticks in a comment (`plugin-name-as-code`, autofixed), a
|
|
269
|
+
* `<code>` element in UI (`plugin-name-as-code-in-ui`, reported only).
|
|
270
|
+
*
|
|
271
|
+
* Registered but OFF: repositories still carry plain plugin names from before the rules existed, and turning
|
|
272
|
+
* them on first would make their lint red. Switch them to `'error'` once those are fixed. Both take
|
|
273
|
+
* `{ additionalPluginNames: [...] }` for names the shared list lacks.
|
|
274
|
+
*/
|
|
275
|
+
files: context.allFiles(),
|
|
276
|
+
plugins: {
|
|
277
|
+
"obsidian-dev-utils": obsidianDevUtilsPlugin
|
|
278
|
+
},
|
|
279
|
+
rules: {
|
|
280
|
+
"obsidian-dev-utils/plugin-name-as-code": "off",
|
|
281
|
+
"obsidian-dev-utils/plugin-name-as-code-in-ui": "off"
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
]);
|
|
285
|
+
}
|
|
286
|
+
export {
|
|
287
|
+
EslintConfigContext,
|
|
288
|
+
defineEslintConfigs
|
|
289
|
+
};
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBzaGFyZWQgRVNMaW50IGNvbmZpZ3VyYXRpb24gZm9yIE9ic2lkaWFuIHBsdWdpbnMuXG4gKlxuICogSXQgaXMgdGhlIGdlbmVyaWMgY29uZmlndXJhdGlvbiBvZiBgQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXRgIHBsdXMgdGhlIE9ic2lkaWFuIGxheWVycyBhbG9uZTpcbiAqIGBlc2xpbnQtcGx1Z2luLW9ic2lkaWFubWRgJ3MgcmVjb21tZW5kZWQgcnVsZXMsIHRoZSByb290IGBtYW5pZmVzdC5qc29uYCBhbmQgYExJQ0VOU0VgLCB0aGUgTm9kZS1idWlsdGlucyBleGVtcHRpb25zXG4gKiBvZiBkZXNrdG9wLW9ubHkgbW9kdWxlcyBhbmQgdGVzdHMsIHRoZSBpbnRlZ3JhdGlvbi10ZXN0IHJ1bGVzIGFuZCB0aGUgT2JzaWRpYW4gaW4taG91c2UgcnVsZXMuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlY2xhcmF0aXZlIEVTTGludCBydWxlL3BsdWdpbiBjb25maWd1cmF0aW9uOyBjb3JyZWN0bmVzcyBpcyB2ZXJpZmllZCBieSBydW5uaW5nIEVTTGludCwgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRGVmaW5lRXNsaW50Q29uZmlnc09wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9saW50ZXJzL2VzbGludC1jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBMaW50ZXIgfSBmcm9tICdlc2xpbnQnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVEZWZhdWx0RXNsaW50Q29uZmlnQ29udGV4dCxcbiAgRXNsaW50Q29uZmlnQ29udGV4dCxcbiAgZ2V0RXNsaW50Q29yZUNvbmZpZ3MsXG4gIGdldEdsb2JhbElnbm9yZUNvbmZpZ3MsXG4gIGdldFR5cGVTY3JpcHRFc2xpbnRDb25maWdzXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvZXNsaW50LWNvbmZpZyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLXJlbmFtZS1kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBwbHVnaW5gIGlzIHRvbyBjb25mdXNpbmcuXG5pbXBvcnQgb2JzaWRpYW5tZCBmcm9tICdlc2xpbnQtcGx1Z2luLW9ic2lkaWFubWQnO1xuaW1wb3J0IHsgUGxhaW5UZXh0UGFyc2VyIH0gZnJvbSAnZXNsaW50LXBsdWdpbi1vYnNpZGlhbm1kL2Rpc3QvbGliL3BsYWluVGV4dFBhcnNlci5qcyc7XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICdlc2xpbnQvY29uZmlnJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBqc29uUGx1Z2luIH0gZnJvbSAnLi9lc2xpbnQtcnVsZXMvbWFuaWZlc3QtaGVscGVycy50cyc7XG5pbXBvcnQgeyBvYnNpZGlhbkRldlV0aWxzUGx1Z2luIH0gZnJvbSAnLi9lc2xpbnQtcnVsZXMvb2JzaWRpYW4tZGV2LXV0aWxzLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBzdHJpcE93bmVkUnVsZUN1c3RvbU1lc3NhZ2VFbnRyaWVzIH0gZnJvbSAnLi9vYnNpZGlhbm1kLXJ1bGUtY3VzdG9tLW1lc3NhZ2UudHMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZXhwb3J0LWZyb20gLS0gUmUtZXhwb3J0ZWQgc28gYSBwbHVnaW4ncyBgc2NyaXB0cy9lc2xpbnQtY29uZmlnLnRzYCBrZWVwcyBpbXBvcnRpbmcgYm90aCBmcm9tIGhlcmUuXG5leHBvcnQgdHlwZSB7IERlZmluZUVzbGludENvbmZpZ3NPcHRpb25zIH07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZXhwb3J0LWZyb20gLS0gUmUtZXhwb3J0ZWQgc28gYSBwbHVnaW4ncyBgc2NyaXB0cy9lc2xpbnQtY29uZmlnLnRzYCBrZWVwcyBpbXBvcnRpbmcgYm90aCBmcm9tIGhlcmUuXG5leHBvcnQgeyBFc2xpbnRDb25maWdDb250ZXh0IH07XG5cbi8qXG4gKiBUaGUgbWluaW11bSBPYnNpZGlhbiBpbnN0YWxsZXIgdGhhdCBzdGlsbCByZWNlaXZlcyBhcHAgdXBkYXRlcyBhbmQgd29ya3MgaXMgMS4xLjksIHdoaWNoIHNoaXBzIEVsZWN0cm9uXG4gKiAyMS4zLjMgYW5kIHJ1bnMgTm9kZSAxNi4xNi4wLiBTaGlwcGVkIHNvdXJjZSBtdXN0IHRoZXJlZm9yZSBhdm9pZCBOb2RlL0VTIHJ1bnRpbWUgYnVpbHRpbnMgdW5hdmFpbGFibGUgaW5cbiAqIHRoYXQgdmVyc2lvbi4gVGVzdHMgYW5kIHNjcmlwdHMgYXJlIGRldi1vbmx5IGFuZCBleGVtcHQuXG4gKlxuICogU291cmNlIG9mIHRydXRoOiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy9tZXRhZGF0YS5qc29uYCBcdTIwMTQgdGhlIG5ld2VzdCByZWxlYXNlIGNhcnJ5aW5nIHRoZSBmaWVsZFxuICogKDEuMTMuMSkgZGVjbGFyZXMgYG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogXCIxLjEuOVwiYCwgYW5kIHRoYXQgaW5zdGFsbGVyJ3MgYHJ1bnRpbWVWZXJzaW9uc2AgZ2l2ZXMgdGhlXG4gKiBFbGVjdHJvbiBhbmQgTm9kZSB2ZXJzaW9ucyBhYm92ZS4gUmUtZGVyaXZlIGZyb20gdGhlcmUgcmF0aGVyIHRoYW4gZWRpdGluZyB0aGlzIG51bWJlciBieSBoYW5kLlxuICovXG5jb25zdCBNSU5JTVVNX05PREVfVkVSU0lPTiA9ICc+PTE2LjE2LjAnO1xuXG4vKipcbiAqIEJ1aWxkIEVTTGludCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgRVNMaW50IGNvbmZpZ3VyYXRpb25zIG9mIGFuIE9ic2lkaWFuIHBsdWdpbjogdGhlIGdlbmVyaWMgY29uZmlndXJhdGlvbiBvZlxuICogYEBtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0YCBwbHVzIHRoZSBPYnNpZGlhbiBsYXllcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGVmaW5pbmcgRVNMaW50IGNvbmZpZ3VyYXRpb25zLlxuICogQHJldHVybnMgVGhlIEVTTGludCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUVzbGludENvbmZpZ3Mob3B0aW9uczogRGVmaW5lRXNsaW50Q29uZmlnc09wdGlvbnMgPSB7fSk6IExpbnRlci5Db25maWdbXSB7XG4gIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVEZWZhdWx0RXNsaW50Q29uZmlnQ29udGV4dCgpO1xuXG4gIGlmIChvcHRpb25zLmVkaXRDb250ZXh0KSB7XG4gICAgb3B0aW9ucy5lZGl0Q29udGV4dChjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbUNvbmZpZ3MgPSBvcHRpb25zLmN1c3RvbUNvbmZpZ3M/Lihjb250ZXh0KSA/PyBbXTtcblxuICByZXR1cm4gZGVmaW5lQ29uZmlnKFxuICAgIC4uLmdldEdsb2JhbElnbm9yZUNvbmZpZ3MoKSxcbiAgICAvLyBPYnNpZGlhbm1kIGNvbmZpZ3MgcnVuIGZpcnN0IHNvIG91ciBzdHJpY3RlciBydWxlcyBvdmVycmlkZSB0aGVpciByZWxheGVkIGRlZmF1bHRzXG4gICAgLi4uZ2V0T2JzaWRpYW5MaW50Q29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRUeXBlU2NyaXB0RXNsaW50Q29uZmlncyh7IGNvbnRleHQsIGluSG91c2VQbHVnaW46IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW4sIG1pbmltdW1Ob2RlVmVyc2lvbjogTUlOSU1VTV9OT0RFX1ZFUlNJT04gfSksXG4gICAgLi4uZ2V0T2JzaWRpYW5PdmVycmlkZUNvbmZpZ3MoY29udGV4dCksXG4gICAgLi4uZ2V0Tm9kZUJ1aWx0aW5zQ29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRJbnRlZ3JhdGlvblRlc3RDb25maWdzKGNvbnRleHQpLFxuICAgIC4uLmdldE1hbmlmZXN0Q29uZmlncygpLFxuICAgIC4uLmdldExpY2Vuc2VDb25maWdzKCksXG4gICAgLi4uY3VzdG9tQ29uZmlnc1xuICApO1xufVxuZnVuY3Rpb24gZ2V0SW50ZWdyYXRpb25UZXN0Q29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgLypcbiAgICAgICAqIEFuIGludGVncmF0aW9uIHRlc3QgdGhhdCBkcml2ZXMgdGhlIFVJIHdpdGggYGRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoLi4uKSlgIHByb2R1Y2VzIGFuXG4gICAgICAgKiBVTlRSVVNURUQgZXZlbnQsIGFuZCBPYnNpZGlhbiBhbmQgQ29kZU1pcnJvciBnYXRlIG9uIGBpc1RydXN0ZWRgIFx1MjAxNCBzbyB0aGUgdGVzdCBjYW4gZXhlcmNpc2VcbiAgICAgICAqIG5vdGhpbmcgd2hpbGUgc3RpbGwgcGFzc2luZy4gT25seSBpbnRlZ3JhdGlvbiB0ZXN0cyBhcmUgY292ZXJlZDogYSB1bml0IHRlc3QgaGFzIG5vIHJlYWwgaW5wdXRcbiAgICAgICAqIHBpcGVsaW5lIHRvIHJlYWNoLCBzbyBkaXNwYXRjaGluZyBpcyB0aGUgb25seSB0aGluZyBpdCBjYW4gZG8uXG4gICAgICAgKlxuICAgICAgICogQW5kcm9pZCBmaWxlcyB1c2VkIHRvIGJlIGV4ZW1wdCBCWSBGSUxFTkFNRSwgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGUgdHJ1c3RlZCBoZWxwZXJzIHdlcmUgYnVpbHQgb25cbiAgICAgICAqIGB3aW5kb3cuZWxlY3Ryb25gIGFuZCBzbyBjb3VsZCBub3QgYmUgcmVhY2hlZCBmcm9tIGEgcGhvbmUgYXQgYWxsLiBUaGF0IGV4ZW1wdGlvbiBpcyBnb25lOiB0aGVcbiAgICAgICAqIGhhcm5lc3MgZ2FpbmVkIGEgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCwgYW5kIGBjbGlja0VsZW1lbnRgLCBgY2xpY2tNb3VzZWAsIGBwcmVzc0tleWAgYW5kXG4gICAgICAgKiBgdHlwZUludG9FZGl0b3JgIGFsbCB3b3JrIHRoZXJlLiBPbmx5IHRoZSBob3ZlciBoZWxwZXJzIHN0aWxsIHRocm93LCBiZWNhdXNlIGA6aG92ZXJgIGhhcyBubyB0b3VjaFxuICAgICAgICogZXF1aXZhbGVudCBcdTIwMTQgYSBmaWxlIHJlYWNoaW5nIGZvciB0aG9zZSBoYXMgdG8gYnJhbmNoIG9uIGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgLCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAgICogdGhpbmcgYSBgKi5jcm9zcy1wbGF0Zm9ybS4qYCBmaWxlIGhhcyBhbHdheXMgaGFkIHRvIGRvLlxuICAgICAgICovXG4gICAgICBmaWxlczogY29udGV4dC5zb3VyY2VGb2xkZXJzLm1hcCgoc291cmNlRm9sZGVyKSA9PiBqb2luKHNvdXJjZUZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQW55UGF0aCwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQW55SW50ZWdyYXRpb25UZXN0VHMpKSxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6ICdlcnJvcidcbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG4vKlxuICogVGhlIENvbW11bml0eSBkaXJlY3RvcnkgcmVxdWlyZXMgYSByb290IGBMSUNFTlNFYCwgYW5kIGBvYnNpZGlhbm1kL3ZhbGlkYXRlLWxpY2Vuc2VgIGlzIHRoZSBvbmx5IGNoZWNrXG4gKiBvbiB3aGF0IGl0IHNheXM6IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG11c3Qgbm90IHN0aWxsIGJlIHRoZSBzYW1wbGUgcGx1Z2luJ3MsIGFuZCB0aGUgeWVhciBtdXN0IGJlXG4gKiBjdXJyZW50LiBCb3RoIG5lZWQgYFBsYWluVGV4dFBhcnNlcmAsIHdoaWNoIHRoZSBwbHVnaW4gZG9lcyBub3QgZXhwb3J0LCBzbyBpdCBpcyByZWFjaGVkIHRocm91Z2ggaXRzXG4gKiBidWlsZCBvdXRwdXQgLS0gdGhlIHBhY2thZ2UgZGVjbGFyZXMgbm8gYGV4cG9ydHNgIG1hcCBhbmQgc2hpcHMgYSBkZWNsYXJhdGlvbiBiZXNpZGUgdGhlIG1vZHVsZSwgc28gdGhlXG4gKiBkZWVwIHBhdGggcmVzb2x2ZXMsIGJ1dCBpdCBpcyB0aGUgb25lIGltcG9ydCBoZXJlIHRoYXQgYSBwYXRjaCByZWxlYXNlIHVwc3RyZWFtIGNvdWxkIGJyZWFrLlxuICpcbiAqIFRoZSBydWxlIGNvbXBhcmVzIHRoZSB5ZWFyIGFnYWluc3QgYG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKWAgYXQgbGludCB0aW1lLCBzbyBhIHJlcG8gZ29lcyByZWQgYXQgdGhlXG4gKiB0dXJuIG9mIHRoZSB5ZWFyIHVudGlsIGl0cyBMSUNFTlNFIGlzIGJ1bXBlZC4gYC5naXRodWIvd29ya2Zsb3dzL3VwZGF0ZS1saWNlbnNlLXllYXIueW1sYCBkb2VzIHRoYXQgb25cbiAqIDEgSmFudWFyeTsgYSByZXBvIGFkb3B0aW5nIHRoaXMgY29uZmlnIG5lZWRzIHRoZSBzYW1lIHdvcmtmbG93LCBvciB0aGUgeWVhciBjaGVjayB3aWxsIGZhaWwgaXRzIENJLlxuICovXG5mdW5jdGlvbiBnZXRMaWNlbnNlQ29uZmlncygpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFtcbiAgICB7XG4gICAgICBmaWxlczogW09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkxpY2Vuc2VdLFxuICAgICAgbGFuZ3VhZ2VPcHRpb25zOiB7XG4gICAgICAgIHBhcnNlcjogUGxhaW5UZXh0UGFyc2VyXG4gICAgICB9LFxuICAgICAgcGx1Z2luczoge1xuICAgICAgICBvYnNpZGlhbm1kXG4gICAgICB9LFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ29ic2lkaWFubWQvdmFsaWRhdGUtbGljZW5zZSc6ICdlcnJvcidcbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG4vKlxuICogVGhlIHJvb3QgYG1hbmlmZXN0Lmpzb25gIGlzIHdoYXQgdGhlIENvbW11bml0eSBkaXJlY3RvcnkncyBhdXRvbWF0ZWQgcmV2aWV3IGFjdHVhbGx5IHJlYWRzLCBhbmQgdW50aWxcbiAqIHRoaXMgY29uZmlnIGV4aXN0ZWQgbm8gbGludGVyIHJlYWQgaXQgYXQgYWxsOiBgb2JzaWRpYW5tZC92YWxpZGF0ZS1tYW5pZmVzdGAgcmVnaXN0ZXJzIGEgYFByb2dyYW1gXG4gKiB2aXNpdG9yIGFuZCBleHBlY3RzIGFuIEVTVHJlZSBgT2JqZWN0RXhwcmVzc2lvbmAsIHdoaWxlIGV2ZXJ5IEpTT04gcGFyc2VyIHRoYXQgc2hpcHMgcHJvZHVjZXMgc29tZXRoaW5nXG4gKiBlbHNlIC0tIGBAZXNsaW50L2pzb25gIHByb2R1Y2VzIE1vbW9hIChgRG9jdW1lbnRgKSwgYGpzb25jLWVzbGludC1wYXJzZXJgIHByb2R1Y2VzXG4gKiBgSlNPTk9iamVjdEV4cHJlc3Npb25gIC0tIHNvIHRoZSBydWxlIHNpbGVudGx5IG1hdGNoZXMgbm90aGluZyBubyBtYXR0ZXIgd2hpY2ggZmlsZXMgaXQgaXMgc2NvcGVkIHRvLlxuICogVGhlIGluLWhvdXNlIHJ1bGVzIGJlbG93IHZpc2l0IHRoZSBNb21vYSBBU1QgaW5zdGVhZC5cbiAqXG4gKiBgbWFuaWZlc3QuanNvbmAgaXMgc3RyaWN0IEpTT04sIHNvIGFuIGBlc2xpbnQtZGlzYWJsZWAgY29tbWVudCBpbiBpdCBpcyBhIHBhcnNlIGVycm9yIEFORCB3b3VsZCBzdG9wXG4gKiBPYnNpZGlhbiBsb2FkaW5nIHRoZSBwbHVnaW4uIFRoYXQgbWFrZXMgdGhlIGNvbmZpZyB0aGUgb25seSBwbGFjZSBhIGNoZWNrIGNhbiBiZSB3YWl2ZWQsIHdoaWNoIGlzIHdoeVxuICogdGhlc2UgYXJlIGZvdXIgcnVsZXMgcmF0aGVyIHRoYW4gb25lOiBhIHJlcG8gd2l0aCBhIGdyYW5kZmF0aGVyZWQgYGlkYCBjYW4gdHVybiBvZmYgYG1hbmlmZXN0LWlkYCBhbG9uZVxuICogYW5kIGtlZXAgdGhlIHJlc3QuXG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0Q29uZmlncygpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFtcbiAgICB7XG4gICAgICBmaWxlczogW09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbl0sXG4gICAgICBsYW5ndWFnZTogJ2pzb24vanNvbicsXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgICdqc29uJzoganNvblBsdWdpbixcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscyc6IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW5cbiAgICAgIH0sXG4gICAgICBydWxlczoge1xuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL21hbmlmZXN0LWRlc2NyaXB0aW9uJzogJ2Vycm9yJyxcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9tYW5pZmVzdC1pZCc6ICdlcnJvcicsXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvbWFuaWZlc3QtbmFtZSc6ICdlcnJvcicsXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvbWFuaWZlc3Qtc2NoZW1hJzogJ2Vycm9yJ1xuICAgICAgfVxuICAgIH1cbiAgXSk7XG59XG5cbi8qXG4gKiBFdmVyeSBmaWxlIHNldCB0aGF0IGlzIGV4ZW1wdCBmcm9tIHRoZSBOb2RlLWJ1aWx0aW5zIGJhbnMsIGluIG9uZSBwbGFjZS5cbiAqXG4gKiBUd28gcnVsZXMgYmFuIE5vZGUgYnVpbHRpbnMsIGFuZCB0aGV5IGFyZSBOT1QgaW50ZXJjaGFuZ2VhYmxlLiBgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXNgIGlzIG91cnMsIGl0IGlzXG4gKiBhbiBlcnJvciwgYW5kIGl0cyB3YWl2ZXJzIGFyZSB0b2xlcmF0ZWQgYnkgdGhlIGNvbW11bml0eS1kaXJlY3RvcnkgcmV2aWV3IHJ1bm5lci4gYG9ic2lkaWFubWQvbm8tbm9kZWpzLW1vZHVsZXNgXG4gKiBhcnJpdmVzIHZpYSBgb2JzaWRpYW5tZC5jb25maWdzLnJlY29tbWVuZGVkYCAoc2VlIGBnZXRPYnNpZGlhbkxpbnRDb25maWdzYCkgYW5kIGlzIHN0cmljdGx5IHdlYWtlciBvbiBzdGF0aWNcbiAqIGltcG9ydHMgXHUyMDE0IGl0cyBvd24gc291cmNlIHNheXMgXCJTdGF0aWMgaW1wb3J0IGRlY2xhcmF0aW9ucyBjYW4gbmV2ZXIgYmUgZ3VhcmRlZCBhdCBydW50aW1lXCIsIHNvIGl0IHJlcG9ydHMgZXZlcnlcbiAqIGBJbXBvcnREZWNsYXJhdGlvbmAgb2YgYSBidWlsdGluIHVuY29uZGl0aW9uYWxseSBhbmQgb25seSBgaW1wb3J0KClgIC8gYHJlcXVpcmUoKWAgZ2V0IGd1YXJkLWF3YXJlbmVzcy4gSXQgaXNcbiAqIGFsc28gb25lIHRoZSBjb25zdW1lciBDQU5OT1QgV0FJVkU6IHRoZSBkaXJlY3RvcnkgcnVubmVyIHNldHNcbiAqIGBlc2xpbnQtY29tbWVudHMvbm8tcmVzdHJpY3RlZC1kaXNhYmxlOiBbJ2Vycm9yJywgJ29ic2lkaWFubWQvKicsIC4uLl1gLCB3aGl0ZWxpc3Rpbmcgb25seVxuICogYG9ic2lkaWFubWQvdWkvc2VudGVuY2UtY2FzZWAsIHNvIGFuIGlubGluZSBkaXNhYmxlIG9mIGl0IHRyYWRlcyBhIHdhcm5pbmcgZm9yIGFuIGVycm9yIGluIGEgcmV2aWV3LiBUaGF0IGlzIHdoeVxuICogZXZlcnkgZXhlbXB0aW9uIGJlbG93IGhhcyB0byBsaXZlIGhlcmUgaW4gdGhlIHNoYXJlZCBjb25maWcgcmF0aGVyIHRoYW4gYXMgYSBjb21tZW50IGF0IHRoZSBjYWxsIHNpdGUuXG4gKlxuICogT25lIGZ1cnRoZXIgZXhlbXB0aW9uIGRlbGliZXJhdGVseSBsaXZlcyBlbHNld2hlcmU6IGBnZXRJbXBvcnRYQ29uZmlnc2AgdHVybnMgb2ZmIG9ubHkgYGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzYFxuICogZm9yIGBjb250ZXh0LnNjcmlwdEZpbGVzYC4gSXQgbmVlZHMgbm8gYG9ic2lkaWFubWRgIHR3aW4sIGJlY2F1c2UgYGdldE9ic2lkaWFuTGludENvbmZpZ3NgIHNjb3BlcyB0aGUgb2JzaWRpYW5tZFxuICogcnVsZXMgdG8gYGNvbnRleHQuc291cmNlRmlsZXNgLCBzbyB0aGV5IG5ldmVyIHJlYWNoIHNjcmlwdHMgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICovXG5mdW5jdGlvbiBnZXROb2RlQnVpbHRpbnNDb25maWdzKGNvbnRleHQ6IEVzbGludENvbmZpZ0NvbnRleHQpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFtcbiAgICB7XG4gICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0cyBydW4gaW4gYSBOb2RlIGVudmlyb25tZW50IGFuZCBsZWdpdGltYXRlbHkgcmVhZCBmaWxlcyAvIHBhdGhzLCBzbyB0aGUgTm9kZS1idWlsdGlucyBiYW5zIGRvIG5vdCBhcHBseSB0byB0aGVtLlxuICAgICAgZmlsZXM6IGNvbnRleHQuc291cmNlRm9sZGVycy5tYXAoKHNvdXJjZUZvbGRlcikgPT4gam9pbihzb3VyY2VGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFueVBhdGgsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFueUludGVncmF0aW9uVGVzdFRzKSksXG4gICAgICBydWxlczoge1xuICAgICAgICAnaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMnOiAnb2ZmJyxcbiAgICAgICAgJ29ic2lkaWFubWQvbm8tbm9kZWpzLW1vZHVsZXMnOiAnb2ZmJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgLypcbiAgICAgICAqIEEgYGRlc2t0b3AtYCBwcmVmaXhlZCBtb2R1bGUgaXMgZGVza3RvcC1vbmx5IGJ5IGNvbnZlbnRpb246IGl0IGlzIHJlYWNoZWQgb25seSB0aHJvdWdoIGFcbiAgICAgICAqIGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgLWdhdGVkIGR5bmFtaWMgYGltcG9ydCgpYCBpbiBpdHMgY2FsbGVyLCBzbyBpdHMgc3RhdGljIE5vZGUgaW1wb3J0cyBuZXZlclxuICAgICAgICogbG9hZCBvbiBtb2JpbGUuIE5laXRoZXIgcnVsZSBjYW4gc2VlIHRoYXQgZ2F0ZSwgYmVjYXVzZSBpdCBzaXRzIG9uZSBmaWxlIHVwIFx1MjAxNCB0aGUgY29ycmVjdGx5LXdyaXR0ZW4gcGF0dGVyblxuICAgICAgICogcmVwb3J0cyBhbnl3YXksIGFuZCBubyBhdXRob3Itc2lkZSByZXdyaXRlIHNpbGVuY2VzIGl0LlxuICAgICAgICpcbiAgICAgICAqIEV4ZW1wdGluZyBCWSBGSUxFTkFNRSByYXRoZXIgdGhhbiBieSBhIGRpc2FibGUgY29tbWVudCBjYXJyaWVzIGEgdHJhZGUtb2ZmIGtub3dpbmdseTogdGhlIGV4ZW1wdGlvbiBrZXlzXG4gICAgICAgKiBvZmYgd2hhdCB0aGUgZmlsZSBpcyBOQU1FRCByYXRoZXIgdGhhbiB3aGF0IGl0IGRvZXMsIHNvIHRoZSBwcmVmaXggaXMgbG9hZC1iZWFyaW5nLiBBIGRlc2t0b3Atb25seSBtb2R1bGVcbiAgICAgICAqIHRoYXQgc2tpcHMgdGhlIHByZWZpeCBrZWVwcyByZXBvcnRpbmcsIGFuZCBhIGNyb3NzLXBsYXRmb3JtIG1vZHVsZSB0aGF0IHdyb25nbHkgdGFrZXMgaXQgZ2V0cyBhbiBleGVtcHRpb25cbiAgICAgICAqIGl0IHNob3VsZCBub3QgaGF2ZS5cbiAgICAgICAqL1xuICAgICAgZmlsZXM6IGNvbnRleHQuc291cmNlRm9sZGVycy5tYXAoKHNvdXJjZUZvbGRlcikgPT4gam9pbihzb3VyY2VGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFueVBhdGgsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFueURlc2t0b3BUcykpLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ2ltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzJzogJ29mZicsXG4gICAgICAgICdvYnNpZGlhbm1kL25vLW5vZGVqcy1tb2R1bGVzJzogJ29mZidcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIC8qXG4gICAgICAgKiBBIHVuaXQgdGVzdCBydW5zIHVuZGVyIHZpdGVzdCBpbiBOb2RlIGFuZCBpcyBuZXZlciBidW5kbGVkIGludG8gYG1haW4uanNgLCBzbyB0aGUgTm9kZS1idWlsdGlucyBiYW5zIGRvIG5vdFxuICAgICAgICogYXBwbHkgdG8gaXQgZWl0aGVyIFx1MjAxNCB0aGUgaWRlbnRpY2FsIGFyZ3VtZW50IHRoZSBpbnRlZ3JhdGlvbi10ZXN0IGJsb2NrIGFib3ZlIGFscmVhZHkgYWNjZXB0cy4gVGhpcyBhbHNvXG4gICAgICAgKiBjb3ZlcnMgdGhlIFNVVC1ncm91cGVkIGAqLmRlc2t0b3AudGVzdC50c2Agc2hhcGUsIHdoaWNoIG5hbWVzIHRoZSBwbGF0Zm9ybSBhcyBhIGRvdCBzZWdtZW50IGFmdGVyIHRoZVxuICAgICAgICogc3ViamVjdCB1bmRlciB0ZXN0IHJhdGhlciB0aGFuIGFzIGEgYGRlc2t0b3AtYCBwcmVmaXguXG4gICAgICAgKi9cbiAgICAgIGZpbGVzOiBjb250ZXh0LnRlc3RGaWxlcyxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICdpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyc6ICdvZmYnLFxuICAgICAgICAnb2JzaWRpYW5tZC9uby1ub2RlanMtbW9kdWxlcyc6ICdvZmYnXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0T2JzaWRpYW5MaW50Q29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgY29uc3Qgb2JzaWRpYW5SZWNvbW1lbmRlZENvbmZpZ3MgPSBvYnNpZGlhbm1kLmNvbmZpZ3MucmVjb21tZW5kZWQ7XG5cbiAgLypcbiAgICogQSBidWlsdGluIHRoaXMgY29uZmlnIHNldHMgaXRzZWxmIG11c3Qgbm90IEFMU08gcnVuIHRocm91Z2ggYG9ic2lkaWFubWQvcnVsZS1jdXN0b20tbWVzc2FnZWAsIG9yIGEgY29uc3VtZXIncyBvd25cbiAgICogYCduby1jb25zb2xlJzogJ29mZidgIGlzIGluZXJ0IGFuZCBldmVyeSBjb25zb2xlIGxpbmUgaXMgcmVwb3J0ZWQgdHdpY2UuIFNlZSBgb2JzaWRpYW5tZC1ydWxlLWN1c3RvbS1tZXNzYWdlLnRzYC5cbiAgICovXG4gIGNvbnN0IG93bmVkUnVsZU5hbWVzID0gbmV3IFNldChnZXRFc2xpbnRDb3JlQ29uZmlncyhjb250ZXh0KS5mbGF0TWFwKChjb25maWcpID0+IE9iamVjdC5rZXlzKGNvbmZpZy5ydWxlcyA/PyB7fSkpKTtcblxuICBjb25zdCBzY29wZWRPYnNpZGlhblJlY29tbWVuZGVkQ29uZmlncyA9IG9ic2lkaWFuUmVjb21tZW5kZWRDb25maWdzLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIGNvbmZpZy5maWxlcz8uaW5jbHVkZXMoJ3BhY2thZ2UuanNvbicpXG4gICAgICA/IGNvbmZpZ1xuICAgICAgOiB7XG4gICAgICAgIC4uLnN0cmlwT3duZWRSdWxlQ3VzdG9tTWVzc2FnZUVudHJpZXMoeyBjb25maWcsIG93bmVkUnVsZU5hbWVzIH0pLFxuICAgICAgICBmaWxlczogY29udGV4dC5zb3VyY2VGaWxlc1xuICAgICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZXh0ZW5kczogW3Njb3BlZE9ic2lkaWFuUmVjb21tZW5kZWRDb25maWdzXSxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgb2JzaWRpYW5tZFxuICAgICAgfVxuICAgIH1cbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGdldE9ic2lkaWFuT3ZlcnJpZGVDb25maWdzKGNvbnRleHQ6IEVzbGludENvbmZpZ0NvbnRleHQpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFtcbiAgICB7XG4gICAgICBmaWxlczogY29udGV4dC5zb3VyY2VGb2xkZXJzLm1hcCgoc291cmNlRm9sZGVyKSA9PiBqb2luKHNvdXJjZUZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFpblRzKSksXG4gICAgICBydWxlczoge1xuICAgICAgICAnaW1wb3J0LXgvbm8tZGVmYXVsdC1leHBvcnQnOiAnb2ZmJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgZmlsZXM6IGNvbnRleHQuYWxsRmlsZXMoKSxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscyc6IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW5cbiAgICAgIH0sXG4gICAgICBydWxlczoge1xuICAgICAgICAvKlxuICAgICAgICAgKiBEZWxpYmVyYXRlbHkgaGVyZSwgb24gYGFsbEZpbGVzKClgLCByYXRoZXIgdGhhbiBiZXNpZGUgYG5vLXVudHJ1c3RlZC1pbnB1dC1ldmVudHNgIGluXG4gICAgICAgICAqIGBnZXRJbnRlZ3JhdGlvblRlc3RDb25maWdzKClgIChvd25lciwgMjAyNi0wOS0wOSkuIEFuIGBldmFsSW5PYnNpZGlhbmAgY2FsbCBpcyB1bm1pc3Rha2FibGUsIHNvIGFcbiAgICAgICAgICogZmlsZSB0aGF0IG1ha2VzIG5vbmUgaXMgdW50b3VjaGVkIGFuZCBhIGJyb2FkIGdsb2IgY29zdHMgbm90aGluZyAtLSB3aGlsZSBzY3JpcHQgY29kZSB0aGF0IGRyaXZlc1xuICAgICAgICAgKiBhIHJlYWwgT2JzaWRpYW4gb3V0c2lkZSBhIHRlc3QgKGBkZW1vLXZhdWx0LWJ1dHRvbnMudHNgKSBpcyB1bmRlciB0aGUgc2FtZSB0cmFuc3BvcnQgY2FwIGFuZCB3b3VsZFxuICAgICAgICAgKiBvdGhlcndpc2UgYmUgZW5mb3JjZWQgbm93aGVyZS5cbiAgICAgICAgICovXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuJzogJ2Vycm9yJyxcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiAnZXJyb3InLFxuICAgICAgICAvKlxuICAgICAgICAgKiBPYnNpZGlhbidzIGBDb21wb25lbnRgIGhhcyBpdHMgb3duIGByZW1vdmVDaGlsZChjb21wb25lbnQpYCBmb3IgdGhlIGNvbXBvbmVudCBsaWZlY3ljbGUsIHVucmVsYXRlZFxuICAgICAgICAgKiB0byBgTm9kZSNyZW1vdmVDaGlsZGAuIFRoZSBydWxlIG1hdGNoZXMgb24gdGhlIG1ldGhvZCBuYW1lIGFsb25lLCBzbyBldmVyeSByZXBvcnQgaGVyZSBpcyBhXG4gICAgICAgICAqIGNvbXBvbmVudCBiZWluZyB1bmxvYWRlZCwgYW5kIGZvbGxvd2luZyB0aGUgYWR2aWNlIGNhbGxzIGEgYHJlbW92ZSgpYCB0aGF0IGRvZXMgbm90IGV4aXN0IC0tIHdoaWNoXG4gICAgICAgICAqIGlzIHdoYXQgYHRzY2Agc2FpZCB3aGVuIHRoZSBmaXhlciB3YXMgbGV0IGxvb3NlIG9uIHRoZW0uXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9wcmVmZXItZG9tLW5vZGUtcmVtb3ZlJzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIERpcmVjdGx5IGNvbnRyYWRpY3RzIGBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzYDogdGhpcyBydWxlIHJld3JpdGVzIGB3aW5kb3cueGAgdG8gYGdsb2JhbFRoaXMueGAsIGFuZFxuICAgICAgICAgKiB0aGF0IG9uZSBmb3JiaWRzIGBnbG9iYWxUaGlzYCBvdXRyaWdodC4gV2l0aCBib3RoIGVuYWJsZWQsIGAtLWZpeGAgYXBwbGllcyBvbmUgYW5kIHRoZW4gdGhlIG90aGVyXG4gICAgICAgICAqIHJldmVydHMgaXQsIHdoaWNoIEVTTGludCByZXBvcnRzIGFzIGBFU0xpbnRDaXJjdWxhckZpeGVzV2FybmluZ2AgYWNyb3NzIDI5IGZpbGVzLiBPYnNpZGlhbidzIG93blxuICAgICAgICAgKiBndWlkYW5jZSB3aW5zIGluIGFuIE9ic2lkaWFuIGxpYnJhcnksIHNvIHRoaXMgaXMgdGhlIHJ1bGUgdGhhdCBnaXZlcyB3YXkuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9wcmVmZXItZ2xvYmFsLXRoaXMnOiAnb2ZmJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgLypcbiAgICAgICAqIE9ic2lkaWFuJ3MgaW50ZXJuYWwgQVBJIGlzIHR5cGVkIGluIGBvYnNpZGlhbi10eXBpbmdzYCwgc28gYSBgZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuJ2AgYXVnbWVudGF0aW9uIGluXG4gICAgICAgKiBzaGlwcGVkIHNvdXJjZSBtYXkgY2Fycnkgb25seSB0aGUgcGx1Z2luJ3Mgb3duIGN1c3RvbS1ldmVudCBvdmVybG9hZHMuIFRlc3RzIGFyZSBleGVtcHQ6IGEgbW9jayBzaGFwZSBvciBhXG4gICAgICAgKiBoYXJuZXNzIGdsb2JhbCBuZXZlciBzaGlwcy5cbiAgICAgICAqL1xuICAgICAgZmlsZXM6IGNvbnRleHQuc291cmNlRmlsZXMsXG4gICAgICBpZ25vcmVzOiBjb250ZXh0LnRlc3RGaWxlcyxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscyc6IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW5cbiAgICAgIH0sXG4gICAgICBydWxlczoge1xuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL25vLWxvY2FsLW9ic2lkaWFuLWludGVybmFscyc6ICdlcnJvcidcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIC8qXG4gICAgICAgKiBFdmVyeSBtZXRob2QgZW50cnkgb2YgYSBwbHVnaW4gQVBJIGNvbnRyYWN0IGNhcnJpZXMgYW4gYGlucHV0YCBhbmQgYW4gYG91dHB1dGAgc2NoZW1hLCBzbyBhIGB7fWAgZW50cnkgdGhhdFxuICAgICAgICogdmFsaWRhdGVzIG5vdGhpbmcgY2Fubm90IGNvbWUgYmFjayB3aGVyZSB0aGUgY29udHJhY3QgdHlwZSBpcyB1bnR5cGVkIGFuZCB0aGUgY29tcGlsZXIgZG9lcyBub3QgcmVmdXNlIGl0LlxuICAgICAgICogVGVzdHMgYXJlIGV4ZW1wdDogdGhleSBtYXkgcHVibGlzaCBhIGRlbGliZXJhdGVseSBicm9rZW4gY29udHJhY3QuXG4gICAgICAgKlxuICAgICAgICogUmVnaXN0ZXJlZCBidXQgT0ZGOiBzZXZlcmFsIHByb3ZpZGVycyBhbmQgY29uc3VtZXJzIHN0aWxsIGNhcnJ5IGB7fWAgZW50cmllcywgYW5kIHR1cm5pbmcgaXQgb24gZmlyc3Qgd291bGRcbiAgICAgICAqIG1ha2UgdGhlaXIgbGludCByZWQuIFN3aXRjaCBpdCB0byBgJ2Vycm9yJ2Agb25jZSBub25lIGlzIGxlZnQuXG4gICAgICAgKi9cbiAgICAgIGZpbGVzOiBjb250ZXh0LnNvdXJjZUZpbGVzLFxuICAgICAgaWdub3JlczogY29udGV4dC50ZXN0RmlsZXMsXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMnOiBvYnNpZGlhbkRldlV0aWxzUGx1Z2luXG4gICAgICB9LFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9yZXF1aXJlLXBsdWdpbi1hcGktY29udHJhY3Qtc2NoZW1hcyc6ICdvZmYnXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAvKlxuICAgICAgICogQSBwbHVnaW4ncyBkaXNwbGF5IG5hbWUgaXMgbWFya2VkIGFzIGNvZGU6IGJhY2t0aWNrcyBpbiBhIGNvbW1lbnQgKGBwbHVnaW4tbmFtZS1hcy1jb2RlYCwgYXV0b2ZpeGVkKSwgYVxuICAgICAgICogYDxjb2RlPmAgZWxlbWVudCBpbiBVSSAoYHBsdWdpbi1uYW1lLWFzLWNvZGUtaW4tdWlgLCByZXBvcnRlZCBvbmx5KS5cbiAgICAgICAqXG4gICAgICAgKiBSZWdpc3RlcmVkIGJ1dCBPRkY6IHJlcG9zaXRvcmllcyBzdGlsbCBjYXJyeSBwbGFpbiBwbHVnaW4gbmFtZXMgZnJvbSBiZWZvcmUgdGhlIHJ1bGVzIGV4aXN0ZWQsIGFuZCB0dXJuaW5nXG4gICAgICAgKiB0aGVtIG9uIGZpcnN0IHdvdWxkIG1ha2UgdGhlaXIgbGludCByZWQuIFN3aXRjaCB0aGVtIHRvIGAnZXJyb3InYCBvbmNlIHRob3NlIGFyZSBmaXhlZC4gQm90aCB0YWtlXG4gICAgICAgKiBgeyBhZGRpdGlvbmFsUGx1Z2luTmFtZXM6IFsuLi5dIH1gIGZvciBuYW1lcyB0aGUgc2hhcmVkIGxpc3QgbGFja3MuXG4gICAgICAgKi9cbiAgICAgIGZpbGVzOiBjb250ZXh0LmFsbEZpbGVzKCksXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMnOiBvYnNpZGlhbkRldlV0aWxzUGx1Z2luXG4gICAgICB9LFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9wbHVnaW4tbmFtZS1hcy1jb2RlJzogJ29mZicsXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvcGx1Z2luLW5hbWUtYXMtY29kZS1pbi11aSc6ICdvZmYnXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFFckIsT0FBTyxnQkFBZ0I7QUFDdkIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxvQkFBb0I7QUFFN0IsU0FBUywrQkFBK0I7QUFDeEMsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUywwQ0FBMEM7QUFnQm5ELE1BQU0sdUJBQXVCO0FBV3RCLFNBQVMsb0JBQW9CLFVBQXNDLENBQUMsR0FBb0I7QUFDN0YsUUFBTSxVQUFVLGlDQUFpQztBQUVqRCxNQUFJLFFBQVEsYUFBYTtBQUN2QixZQUFRLFlBQVksT0FBTztBQUFBLEVBQzdCO0FBRUEsUUFBTSxnQkFBZ0IsUUFBUSxnQkFBZ0IsT0FBTyxLQUFLLENBQUM7QUFFM0QsU0FBTztBQUFBLElBQ0wsR0FBRyx1QkFBdUI7QUFBQSxJQUUxQixHQUFHLHVCQUF1QixPQUFPO0FBQUEsSUFDakMsR0FBRywyQkFBMkIsRUFBRSxTQUFTLGVBQWUsd0JBQXdCLG9CQUFvQixxQkFBcUIsQ0FBQztBQUFBLElBQzFILEdBQUcsMkJBQTJCLE9BQU87QUFBQSxJQUNyQyxHQUFHLHVCQUF1QixPQUFPO0FBQUEsSUFDakMsR0FBRywwQkFBMEIsT0FBTztBQUFBLElBQ3BDLEdBQUcsbUJBQW1CO0FBQUEsSUFDdEIsR0FBRyxrQkFBa0I7QUFBQSxJQUNyQixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBQ0EsU0FBUywwQkFBMEIsU0FBK0M7QUFDaEYsU0FBTyxhQUFhO0FBQUEsSUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BY0UsT0FBTyxRQUFRLGNBQWMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLGNBQWMsd0JBQXdCLFNBQVMsd0JBQXdCLG9CQUFvQixDQUFDO0FBQUEsTUFDcEosT0FBTztBQUFBLFFBQ0wsZ0RBQWdEO0FBQUEsTUFDbEQ7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFhQSxTQUFTLG9CQUFxQztBQUM1QyxTQUFPLGFBQWE7QUFBQSxJQUNsQjtBQUFBLE1BQ0UsT0FBTyxDQUFDLHdCQUF3QixPQUFPO0FBQUEsTUFDdkMsaUJBQWlCO0FBQUEsUUFDZixRQUFRO0FBQUEsTUFDVjtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1A7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCwrQkFBK0I7QUFBQSxNQUNqQztBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDtBQWVBLFNBQVMscUJBQXNDO0FBQzdDLFNBQU8sYUFBYTtBQUFBLElBQ2xCO0FBQUEsTUFDRSxPQUFPLENBQUMsd0JBQXdCLFlBQVk7QUFBQSxNQUM1QyxVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixzQkFBc0I7QUFBQSxNQUN4QjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsMkNBQTJDO0FBQUEsUUFDM0Msa0NBQWtDO0FBQUEsUUFDbEMsb0NBQW9DO0FBQUEsUUFDcEMsc0NBQXNDO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFtQkEsU0FBUyx1QkFBdUIsU0FBK0M7QUFDN0UsU0FBTyxhQUFhO0FBQUEsSUFDbEI7QUFBQTtBQUFBLE1BRUUsT0FBTyxRQUFRLGNBQWMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLGNBQWMsd0JBQXdCLFNBQVMsd0JBQXdCLG9CQUFvQixDQUFDO0FBQUEsTUFDcEosT0FBTztBQUFBLFFBQ0wsOEJBQThCO0FBQUEsUUFDOUIsZ0NBQWdDO0FBQUEsTUFDbEM7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVlFLE9BQU8sUUFBUSxjQUFjLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxjQUFjLHdCQUF3QixTQUFTLHdCQUF3QixZQUFZLENBQUM7QUFBQSxNQUM1SSxPQUFPO0FBQUEsUUFDTCw4QkFBOEI7QUFBQSxRQUM5QixnQ0FBZ0M7QUFBQSxNQUNsQztBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPRSxPQUFPLFFBQVE7QUFBQSxNQUNmLE9BQU87QUFBQSxRQUNMLDhCQUE4QjtBQUFBLFFBQzlCLGdDQUFnQztBQUFBLE1BQ2xDO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBUyx1QkFBdUIsU0FBK0M7QUFDN0UsUUFBTSw2QkFBNkIsV0FBVyxRQUFRO0FBTXRELFFBQU0saUJBQWlCLElBQUksSUFBSSxxQkFBcUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLE9BQU8sS0FBSyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVqSCxRQUFNLG1DQUFtQywyQkFBMkIsSUFBSSxDQUFDLFdBQVc7QUFDbEYsV0FBTyxPQUFPLE9BQU8sU0FBUyxjQUFjLElBQ3hDLFNBQ0E7QUFBQSxNQUNBLEdBQUcsbUNBQW1DLEVBQUUsUUFBUSxlQUFlLENBQUM7QUFBQSxNQUNoRSxPQUFPLFFBQVE7QUFBQSxJQUNqQjtBQUFBLEVBQ0osQ0FBQztBQUVELFNBQU8sYUFBYTtBQUFBLElBQ2xCO0FBQUEsTUFDRSxTQUFTLENBQUMsZ0NBQWdDO0FBQUEsTUFDMUMsU0FBUztBQUFBLFFBQ1A7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBUywyQkFBMkIsU0FBK0M7QUFDakYsU0FBTyxhQUFhO0FBQUEsSUFDbEI7QUFBQSxNQUNFLE9BQU8sUUFBUSxjQUFjLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxjQUFjLHdCQUF3QixNQUFNLENBQUM7QUFBQSxNQUNyRyxPQUFPO0FBQUEsUUFDTCw4QkFBOEI7QUFBQSxNQUNoQztBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxPQUFPLFFBQVEsU0FBUztBQUFBLE1BQ3hCLFNBQVM7QUFBQSxRQUNQLHNCQUFzQjtBQUFBLE1BQ3hCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVFMLDJEQUEyRDtBQUFBLFFBQzNELCtDQUErQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBTy9DLGtDQUFrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBT2xDLDhCQUE4QjtBQUFBLE1BQ2hDO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFNRSxPQUFPLFFBQVE7QUFBQSxNQUNmLFNBQVMsUUFBUTtBQUFBLE1BQ2pCLFNBQVM7QUFBQSxRQUNQLHNCQUFzQjtBQUFBLE1BQ3hCO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxrREFBa0Q7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BU0UsT0FBTyxRQUFRO0FBQUEsTUFDZixTQUFTLFFBQVE7QUFBQSxNQUNqQixTQUFTO0FBQUEsUUFDUCxzQkFBc0I7QUFBQSxNQUN4QjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsMERBQTBEO0FBQUEsTUFDNUQ7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVNFLE9BQU8sUUFBUSxTQUFTO0FBQUEsTUFDeEIsU0FBUztBQUFBLFFBQ1Asc0JBQXNCO0FBQUEsTUFDeEI7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMLDBDQUEwQztBQUFBLFFBQzFDLGdEQUFnRDtBQUFBLE1BQ2xEO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference path="../../index.d.mts" />
|
|
2
|
+
export * as 'manifest-description' from './manifest-description.mjs';
|
|
3
|
+
export * as 'manifest-helpers' from './manifest-helpers.mjs';
|
|
4
|
+
export * as 'manifest-id' from './manifest-id.mjs';
|
|
5
|
+
export * as 'manifest-name' from './manifest-name.mjs';
|
|
6
|
+
export * as 'manifest-schema' from './manifest-schema.mjs';
|
|
7
|
+
export * as 'no-local-obsidian-internals' from './no-local-obsidian-internals.mjs';
|
|
8
|
+
export * as 'no-over-cap-wait-in-eval-in-obsidian' from './no-over-cap-wait-in-eval-in-obsidian.mjs';
|
|
9
|
+
export * as 'no-untrusted-input-events' from './no-untrusted-input-events.mjs';
|
|
10
|
+
export * as 'obsidian-dev-utils-plugin' from './obsidian-dev-utils-plugin.mjs';
|
|
11
|
+
export * as 'plugin-name-as-code-in-ui' from './plugin-name-as-code-in-ui.mjs';
|
|
12
|
+
export * as 'plugin-name-as-code' from './plugin-name-as-code.mjs';
|
|
13
|
+
export * as 'require-component-suffix' from './require-component-suffix.mjs';
|
|
14
|
+
export * as 'require-plugin-api-contract-schemas' from './require-plugin-api-contract-schemas.mjs';
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
const existingProcess = globalThis.process;
|
|
22
|
+
if (!existingProcess) {
|
|
23
|
+
globalThis.process = browserProcess;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existingProcessRecord = existingProcess;
|
|
30
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
31
|
+
existingProcessRecord[key] ??= value;
|
|
32
|
+
}
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(function initEsm() {
|
|
37
|
+
ensureDisposeSymbols();
|
|
38
|
+
ensureBrowserProcess();
|
|
39
|
+
})();
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
import * as manifest_description from "./manifest-description.mjs";
|
|
43
|
+
import * as manifest_helpers from "./manifest-helpers.mjs";
|
|
44
|
+
import * as manifest_id from "./manifest-id.mjs";
|
|
45
|
+
import * as manifest_name from "./manifest-name.mjs";
|
|
46
|
+
import * as manifest_schema from "./manifest-schema.mjs";
|
|
47
|
+
import * as no_local_obsidian_internals from "./no-local-obsidian-internals.mjs";
|
|
48
|
+
import * as no_over_cap_wait_in_eval_in_obsidian from "./no-over-cap-wait-in-eval-in-obsidian.mjs";
|
|
49
|
+
import * as no_untrusted_input_events from "./no-untrusted-input-events.mjs";
|
|
50
|
+
import * as obsidian_dev_utils_plugin from "./obsidian-dev-utils-plugin.mjs";
|
|
51
|
+
import * as plugin_name_as_code_in_ui from "./plugin-name-as-code-in-ui.mjs";
|
|
52
|
+
import * as plugin_name_as_code from "./plugin-name-as-code.mjs";
|
|
53
|
+
import * as require_component_suffix from "./require-component-suffix.mjs";
|
|
54
|
+
import * as require_plugin_api_contract_schemas from "./require-plugin-api-contract-schemas.mjs";
|
|
55
|
+
export {
|
|
56
|
+
manifest_description as "manifest-description",
|
|
57
|
+
manifest_helpers as "manifest-helpers",
|
|
58
|
+
manifest_id as "manifest-id",
|
|
59
|
+
manifest_name as "manifest-name",
|
|
60
|
+
manifest_schema as "manifest-schema",
|
|
61
|
+
no_local_obsidian_internals as "no-local-obsidian-internals",
|
|
62
|
+
no_over_cap_wait_in_eval_in_obsidian as "no-over-cap-wait-in-eval-in-obsidian",
|
|
63
|
+
no_untrusted_input_events as "no-untrusted-input-events",
|
|
64
|
+
obsidian_dev_utils_plugin as "obsidian-dev-utils-plugin",
|
|
65
|
+
plugin_name_as_code as "plugin-name-as-code",
|
|
66
|
+
plugin_name_as_code_in_ui as "plugin-name-as-code-in-ui",
|
|
67
|
+
require_component_suffix as "require-component-suffix",
|
|
68
|
+
require_plugin_api_contract_schemas as "require-plugin-api-contract-schemas"
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ21hbmlmZXN0LWRlc2NyaXB0aW9uJyBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdtYW5pZmVzdC1oZWxwZXJzJyBmcm9tICcuL21hbmlmZXN0LWhlbHBlcnMudHMnO1xuZXhwb3J0ICogYXMgJ21hbmlmZXN0LWlkJyBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmV4cG9ydCAqIGFzICdtYW5pZmVzdC1uYW1lJyBmcm9tICcuL21hbmlmZXN0LW5hbWUudHMnO1xuZXhwb3J0ICogYXMgJ21hbmlmZXN0LXNjaGVtYScgZnJvbSAnLi9tYW5pZmVzdC1zY2hlbWEudHMnO1xuZXhwb3J0ICogYXMgJ25vLWxvY2FsLW9ic2lkaWFuLWludGVybmFscycgZnJvbSAnLi9uby1sb2NhbC1vYnNpZGlhbi1pbnRlcm5hbHMudHMnO1xuZXhwb3J0ICogYXMgJ25vLW92ZXItY2FwLXdhaXQtaW4tZXZhbC1pbi1vYnNpZGlhbicgZnJvbSAnLi9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMnO1xuZXhwb3J0ICogYXMgJ25vLXVudHJ1c3RlZC1pbnB1dC1ldmVudHMnIGZyb20gJy4vbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cy50cyc7XG5leHBvcnQgKiBhcyAnb2JzaWRpYW4tZGV2LXV0aWxzLXBsdWdpbicgZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tbmFtZS1hcy1jb2RlLWluLXVpJyBmcm9tICcuL3BsdWdpbi1uYW1lLWFzLWNvZGUtaW4tdWkudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1uYW1lLWFzLWNvZGUnIGZyb20gJy4vcGx1Z2luLW5hbWUtYXMtY29kZS50cyc7XG5leHBvcnQgKiBhcyAncmVxdWlyZS1jb21wb25lbnQtc3VmZml4JyBmcm9tICcuL3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeC50cyc7XG5leHBvcnQgKiBhcyAncmVxdWlyZS1wbHVnaW4tYXBpLWNvbnRyYWN0LXNjaGVtYXMnIGZyb20gJy4vcmVxdWlyZS1wbHVnaW4tYXBpLWNvbnRyYWN0LXNjaGVtYXMudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxZQUFZQSwwQkFBNEI7QUFDeEMsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLGlDQUFtQztBQUMvQyxZQUFZQywwQ0FBNEM7QUFDeEQsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLCtCQUFpQztBQUM3QyxZQUFZQywrQkFBaUM7QUFDN0MsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLDhCQUFnQztBQUM1QyxZQUFZQyx5Q0FBMkM7IiwKICAibmFtZXMiOiBbIm1hbmlmZXN0LWRlc2NyaXB0aW9uIiwgIm1hbmlmZXN0LWhlbHBlcnMiLCAibWFuaWZlc3QtaWQiLCAibWFuaWZlc3QtbmFtZSIsICJtYW5pZmVzdC1zY2hlbWEiLCAibm8tbG9jYWwtb2JzaWRpYW4taW50ZXJuYWxzIiwgIm5vLW92ZXItY2FwLXdhaXQtaW4tZXZhbC1pbi1vYnNpZGlhbiIsICJuby11bnRydXN0ZWQtaW5wdXQtZXZlbnRzIiwgIm9ic2lkaWFuLWRldi11dGlscy1wbHVnaW4iLCAicGx1Z2luLW5hbWUtYXMtY29kZS1pbi11aSIsICJwbHVnaW4tbmFtZS1hcy1jb2RlIiwgInJlcXVpcmUtY29tcG9uZW50LXN1ZmZpeCIsICJyZXF1aXJlLXBsdWdpbi1hcGktY29udHJhY3Qtc2NoZW1hcyJdCn0K
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/// <reference path="../../index.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* ESLint rule: manifest-description
|
|
6
|
+
*
|
|
7
|
+
* Enforces the Community directory's constraints on a plugin's `manifest.json` `description`.
|
|
8
|
+
*
|
|
9
|
+
* Two of these checks deliberately diverge from `obsidianmd/validate-manifest`:
|
|
10
|
+
*
|
|
11
|
+
* - **Self-reference, not the word `plugin`.** Upstream's `FORBIDDEN_WORDS` bans the bare substring
|
|
12
|
+
* `plugin` in the description, which rejects two descriptions the directory itself passed untouched -
|
|
13
|
+
* `Enhances Note composer core plugin.` and `...not plugin updates...` - because each names something
|
|
14
|
+
* other than itself. The directory's actual objection is self-reference, so only self-referential
|
|
15
|
+
* phrases are matched here.
|
|
16
|
+
* - **No character whitelist.** Upstream's format check rejects anything outside
|
|
17
|
+
* `[A-Za-z0-9\s.,!?'"-]`, which fails backticks, em dashes, parentheses, colons and slashes. Seven
|
|
18
|
+
* live listings carry those and the directory flagged none, so the check is noise rather than a gate.
|
|
19
|
+
*
|
|
20
|
+
* The no-`Obsidian` check has the opposite provenance: the directory enforces it and no Obsidian
|
|
21
|
+
* document states it, which is what cost a released plugin a version bump for one word.
|
|
22
|
+
*
|
|
23
|
+
* Runs on the `@eslint/json` `json/json` language; see `manifest-helpers.ts` for why the AST is Momoa
|
|
24
|
+
* rather than ESTree.
|
|
25
|
+
*/
|
|
26
|
+
import type { Rule } from 'eslint';
|
|
27
|
+
/**
|
|
28
|
+
Message ID reported when the description contains the word `Obsidian`.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MESSAGE_ID_CONTAINS_OBSIDIAN = "descriptionContainsObsidian";
|
|
31
|
+
/**
|
|
32
|
+
Message ID reported when the description does not end with a period.
|
|
33
|
+
*/
|
|
34
|
+
export declare const MESSAGE_ID_MISSING_PERIOD = "descriptionMissingPeriod";
|
|
35
|
+
/**
|
|
36
|
+
Message ID reported when the description does not start with a capital letter.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MESSAGE_ID_NOT_CAPITALIZED = "descriptionNotCapitalized";
|
|
39
|
+
/**
|
|
40
|
+
Message ID reported when the description refers to itself.
|
|
41
|
+
*/
|
|
42
|
+
export declare const MESSAGE_ID_SELF_REFERENCE = "descriptionSelfReference";
|
|
43
|
+
/**
|
|
44
|
+
Message ID reported when the description is longer than the directory allows.
|
|
45
|
+
*/
|
|
46
|
+
export declare const MESSAGE_ID_TOO_LONG = "descriptionTooLong";
|
|
47
|
+
/**
|
|
48
|
+
Message ID reported when the description is too short to describe anything.
|
|
49
|
+
*/
|
|
50
|
+
export declare const MESSAGE_ID_TOO_SHORT = "descriptionTooShort";
|
|
51
|
+
/**
|
|
52
|
+
* ESLint rule enforcing the Community directory's constraints on a plugin's `manifest.json` `description`.
|
|
53
|
+
*/
|
|
54
|
+
export declare const manifestDescription: Rule.RuleModule;
|