@mnaoumov/obsidian-lib 6.0.3 → 6.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/dist/lib/cjs/__merged.cjs +5 -1
- package/dist/lib/cjs/__merged.d.cts +1 -1
- package/dist/lib/cjs/components/plugin-gate-component.cjs +33 -1
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +16 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +9 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +8 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +8 -0
- package/dist/lib/cjs/validation.cjs +34 -1
- package/dist/lib/cjs/validation.d.cts +28 -0
- package/dist/lib/esm/__merged.d.mts +1 -1
- package/dist/lib/esm/__merged.mjs +5 -1
- package/dist/lib/esm/components/plugin-gate-component.d.mts +16 -0
- package/dist/lib/esm/components/plugin-gate-component.mjs +33 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +8 -0
- package/dist/lib/esm/i18n/locales/en.mjs +9 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +8 -0
- package/dist/lib/esm/validation.d.mts +28 -0
- package/dist/lib/esm/validation.mjs +32 -1
- package/package.json +6 -3
|
@@ -289,6 +289,7 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
289
289
|
private createConflictBlockedMessage;
|
|
290
290
|
private createConflictWarningMessage;
|
|
291
291
|
private createDependencyLostMessage;
|
|
292
|
+
private createNoReadableApiMessage;
|
|
292
293
|
private createVersionMismatchMessage;
|
|
293
294
|
/**
|
|
294
295
|
* Finds the declared conflicts of one severity that are currently in force.
|
|
@@ -321,6 +322,21 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
321
322
|
* @returns Whether the conflicting plugin is enabled at a conflicting version.
|
|
322
323
|
*/
|
|
323
324
|
private isConflictActive;
|
|
325
|
+
/**
|
|
326
|
+
* Decides whether an unsatisfied dependency is nonetheless enabled and loaded.
|
|
327
|
+
*
|
|
328
|
+
* Such a dependency is running but publishes no API this plugin can read — none at all, or one whose shape
|
|
329
|
+
* fails the contract. The usual cause is a release built on a copy of this library that publishes
|
|
330
|
+
* somewhere this one does not look, so "install and enable it" would be false and "update it" is the fix.
|
|
331
|
+
*
|
|
332
|
+
* Being in `enabledPlugins` is not enough: Obsidian's plain `disablePlugin` unloads a plugin and leaves it
|
|
333
|
+
* there (only `disablePluginAndSave` removes it), so a provider that went away would otherwise read as
|
|
334
|
+
* running with an unreadable API.
|
|
335
|
+
*
|
|
336
|
+
* @param dependency - The declared dependency.
|
|
337
|
+
* @returns Whether the dependency is enabled and loaded.
|
|
338
|
+
*/
|
|
339
|
+
private isRunning;
|
|
324
340
|
/**
|
|
325
341
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
326
342
|
*
|
|
@@ -91,7 +91,7 @@ __export(generated_during_build_exports, {
|
|
|
91
91
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
92
92
|
});
|
|
93
93
|
module.exports = __toCommonJS(generated_during_build_exports);
|
|
94
|
-
const LIBRARY_VERSION = "6.0
|
|
94
|
+
const LIBRARY_VERSION = "6.1.0";
|
|
95
95
|
const LIBRARY_STYLES = ".obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component pre, .obsidian-lib.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-lib.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-lib.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-lib.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-lib.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-lib.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-lib-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-lib-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-lib-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-lib-lock-indicator-flash {\n animation: obsidian-lib-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-lib input[type=url] {\n height: var(--input-height);\n}\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=tel],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=url],\n.obsidian-lib input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-lib input[type=month]:hover,\n .obsidian-lib input[type=tel]:hover,\n .obsidian-lib input[type=time]:hover,\n .obsidian-lib input[type=url]:hover,\n .obsidian-lib input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus, .obsidian-lib input[type=month]:focus-visible,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=tel]:focus-visible,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=time]:focus-visible,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=url]:focus-visible,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus,\n.obsidian-lib input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-lib input[type=month]::placeholder,\n.obsidian-lib input[type=tel]::placeholder,\n.obsidian-lib input[type=time]::placeholder,\n.obsidian-lib input[type=url]::placeholder,\n.obsidian-lib input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-lib input[type=month], .is-rtl .obsidian-lib input[type=month], .rtl .obsidian-lib input[type=month],\n.mod-rtl .obsidian-lib input[type=time],\n.is-rtl .obsidian-lib input[type=time],\n.rtl .obsidian-lib input[type=time],\n.mod-rtl .obsidian-lib input[type=week],\n.is-rtl .obsidian-lib input[type=week],\n.rtl .obsidian-lib input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\nprogress.obsidian-lib.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-lib-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-lib-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-lib.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-lib.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-lib-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-lib.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-lib.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-lib-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-lib.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-lib.minimized-modal-bar .restore-button,\n.obsidian-lib.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimized-modal-bar .restore-button:hover,\n.obsidian-lib.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-lib.modal-commands {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2-2);\n padding: var(--size-4-2) var(--size-4-3);\n border-top: 1px solid var(--background-modifier-border);\n}\n.obsidian-lib.modal-command-control {\n margin-inline-start: var(--size-2-2);\n vertical-align: middle;\n}\n.obsidian-lib.modal-command {\n display: inline-flex;\n align-items: baseline;\n gap: var(--size-2-2);\n min-height: var(--size-4-8);\n padding: var(--size-2-1) var(--size-4-2);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-s);\n background-color: var(--background-secondary);\n color: var(--text-muted);\n font-size: var(--font-ui-smaller);\n white-space: nowrap;\n cursor: pointer;\n}\n.obsidian-lib.modal-command:hover:not(:disabled) {\n background-color: var(--background-modifier-hover);\n color: var(--text-normal);\n}\n.obsidian-lib.modal-command.is-active {\n border-color: var(--interactive-accent);\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n.obsidian-lib.modal-command:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.obsidian-lib.modal-command-hotkey {\n color: var(--text-faint);\n font-size: var(--font-smallest);\n}\n.modal-command.is-active .obsidian-lib.modal-command-hotkey {\n opacity: 0.7;\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-lib.multiple-dropdown-component select,\n.obsidian-lib.multiple-dropdown-component select:focus,\n.obsidian-lib.multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-lib.multiple-dropdown-component select option:checked,\n.obsidian-lib.multiple-dropdown-component select:focus option:checked,\n.obsidian-lib.multiple-dropdown-component .dropdown option:checked {\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-lib.plugin-notice-name code {\n color: inherit;\n}\n.obsidian-lib.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice .obsidian-lib.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-lib.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-lib.plugin-suggestion-banner {\n background-color: var(--background-secondary);\n border-left: var(--size-2-1) solid var(--text-accent);\n border-radius: var(--radius-s);\n display: flex;\n flex-direction: column;\n gap: var(--size-4-2);\n margin-bottom: var(--size-4-4);\n padding: var(--size-4-3) var(--size-4-4);\n}\n.obsidian-lib.plugin-suggestion-banner button {\n width: fit-content;\n}\n.obsidian-lib.plugin-suggestion-notice-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-4-2);\n margin-top: var(--size-4-2);\n}\n\n.obsidian-lib.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-lib.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-lib.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-lib.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-lib.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-lib.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-lib button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-lib.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-lib :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib input.metadata-input-text:active:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-lib input[type=date]:active:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=email]:active:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=number]:active:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=password]:active:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=search]:active:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=text]:active:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus:invalid:not(.untouched),\n.obsidian-lib textarea:active:invalid:not(.untouched),\n.obsidian-lib textarea:focus-visible:invalid:not(.untouched),\n.obsidian-lib textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-lib.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-lib.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-commands.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/plugin-suggestion.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;AC/CK;EACP;;;ACJJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;;AAMF;EACE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAIJ;EACE;EACA;;AAGA;EACE;EACA;;;ACpEF;EACE;EACA;;;ACCF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACZN;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;ACrCF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;;;ACjBF;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACUN;EACE;;;ACZE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-lib%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-lib%60.%5Cn.obsidian-lib-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-lib-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Not%20%60&progress%60:%20that%20APPENDS%20the%20element%20name%20to%20the%20parent%20class,%20producing%20one%20long%20class%20that%20matches%5Cn%20%20//%20nothing.%20The%20element%20type%20has%20to%20lead%20the%20compound%20selector%20instead.%5Cn%20%20@at-root%20progress%23%7B&%7D.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-lib-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-lib-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20The%20strip%20of%20commands%20along%20the%20bottom%20of%20a%20modal.%5Cn%20%20//%5Cn%20%20//%20In%20%60Instructions%60%20render%20mode%20it%20also%20carries%20Obsidian's%20own%20%60.prompt-instructions%60%20%E2%80%94%20whose%20rule%20is%5Cn%20%20//%20unscoped,%20so%20it%20applies%20to%20a%20plain%20%60Modal%60%20too%20%E2%80%94%20and%20this%20one%20only%20re-tunes%20that%20rule's%20%60gap%60%20and%5Cn%20%20//%20%60padding%60%20and%20adds%20the%20separator;%20in%20%60Buttons%60%20mode%20it%20is%20the%20whole%20strip.%5Cn%20%20&.modal-commands%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border-top:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20control%20the%20%60Instructions%60%20renderer%20injects%20into%20an%20instruction's%20purpose%20text%20%E2%80%94%20a%20checkbox,%20a%5Cn%20%20//%20dropdown.%20Obsidian%20styles%20the%20instruction%20bar%20itself,%20but%20its%20own%20bar%20never%20contains%20a%20control,%20so%5Cn%20%20//%20nothing%20upstream%20separates%20one%20from%20the%20label%20it%20belongs%20to.%20Sits%20on%20the%20control%20rather%20than%20on%20the%5Cn%20%20//%20strip,%20so%20it%20reaches%20a%20%60SuggestModal%60's%20native%20bar%20as%20well%20as%20a%20self-created%20one.%5Cn%20%20&.modal-command-control%20%7B%5Cn%20%20%20%20margin-inline-start:%20var(--size-2-2);%5Cn%20%20%20%20vertical-align:%20middle;%5Cn%20%20%7D%5Cn%5Cn%20%20//%20One%20command%20button.%20Replaces%20the%20instruction%20bar%20rather%20than%20supplementing%20it:%20the%20bar%20can%20only%20ever%5Cn%20%20//%20say%20which%20key%20to%20press,%20and%20on%20a%20phone%20there%20is%20no%20modifier%20key%20to%20press,%20so%20every%20control%20it%20names%5Cn%20%20//%20is%20unreachable%20there.%5Cn%20%20&.modal-command%20%7B%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20align-items:%20baseline;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%5Cn%20%20%20%20//%20Comfortably%20tappable%20on%20a%20phone,%20where%20this%20strip%20is%20the%20only%20way%20in.%5Cn%20%20%20%20min-height:%20var(--size-4-8);%5Cn%20%20%20%20padding:%20var(--size-2-1)%20var(--size-4-2);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20font-size:%20var(--font-ui-smaller);%5Cn%20%20%20%20white-space:%20nowrap;%5Cn%20%20%20%20cursor:%20pointer;%5Cn%5Cn%20%20%20%20&:hover:not(:disabled)%20%7B%5Cn%20%20%20%20%20%20background-color:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20toggle%20that%20is%20ON.%20An%20action%20never%20carries%20it%20%E2%80%94%20it%20does%20something%20and%20is%20done,%20so%20there%20is%20no%5Cn%20%20%20%20//%20state%20for%20it%20to%20show.%5Cn%20%20%20%20&.is-active%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20Disabled%20rather%20than%20removed:%20a%20strip%20that%20lost%20buttons%20as%20modes%20change%20would%20reflow%20under%20the%5Cn%20%20%20%20//%20pointer,%20which%20on%20a%20phone%20means%20a%20mis-tap.%5Cn%20%20%20%20&:disabled%20%7B%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%20%20cursor:%20default;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.modal-command-hotkey%20%7B%5Cn%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20font-size:%20var(--font-smallest);%5Cn%5Cn%20%20%20%20//%20Faint%20against%20the%20surface%20is%20right;%20faint%20against%20the%20accent%20fill%20is%20invisible.%5Cn%20%20%20%20.modal-command.is-active%20&%20%7B%5Cn%20%20%20%20%20%20opacity:%200.7;%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Compound,%20not%20nested:%20%60addPluginCssClasses%60%20puts%20%60obsidian-lib%60%20and%20%60multiple-dropdown-component%60%20on%20the%5Cn%20%20//%20SAME%20element%20(the%20setting's%20control%20container),%20so%20a%20descendant%20selector%20matched%20nothing%20and%20every%20multiple%5Cn%20%20//%20dropdown%20rendered%20one%20row%20tall%20%E2%80%94%20Obsidian's%20%60.dropdown%60%20height,%20with%20no%20popup%20behind%20it%20to%20pick%20from.%5Cn%20%20&.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%5Cn%20%20%20%20//%20The%20name%20is%20inline%20code;%20it%20keeps%20the%20code%20background%20and%20font%20but%20takes%20the%20prefix's%20accent%20color.%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20color:%20inherit;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-lib.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-lib.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-lib.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-suggestion-banner%20%7B%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20border-left:%20var(--size-2-1)%20solid%20var(--text-accent);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-direction:%20column;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-4);%5Cn%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%5Cn%20%20%20%20button%20%7B%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20notice%20lays%20its%20buttons%20out%20inline%20with%20no%20spacing,%20so%20the%20action%20button%20would%20touch%20the%20decline%20button.%5Cn%20%20&.plugin-suggestion-notice-buttons%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-lib%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20inside%20the%5Cn//%20Library's%20own%20UI%20(specificity%200,2,1),%20which%20wins%20over%20tldraw's%20(0,1,1)%20while%20staying%20correct%5Cn//%20For%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20It%20MUST%20stay%20scoped%20to%20%60.obsidian-lib%60:%20an%20unscoped%20re-assert%20(it%20was%20%60body%20button%E2%80%A6%60,%5Cn//%200,1,2)%20lands%20on%20every%20button%20in%20the%20app%20and%20beats%20any%20other%20plugin's%20own%20button%20color%5Cn//%20Written%20at%200,1,1,%20which%20Obsidian's%20own%20rule%20used%20to%20lose%20to%20(obsidian-custom-attachment-location%2395).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cn.obsidian-lib%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-lib%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
96
96
|
// Annotate the CommonJS export names for ESM import in node:
|
|
97
97
|
0 && (module.exports = {
|
|
@@ -141,6 +141,7 @@ const en = {
|
|
|
141
141
|
alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.",
|
|
142
142
|
blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.",
|
|
143
143
|
dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.",
|
|
144
|
+
noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.",
|
|
144
145
|
openDependencySettings: "Open {{dependencyPluginName}} settings",
|
|
145
146
|
settingsHeading: "Required plugin missing",
|
|
146
147
|
update: "Update {{dependencyPluginName}}",
|
|
@@ -174,6 +175,13 @@ const en = {
|
|
|
174
175
|
unlockConfirmTitle: "Unlock note?",
|
|
175
176
|
unlockMenuItem: "Unlock"
|
|
176
177
|
},
|
|
178
|
+
validation: {
|
|
179
|
+
controlCharacter: "{{name}} contains a control character.",
|
|
180
|
+
emptyName: "The name is empty.",
|
|
181
|
+
trailingCharacters: "{{name}} ends with a dot or a space, which Windows removes.",
|
|
182
|
+
unsafeCharacters: "{{name}} contains characters that are not allowed: {{characters}}",
|
|
183
|
+
windowsReservedName: "{{name}} is a device name Windows reserves, so the file cannot exist on Windows."
|
|
184
|
+
},
|
|
177
185
|
vault: {
|
|
178
186
|
processFile: "Process file {{filePath}}"
|
|
179
187
|
}
|
|
@@ -183,4 +191,4 @@ const en = {
|
|
|
183
191
|
0 && (module.exports = {
|
|
184
192
|
en
|
|
185
193
|
});
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pMThuL2xvY2FsZXMvZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5MaWI6IHtcbiAgICBhc3luY1dpdGhOb3RpY2U6IHtcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcy4uLicsXG4gICAgICBvcGVyYXRpb246ICdPcGVyYXRpb24nLFxuICAgICAgcnVubmluZ0ZvcjogJ1J1bm5pbmcgZm9yJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbjogJ1lvdSBjYW4gdGVybWluYXRlIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBiZWxvdywgYnV0IGJlIGF3YXJlIGl0IG1pZ2h0IGxlYXZlIHRoZSB2YXVsdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuJyxcbiAgICAgIHRpbWVkT3V0OiAnVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIge3tkdXJhdGlvbiwgbnVtYmVyfX0gbWlsbGlzZWNvbmRzLidcbiAgICB9LFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gICAgICBvazogJ09LJ1xuICAgIH0sXG4gICAgY2FsbG91dDoge1xuICAgICAgbG9hZENvbnRlbnQ6ICdMb2FkIGNvbnRlbnQgZm9yIGNhbGxvdXQnXG4gICAgfSxcbiAgICBkYXRhdmlldzoge1xuICAgICAgaXRlbXNQZXJQYWdlOiAnSXRlbXMgcGVyIHBhZ2U6JyxcbiAgICAgIGp1bXBUb1BhZ2U6ICdKdW1wIHRvIHBhZ2U6JyxcbiAgICAgIHBhZ2VIZWFkZXI6ICdQYWdlIHt7cGFnZU51bWJlciwgbnVtYmVyfX0gb2Yge3t0b3RhbFBhZ2VzLCBudW1iZXJ9fSwgVG90YWwgaXRlbXM6IHt7dG90YWxJdGVtcywgbnVtYmVyfX0nXG4gICAgfSxcbiAgICBtZW51OiB7XG4gICAgICBjb3B5OiAnQ29weSdcbiAgICB9LFxuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIGdldEJhY2tsaW5rc0ZvckZpbGVQYXRoOiAnR2V0IGJhY2tsaW5rcyBmb3Ige3tmaWxlUGF0aH19J1xuICAgIH0sXG4gICAgbm90aWNlczoge1xuICAgICAgYXR0YWNobWVudElzU3RpbGxVc2VkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2lsbCBub3QgYmUgZGVsZXRlZC4nLFxuICAgICAgYXR0YWNobWVudFJlc2N1ZWQ6ICdBdHRhY2htZW50IHt7YXR0YWNobWVudFBhdGh9fSBpcyBzdGlsbCB1c2VkIGJ5IG90aGVyIG5vdGVzLiBJdCB3YXMgbW92ZWQgdG8ge3tuZXdBdHRhY2htZW50UGF0aH19LicsXG4gICAgICBjbG9zZUFyaWFMYWJlbDogJ0Nsb3NlJyxcbiAgICAgIGZhaWxlZFRvT3BlblVybDogJ0ZhaWxlZCB0byBvcGVuIHt7dXJsfX0nLFxuICAgICAgdW5oYW5kbGVkRXJyb3I6ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nXG4gICAgfSxcbiAgICBwYXRoU2V0dGluZ3M6IHtcbiAgICAgIGludmFsaWRHbG9iOiAnSW52YWxpZCBnbG9iIHBhdHRlcm46IHt7Z2xvYn19ICh7e3JlYXNvbn19KScsXG4gICAgICBpbnZhbGlkUmVndWxhckV4cHJlc3Npb246ICdJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjoge3tyZWdFeHB9fSAoe3tyZWFzb259fSknLFxuICAgICAgdHJhaWxpbmdFc2NhcGU6ICdpdCBlbmRzIHdpdGggYW4gdW5lc2NhcGVkIFxcXFwnLFxuICAgICAgdW5jbG9zZWRDaGFyYWN0ZXJDbGFzczogJ2EgWyBjaGFyYWN0ZXIgY2xhc3MgaXMgbmV2ZXIgY2xvc2VkIHdpdGggXSdcbiAgICB9LFxuICAgIHBsdWdpbkNvbmZsaWN0OiB7XG4gICAgICBibG9ja2VkTm90aWNlOiAne3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nIHdoaWxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZC4gVXBkYXRlIG9yIGRpc2FibGUgaXQgdG8gY29udGludWUuJyxcbiAgICAgIGNvbmZsaWN0QXBwZWFyZWROb3RpY2U6ICd7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19IGlzIG5vdyBlbmFibGVkLCBzbyB7e3BsdWdpbk5hbWV9fSBoYXMgc3RvcHBlZCB3b3JraW5nLiBVcGRhdGUgb3IgZGlzYWJsZSBpdCB0byByZXN1bWUuJyxcbiAgICAgIGRpc2FibGU6ICdEaXNhYmxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0nLFxuICAgICAgc2V0dGluZ3NIZWFkaW5nOiAnQ29uZmxpY3RpbmcgcGx1Z2luJyxcbiAgICAgIHdhcm5pbmdOb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBhbmQge3tjb25mbGljdGluZ1BsdWdpbk5hbWV9fSBvdmVybGFwLCBhbmQgYm90aCBhcmUgcnVubmluZy4nXG4gICAgfSxcbiAgICBwbHVnaW5EZXBlbmRlbmN5OiB7XG4gICAgICBhbHJlYWR5VXBUb0RhdGU6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgYWxyZWFkeSBhdCBpdHMgbGF0ZXN0IHJlbGVhc2UuIHt7cGx1Z2luTmFtZX19IG5lZWRzIGEgdmVyc2lvbiB0aGF0IGhhcyBub3QgYmVlbiByZWxlYXNlZCB5ZXQuJyxcbiAgICAgIGJsb2NrZWROb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBkb2VzIG5vdGhpbmcgdW50aWwge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZC4nLFxuICAgICAgZGVwZW5kZW5jeUxvc3ROb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgc28ge3twbHVnaW5OYW1lfX0gaGFzIHN0b3BwZWQgd29ya2luZy4gQnJpbmcgaXQgYmFjayB0byByZXN1bWUuJyxcbiAgICAgIG5vUmVhZGFibGVBcGlOb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZCBidXQgcHVibGlzaGVzIG5vIEFQSSB7e3BsdWdpbk5hbWV9fSBjYW4gcmVhZCwgc28ge3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nLiBVcGRhdGUge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHRvIHJlc3VtZS4nLFxuICAgICAgb3BlbkRlcGVuZGVuY3lTZXR0aW5nczogJ09wZW4ge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHNldHRpbmdzJyxcbiAgICAgIHNldHRpbmdzSGVhZGluZzogJ1JlcXVpcmVkIHBsdWdpbiBtaXNzaW5nJyxcbiAgICAgIHVwZGF0ZTogJ1VwZGF0ZSB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0nLFxuICAgICAgdXBkYXRlZDogJ3t7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBpcyB1cGRhdGVkLicsXG4gICAgICB1cGRhdGVGYWlsZWQ6ICdGYWlsZWQgdG8gdXBkYXRlIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fS4gQ2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICAgIHZlcnNpb25NaXNtYXRjaE5vdGljZTogJ3t7cGx1Z2luTmFtZX19IG5lZWRzIGEgbmV3ZXIgdmVyc2lvbiBvZiB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0uIFVwZGF0ZSBpdCB0byByZXN1bWUuJ1xuICAgIH0sXG4gICAgcGx1Z2luU3VnZ2VzdGlvbjoge1xuICAgICAgZW5hYmxlOiAnRW5hYmxlJyxcbiAgICAgIGluc3RhbGw6ICdJbnN0YWxsIGFuZCBlbmFibGUnLFxuICAgICAgaW5zdGFsbGVkOiAne3twbHVnaW5OYW1lfX0gaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkLicsXG4gICAgICBpbnN0YWxsRmFpbGVkOiAnRmFpbGVkIHRvIGluc3RhbGwge3twbHVnaW5OYW1lfX0uIENoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICBub3ROb3c6ICdOb3Qgbm93J1xuICAgIH0sXG4gICAgcXVldWU6IHtcbiAgICAgIGZsdXNoUXVldWU6ICdGbHVzaCBxdWV1ZSdcbiAgICB9LFxuICAgIHJlbGVhc2VOb3Rlczoge1xuICAgICAgdGl0bGU6ICd7e3BsdWdpbk5hbWV9fSByZWxlYXNlIG5vdGVzJ1xuICAgIH0sXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcjoge1xuICAgICAgaGFuZGxlRGVsZXRlOiAnSGFuZGxlIGRlbGV0ZToge3tmaWxlUGF0aH19JyxcbiAgICAgIGhhbmRsZU9ycGhhbmVkUmVuYW1lczogJ0hhbmRsZSBvcnBoYW5lZCByZW5hbWVzJyxcbiAgICAgIGhhbmRsZVJlbmFtZTogJ0hhbmRsZSByZW5hbWU6IHt7b2xkUGF0aH19IC0+IHt7bmV3UGF0aH19JyxcbiAgICAgIHVwZGF0ZWRMaW5rczogJ1VwZGF0ZWQge3tsaW5rc0NvdW50LCBudW1iZXJ9fSBsaW5rcyBpbiB7e2ZpbGVzQ291bnQsIG51bWJlcn19IGZpbGVzLidcbiAgICB9LFxuICAgIHJlc291cmNlTG9jazoge1xuICAgICAgbG9ja2VkQnlUb29sdGlwOiAnTG9ja2VkIGJ5JyxcbiAgICAgIGxvY2tlZE5vdGVUb29sdGlwOiAnVGhpcyBub3RlIGlzIGxvY2tlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyxcbiAgICAgIHVubG9ja0NvbmZpcm1NZXNzYWdlOiAnVGhpcyB3aWxsIGNhbmNlbCB0aGUgb3BlcmF0aW9uKHMpIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jayBvbiB0aGlzIG5vdGUgYW5kIG1heSBsZWF2ZSB0aGUgdmF1bHQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBUaGUgbm90ZSBpcyBsb2NrZWQgYnk6JyxcbiAgICAgIHVubG9ja0NvbmZpcm1UaXRsZTogJ1VubG9jayBub3RlPycsXG4gICAgICB1bmxvY2tNZW51SXRlbTogJ1VubG9jaydcbiAgICB9LFxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGNvbnRyb2xDaGFyYWN0ZXI6ICd7e25hbWV9fSBjb250YWlucyBhIGNvbnRyb2wgY2hhcmFjdGVyLicsXG4gICAgICBlbXB0eU5hbWU6ICdUaGUgbmFtZSBpcyBlbXB0eS4nLFxuICAgICAgdHJhaWxpbmdDaGFyYWN0ZXJzOiAne3tuYW1lfX0gZW5kcyB3aXRoIGEgZG90IG9yIGEgc3BhY2UsIHdoaWNoIFdpbmRvd3MgcmVtb3Zlcy4nLFxuICAgICAgdW5zYWZlQ2hhcmFjdGVyczogJ3t7bmFtZX19IGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQ6IHt7Y2hhcmFjdGVyc319JyxcbiAgICAgIHdpbmRvd3NSZXNlcnZlZE5hbWU6ICd7e25hbWV9fSBpcyBhIGRldmljZSBuYW1lIFdpbmRvd3MgcmVzZXJ2ZXMsIHNvIHRoZSBmaWxlIGNhbm5vdCBleGlzdCBvbiBXaW5kb3dzLidcbiAgICB9LFxuICAgIHZhdWx0OiB7XG4gICAgICBwcm9jZXNzRmlsZTogJ1Byb2Nlc3MgZmlsZSB7e2ZpbGVQYXRofX0nXG4gICAgfVxuICB9XG59IGFzIGNvbnN0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU08sTUFBTSxLQUFLO0FBQUEsRUFDaEIsYUFBYTtBQUFBLElBQ1gsaUJBQWlCO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsTUFDWixvQkFBb0I7QUFBQSxNQUNwQixVQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsSUFBSTtBQUFBLElBQ047QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixjQUFjO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0EsTUFBTTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLHlCQUF5QjtBQUFBLElBQzNCO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCx1QkFBdUI7QUFBQSxNQUN2QixtQkFBbUI7QUFBQSxNQUNuQixnQkFBZ0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUNqQixnQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsMEJBQTBCO0FBQUEsTUFDMUIsZ0JBQWdCO0FBQUEsTUFDaEIsd0JBQXdCO0FBQUEsSUFDMUI7QUFBQSxJQUNBLGdCQUFnQjtBQUFBLE1BQ2QsZUFBZTtBQUFBLE1BQ2Ysd0JBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLE1BQ1QsaUJBQWlCO0FBQUEsTUFDakIsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUNqQixlQUFlO0FBQUEsTUFDZixzQkFBc0I7QUFBQSxNQUN0QixxQkFBcUI7QUFBQSxNQUNyQix3QkFBd0I7QUFBQSxNQUN4QixpQkFBaUI7QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxJQUN6QjtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsTUFDaEIsUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2YsUUFBUTtBQUFBLElBQ1Y7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EscUJBQXFCO0FBQUEsTUFDbkIsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUEsTUFDdkIsY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixpQkFBaUI7QUFBQSxNQUNqQixtQkFBbUI7QUFBQSxNQUNuQixzQkFBc0I7QUFBQSxNQUN0QixvQkFBb0I7QUFBQSxNQUNwQixnQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLElBQ0EsWUFBWTtBQUFBLE1BQ1Ysa0JBQWtCO0FBQUEsTUFDbEIsV0FBVztBQUFBLE1BQ1gsb0JBQW9CO0FBQUEsTUFDcEIsa0JBQWtCO0FBQUEsTUFDbEIscUJBQXFCO0FBQUEsSUFDdkI7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNGOyIsIm5hbWVzIjpbXX0=
|
|
@@ -58,6 +58,7 @@ export declare const en: {
|
|
|
58
58
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
59
59
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
60
60
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
61
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
61
62
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
62
63
|
readonly settingsHeading: "Required plugin missing";
|
|
63
64
|
readonly update: "Update {{dependencyPluginName}}";
|
|
@@ -91,6 +92,13 @@ export declare const en: {
|
|
|
91
92
|
readonly unlockConfirmTitle: "Unlock note?";
|
|
92
93
|
readonly unlockMenuItem: "Unlock";
|
|
93
94
|
};
|
|
95
|
+
readonly validation: {
|
|
96
|
+
readonly controlCharacter: "{{name}} contains a control character.";
|
|
97
|
+
readonly emptyName: "The name is empty.";
|
|
98
|
+
readonly trailingCharacters: "{{name}} ends with a dot or a space, which Windows removes.";
|
|
99
|
+
readonly unsafeCharacters: "{{name}} contains characters that are not allowed: {{characters}}";
|
|
100
|
+
readonly windowsReservedName: "{{name}} is a device name Windows reserves, so the file cannot exist on Windows.";
|
|
101
|
+
};
|
|
94
102
|
readonly vault: {
|
|
95
103
|
readonly processFile: "Process file {{filePath}}";
|
|
96
104
|
};
|
|
@@ -61,6 +61,7 @@ declare const translationsMapImpl: {
|
|
|
61
61
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
62
62
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
63
63
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
64
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
64
65
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
65
66
|
readonly settingsHeading: "Required plugin missing";
|
|
66
67
|
readonly update: "Update {{dependencyPluginName}}";
|
|
@@ -94,6 +95,13 @@ declare const translationsMapImpl: {
|
|
|
94
95
|
readonly unlockConfirmTitle: "Unlock note?";
|
|
95
96
|
readonly unlockMenuItem: "Unlock";
|
|
96
97
|
};
|
|
98
|
+
readonly validation: {
|
|
99
|
+
readonly controlCharacter: "{{name}} contains a control character.";
|
|
100
|
+
readonly emptyName: "The name is empty.";
|
|
101
|
+
readonly trailingCharacters: "{{name}} ends with a dot or a space, which Windows removes.";
|
|
102
|
+
readonly unsafeCharacters: "{{name}} contains characters that are not allowed: {{characters}}";
|
|
103
|
+
readonly windowsReservedName: "{{name}} is a device name Windows reserves, so the file cannot exist on Windows.";
|
|
104
|
+
};
|
|
97
105
|
readonly vault: {
|
|
98
106
|
readonly processFile: "Process file {{filePath}}";
|
|
99
107
|
};
|
|
@@ -117,8 +117,10 @@ __export(validation_exports, {
|
|
|
117
117
|
OBSIDIAN_UNSAFE_FILENAME_CHARS: () => OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
118
118
|
UNIX_UNSAFE_PATH_CHARS: () => UNIX_UNSAFE_PATH_CHARS,
|
|
119
119
|
WINDOWS_UNSAFE_PATH_CHARS: () => WINDOWS_UNSAFE_PATH_CHARS,
|
|
120
|
+
getFileNameValidationMessage: () => getFileNameValidationMessage,
|
|
120
121
|
getOsAndObsidianUnsafePathCharsRegExp: () => getOsAndObsidianUnsafePathCharsRegExp,
|
|
121
122
|
getOsUnsafePathCharsRegExp: () => getOsUnsafePathCharsRegExp,
|
|
123
|
+
getPathValidationMessage: () => getPathValidationMessage,
|
|
122
124
|
hasWindowsTrailingChars: () => hasWindowsTrailingChars,
|
|
123
125
|
isValidationMessageHolder: () => isValidationMessageHolder,
|
|
124
126
|
isWindowsReservedName: () => isWindowsReservedName,
|
|
@@ -128,6 +130,7 @@ module.exports = __toCommonJS(validation_exports);
|
|
|
128
130
|
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
129
131
|
var import_reg_exp = require('@mnaoumov/typescript-lib/reg-exp');
|
|
130
132
|
var import_obsidian = require('obsidian');
|
|
133
|
+
var import_i18n = require('./i18n/i18n.cjs');
|
|
131
134
|
function isValidationMessageHolder(value) {
|
|
132
135
|
return value.validationMessage !== void 0;
|
|
133
136
|
}
|
|
@@ -136,6 +139,23 @@ const WINDOWS_UNSAFE_PATH_CHARS = /[*\\/<>:|?"]/g;
|
|
|
136
139
|
const UNIX_UNSAFE_PATH_CHARS = /[\0/]/g;
|
|
137
140
|
const WINDOWS_RESERVED_NAME_REG_EXP = /^(?:AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)$/i;
|
|
138
141
|
const WINDOWS_TRAILING_CHARS_REG_EXP = /[ .]+$/;
|
|
142
|
+
const FIRST_NON_CONTROL_CHAR = " ";
|
|
143
|
+
function getFileNameValidationMessage(name, isWindows) {
|
|
144
|
+
if (name === "") {
|
|
145
|
+
return (0, import_i18n.t)(($) => $.obsidianLib.validation.emptyName);
|
|
146
|
+
}
|
|
147
|
+
if (hasControlChars(name)) {
|
|
148
|
+
return (0, import_i18n.t)(($) => $.obsidianLib.validation.controlCharacter, { name });
|
|
149
|
+
}
|
|
150
|
+
const unsafeChars = new Set(name.match(getOsAndObsidianUnsafePathCharsRegExp(isWindows)));
|
|
151
|
+
if (unsafeChars.size > 0) {
|
|
152
|
+
return (0, import_i18n.t)(($) => $.obsidianLib.validation.unsafeCharacters, { characters: [...unsafeChars].join(" "), name });
|
|
153
|
+
}
|
|
154
|
+
if (hasWindowsTrailingChars(name)) {
|
|
155
|
+
return (0, import_i18n.t)(($) => $.obsidianLib.validation.trailingCharacters, { name });
|
|
156
|
+
}
|
|
157
|
+
return isWindowsReservedName(name) ? (0, import_i18n.t)(($) => $.obsidianLib.validation.windowsReservedName, { name }) : "";
|
|
158
|
+
}
|
|
139
159
|
function getOsAndObsidianUnsafePathCharsRegExp(isWindows) {
|
|
140
160
|
return (0, import_reg_exp.oneOf)([
|
|
141
161
|
getOsUnsafePathCharsRegExp(isWindows),
|
|
@@ -146,6 +166,9 @@ function getOsUnsafePathCharsRegExp(isWindows) {
|
|
|
146
166
|
isWindows ??= import_obsidian.Platform.isWin;
|
|
147
167
|
return isWindows ? WINDOWS_UNSAFE_PATH_CHARS : UNIX_UNSAFE_PATH_CHARS;
|
|
148
168
|
}
|
|
169
|
+
function getPathValidationMessage(path, isWindows) {
|
|
170
|
+
return path.split("/").map((segment) => getFileNameValidationMessage(segment, isWindows)).find(Boolean) ?? "";
|
|
171
|
+
}
|
|
149
172
|
function hasWindowsTrailingChars(name) {
|
|
150
173
|
return WINDOWS_TRAILING_CHARS_REG_EXP.test(name);
|
|
151
174
|
}
|
|
@@ -156,16 +179,26 @@ function isWindowsReservedName(name) {
|
|
|
156
179
|
function trimWindowsTrailingChars(name) {
|
|
157
180
|
return name.replace(WINDOWS_TRAILING_CHARS_REG_EXP, "");
|
|
158
181
|
}
|
|
182
|
+
function hasControlChars(name) {
|
|
183
|
+
for (const char of name) {
|
|
184
|
+
if (char < FIRST_NON_CONTROL_CHAR) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
159
190
|
// Annotate the CommonJS export names for ESM import in node:
|
|
160
191
|
0 && (module.exports = {
|
|
161
192
|
OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
162
193
|
UNIX_UNSAFE_PATH_CHARS,
|
|
163
194
|
WINDOWS_UNSAFE_PATH_CHARS,
|
|
195
|
+
getFileNameValidationMessage,
|
|
164
196
|
getOsAndObsidianUnsafePathCharsRegExp,
|
|
165
197
|
getOsUnsafePathCharsRegExp,
|
|
198
|
+
getPathValidationMessage,
|
|
166
199
|
hasWindowsTrailingChars,
|
|
167
200
|
isValidationMessageHolder,
|
|
168
201
|
isWindowsReservedName,
|
|
169
202
|
trimWindowsTrailingChars
|
|
170
203
|
});
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0aW9uIHV0aWxpdGllcy5cbiAqL1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZXh0bmFtZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBvbmVPZiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB7XG4gIHJldHVybiAodmFsdWUgYXMgUGFydGlhbDxWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcj4pLnZhbGlkYXRpb25NZXNzYWdlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzIHdpdGhpbiBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyA9IC9bI15bXFxdfF0vZztcblxuLyoqXG4gKiBXaW5kb3dzLXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA9IC9bKlxcXFwvPD46fD9cIl0vZztcblxuLyoqXG4gKiBVbml4LXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgVU5JWF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwL10vZztcblxuLyoqXG4gKiBUaGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHN0aWxsIHJlZnVzZXMgYXMgYSBmaWxlIG5hbWUsIHdpdGggb3Igd2l0aG91dCBhbiBleHRlbnNpb24uXG4gKlxuICogYENPTklOJGAgLyBgQ09OT1VUJGAgYW5kIHRoZSBzdXBlcnNjcmlwdCBgQ09NwrJgIGZvcm1zIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50OiB0aGV5IGFyZSBhY2NlcHRlZCBieVxuICogZXZlcnkgV2luZG93cyB2ZXJzaW9uIHRoYXQgcnVucyBPYnNpZGlhbiwgYW5kIG1hdGNoaW5nIHRoZW0gd291bGQgcmVuYW1lIGZpbGVzIHRoYXQgd29yay5cbiAqXG4gKiBVbmxpa2UgdGhlIGV4cG9ydGVkIGNoYXJhY3RlciBzZXRzIGFib3ZlLCB0aGlzIGNhcnJpZXMgbm8gYGdgIGZsYWcsIHNvIGB0ZXN0YCBtYXkgYmUgY2FsbGVkIG9uIGl0XG4gKiByZXBlYXRlZGx5IOKAlCBhIGBnYC1mbGFnZ2VkIHJlZ2V4cCBhZHZhbmNlcyBgbGFzdEluZGV4YCBhbmQgYW5zd2VycyBkaWZmZXJlbnRseSBvbiBjb25zZWN1dGl2ZSBjYWxscy5cbiAqL1xuY29uc3QgV0lORE9XU19SRVNFUlZFRF9OQU1FX1JFR19FWFAgPSAvXig/OkFVWHxDT01bMS05XXxDT058TFBUWzEtOV18TlVMfFBSTikkL2k7XG5cbi8qKlxuICogVGhlIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcyBXaW5kb3dzIHN0cmlwcyBmcm9tIGEgbmFtZSBiZWZvcmUgaXQgZG9lcyBhbnl0aGluZyBlbHNlIHdpdGggaXQuXG4gKi9cbmNvbnN0IFdJTkRPV1NfVFJBSUxJTkdfQ0hBUlNfUkVHX0VYUCA9IC9bIC5dKyQvO1xuXG4vKipcbiAqIFJldHVybnMgYSByZWdleHAgbWF0Y2hpbmcgYWxsIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMvcGF0aHMuXG4gKlxuICogSW5jbHVkZXMgYm90aCBPUy1zcGVjaWZpYyByZXN0cmljdGlvbnMgYW5kIE9ic2lkaWFuLXNwZWNpZmljIG9uZXMuXG4gKlxuICogQHBhcmFtIGlzV2luZG93cyAtIFdoZXRoZXIgdG8gaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIHJlc3RyaWN0aW9ucy4gRGVmYXVsdHMgdG8gYFBsYXRmb3JtLmlzV2luYC5cbiAqIEByZXR1cm5zIEEgcmVnZXhwIG1hdGNoaW5nIGFsbCB1bnNhZmUgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWVzL3BhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3NBbmRPYnNpZGlhblVuc2FmZVBhdGhDaGFyc1JlZ0V4cChpc1dpbmRvd3M/OiBib29sZWFuKTogUmVnRXhwIHtcbiAgcmV0dXJuIG9uZU9mKFtcbiAgICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cChpc1dpbmRvd3MpLFxuICAgIE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSU1xuICBdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmVnZXhwIG1hdGNoaW5nIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHNhZmUgdG8gdXNlIGluIGZpbGUgbmFtZXMvcGF0aHMgYXQgdGhlIE9TIGxldmVsLlxuICpcbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyByZXN0cmljdGlvbnMuIERlZmF1bHRzIHRvIGBQbGF0Zm9ybS5pc1dpbmAuXG4gKiBAcmV0dXJucyBBIHJlZ2V4cCBtYXRjaGluZyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzL3BhdGhzIGF0IHRoZSBPUyBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cz86IGJvb2xlYW4pOiBSZWdFeHAge1xuICBpc1dpbmRvd3MgPz89IFBsYXRmb3JtLmlzV2luO1xuICByZXR1cm4gaXNXaW5kb3dzID8gV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA6IFVOSVhfVU5TQUZFX1BBVEhfQ0hBUlM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuYW1lIGVuZHMgd2l0aCB0aGUgZG90cyBvciBzcGFjZXMgV2luZG93cyByZWZ1c2VzLlxuICpcbiAqIEFuc3dlcnMgZm9yIFdpbmRvd3MgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaW4gdXNlOiBhIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHJ1bGVzIHRoYXQgbWF0dGVyIGFyZVxuICogbm90IG5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBtYWNoaW5lIGFza2luZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIG5vdCBhIHBhdGguXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgZG90IG9yIGEgc3BhY2UsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBXSU5ET1dTX1RSQUlMSU5HX0NIQVJTX1JFR19FWFAudGVzdChuYW1lKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5hbWUgaXMgb25lIG9mIHRoZSBNUy1ET1MgZGV2aWNlIG5hbWVzIFdpbmRvd3MgcmVmdXNlcy5cbiAqXG4gKiBUd28gc3RlcHMgdGhlIGNhbGxlciB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0byBrbm93IGFib3V0IGhhcHBlbiBoZXJlOiB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMgYXJlXG4gKiB0cmltbWVkIEJFRk9SRSB0aGUgdGVzdCwgYmVjYXVzZSBXaW5kb3dzIHN0cmlwcyB0aGVtIGJlZm9yZSBkZWNpZGluZyBhbmQgYENPTiBgIGlzIHRoZXJlZm9yZSBhc1xuICogcmVzZXJ2ZWQgYXMgYENPTmA7IGFuZCB0aGUgZXh0ZW5zaW9uIGlzIGRyb3BwZWQsIGJlY2F1c2UgYENPTi5tZGAgaXMgcmVzZXJ2ZWQgdG9vLlxuICpcbiAqIGBDT05JTiRgIC8gYENPTk9VVCRgIGFuZCB0aGUgc3VwZXJzY3JpcHQgYENPTcKyYCBmb3JtcyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCByZXNlcnZlZDogdGhleSBhcmUgYWNjZXB0ZWRcbiAqIGJ5IGV2ZXJ5IFdpbmRvd3MgdmVyc2lvbiB0aGF0IHJ1bnMgT2JzaWRpYW4sIGFuZCBtYXRjaGluZyB0aGVtIHdvdWxkIHJlbmFtZSBmaWxlcyB0aGF0IHdvcmsuXG4gKlxuICogQW5zd2VycyBmb3IgV2luZG93cyByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSBpbiB1c2U6IGEgdmF1bHQgaXMgc3luY2VkLCBzbyB0aGUgcnVsZXMgdGhhdCBtYXR0ZXIgYXJlXG4gKiBub3QgbmVjZXNzYXJpbHkgdGhvc2Ugb2YgdGhlIG1hY2hpbmUgYXNraW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdG8gY2hlY2suIEEgc2luZ2xlIHBhdGggc2VnbWVudCwgd2l0aCBvciB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5hbWUgaXMgcmVzZXJ2ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3dzUmVzZXJ2ZWROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0cmltbWVkTmFtZSA9IHRyaW1XaW5kb3dzVHJhaWxpbmdDaGFycyhuYW1lKTtcbiAgcmV0dXJuIFdJTkRPV1NfUkVTRVJWRURfTkFNRV9SRUdfRVhQLnRlc3QoYmFzZW5hbWUodHJpbW1lZE5hbWUsIGV4dG5hbWUodHJpbW1lZE5hbWUpKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIFdpbmRvd3MgcmVmdXNlcyBmcm9tIHRoZSBlbmQgb2YgYSBuYW1lLlxuICpcbiAqIFRyaW0gYmVmb3JlIHRlc3RpbmcgZm9yIGEgcmVzZXJ2ZWQgbmFtZSwgbmV2ZXIgYWZ0ZXI6IHRyaW1taW5nIGFmdGVyd2FyZHMgdHVybnMgYW4gYWNjZXB0ZWQgYENPTiBgIGludG9cbiAqIGEgcmVqZWN0ZWQgYENPTmAuIHtAbGluayBpc1dpbmRvd3NSZXNlcnZlZE5hbWV9IGFscmVhZHkgZG9lcyB0aGlzIGludGVybmFsbHkuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byB0cmltLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIG5vdCBhIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgbmFtZSB3aXRob3V0IGl0cyB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMsIHdoaWNoIG1heSBiZSBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1XaW5kb3dzVHJhaWxpbmdDaGFycyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKFdJTkRPV1NfVFJBSUxJTkdfQ0hBUlNfUkVHX0VYUCwgJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLGtCQUdPO0FBQ1AscUJBQXNCO0FBQ3RCLHNCQUF5QjtBQWtCbEIsU0FBUywwQkFBMEIsT0FBa0Q7QUFDMUYsU0FBUSxNQUEyQyxzQkFBc0I7QUFDM0U7QUFLTyxNQUFNLGlDQUFpQztBQUt2QyxNQUFNLDRCQUE0QjtBQUtsQyxNQUFNLHlCQUF5QjtBQVd0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlDQUFpQztBQVVoQyxTQUFTLHNDQUFzQyxXQUE2QjtBQUNqRixhQUFPLHNCQUFNO0FBQUEsSUFDWCwyQkFBMkIsU0FBUztBQUFBLElBQ3BDO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRTyxTQUFTLDJCQUEyQixXQUE2QjtBQUN0RSxnQkFBYyx5QkFBUztBQUN2QixTQUFPLFlBQVksNEJBQTRCO0FBQ2pEO0FBV08sU0FBUyx3QkFBd0IsTUFBdUI7QUFDN0QsU0FBTywrQkFBK0IsS0FBSyxJQUFJO0FBQ2pEO0FBa0JPLFNBQVMsc0JBQXNCLE1BQXVCO0FBQzNELFFBQU0sY0FBYyx5QkFBeUIsSUFBSTtBQUNqRCxTQUFPLDhCQUE4QixTQUFLLHNCQUFTLGlCQUFhLHFCQUFRLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZGO0FBV08sU0FBUyx5QkFBeUIsTUFBc0I7QUFDN0QsU0FBTyxLQUFLLFFBQVEsZ0NBQWdDLEVBQUU7QUFDeEQ7IiwibmFtZXMiOltdfQ==
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0aW9uIHV0aWxpdGllcy5cbiAqL1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZXh0bmFtZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBvbmVPZiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB7XG4gIHJldHVybiAodmFsdWUgYXMgUGFydGlhbDxWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcj4pLnZhbGlkYXRpb25NZXNzYWdlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzIHdpdGhpbiBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyA9IC9bI15bXFxdfF0vZztcblxuLyoqXG4gKiBXaW5kb3dzLXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA9IC9bKlxcXFwvPD46fD9cIl0vZztcblxuLyoqXG4gKiBVbml4LXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgVU5JWF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwL10vZztcblxuLyoqXG4gKiBUaGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHN0aWxsIHJlZnVzZXMgYXMgYSBmaWxlIG5hbWUsIHdpdGggb3Igd2l0aG91dCBhbiBleHRlbnNpb24uXG4gKlxuICogYENPTklOJGAgLyBgQ09OT1VUJGAgYW5kIHRoZSBzdXBlcnNjcmlwdCBgQ09NwrJgIGZvcm1zIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50OiB0aGV5IGFyZSBhY2NlcHRlZCBieVxuICogZXZlcnkgV2luZG93cyB2ZXJzaW9uIHRoYXQgcnVucyBPYnNpZGlhbiwgYW5kIG1hdGNoaW5nIHRoZW0gd291bGQgcmVuYW1lIGZpbGVzIHRoYXQgd29yay5cbiAqXG4gKiBVbmxpa2UgdGhlIGV4cG9ydGVkIGNoYXJhY3RlciBzZXRzIGFib3ZlLCB0aGlzIGNhcnJpZXMgbm8gYGdgIGZsYWcsIHNvIGB0ZXN0YCBtYXkgYmUgY2FsbGVkIG9uIGl0XG4gKiByZXBlYXRlZGx5IOKAlCBhIGBnYC1mbGFnZ2VkIHJlZ2V4cCBhZHZhbmNlcyBgbGFzdEluZGV4YCBhbmQgYW5zd2VycyBkaWZmZXJlbnRseSBvbiBjb25zZWN1dGl2ZSBjYWxscy5cbiAqL1xuY29uc3QgV0lORE9XU19SRVNFUlZFRF9OQU1FX1JFR19FWFAgPSAvXig/OkFVWHxDT01bMS05XXxDT058TFBUWzEtOV18TlVMfFBSTikkL2k7XG5cbi8qKlxuICogVGhlIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcyBXaW5kb3dzIHN0cmlwcyBmcm9tIGEgbmFtZSBiZWZvcmUgaXQgZG9lcyBhbnl0aGluZyBlbHNlIHdpdGggaXQuXG4gKi9cbmNvbnN0IFdJTkRPV1NfVFJBSUxJTkdfQ0hBUlNfUkVHX0VYUCA9IC9bIC5dKyQvO1xuXG4vKipcbiAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIEMwIGNvbnRyb2wgcmFuZ2UsIFUrMDAwMCB0byBVKzAwMUYsIHdoaWNoIFdpbmRvd3MgcmVmdXNlcyBpbiBhIG5hbWUuXG4gKi9cbmNvbnN0IEZJUlNUX05PTl9DT05UUk9MX0NIQVIgPSAnICc7XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2luZ2xlIGZpbGUgb3IgZm9sZGVyIG5hbWUgYWdhaW5zdCBldmVyeSBuYW1pbmcgcnVsZSB0aGlzIG1vZHVsZSBvd25zLlxuICpcbiAqIFRoZSBydWxlcywgY2hlY2tlZCBpbiB0aGlzIG9yZGVyLCBhbmQgdGhlIGZpcnN0IG9uZSBicm9rZW4gbmFtZXMgdGhlIG1lc3NhZ2U6XG4gKlxuICogMS4gVGhlIG5hbWUgaXMgbm90IGVtcHR5LlxuICogMi4gSXQgaG9sZHMgbm8gY29udHJvbCBjaGFyYWN0ZXIgKFUrMDAwMCB0byBVKzAwMUYpLlxuICogMy4gSXQgaG9sZHMgbm9uZSBvZiB0aGUgY2hhcmFjdGVycyB7QGxpbmsgZ2V0T3NBbmRPYnNpZGlhblVuc2FmZVBhdGhDaGFyc1JlZ0V4cH0gbWF0Y2hlcy5cbiAqIDQuIEl0IGRvZXMgbm90IGVuZCB3aXRoIGEgZG90IG9yIGEgc3BhY2UgKHtAbGluayBoYXNXaW5kb3dzVHJhaWxpbmdDaGFyc30pLlxuICogNS4gSXQgaXMgbm90IGFuIE1TLURPUyBkZXZpY2UgbmFtZSAoe0BsaW5rIGlzV2luZG93c1Jlc2VydmVkTmFtZX0pLCB3aXRoIG9yIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICpcbiAqIE9ubHkgcnVsZSAzIGRlcGVuZHMgb24gYGlzV2luZG93c2AuIFJ1bGVzIDIsIDQgYW5kIDUgYXBwbHkgb24gZXZlcnkgcGxhdGZvcm0sIGJlY2F1c2UgYSB2YXVsdCBpcyBzeW5jZWQsXG4gKiBhbmQgYSBuYW1lIGNyZWF0ZWQgb24gbWFjT1Mgb3IgTGludXggdGhhdCBXaW5kb3dzIHJlZnVzZXMgYnJlYWtzIHRoZSB2YXVsdCB0aGVyZS4gVGhlIGNoYXJhY3RlciBzZXQgc3RheXNcbiAqIHBsYXRmb3JtLWRlcGVuZGVudCwgYmVjYXVzZSBhIG5hbWUgc3VjaCBhcyBgTWVldGluZzogbm90ZXNgIGlzIGNvbW1vbiBvbiBtYWNPUywgd2hlcmUgaXQgd29ya3MuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byB2YWxpZGF0ZS4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCB3aXRoIG9yIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIFdpbmRvd3Mtc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4gRGVmYXVsdHMgdG8gYFBsYXRmb3JtLmlzV2luYC5cbiAqIEByZXR1cm5zIEEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBmaXJzdCBicm9rZW4gcnVsZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBuYW1lIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZU5hbWVWYWxpZGF0aW9uTWVzc2FnZShuYW1lOiBzdHJpbmcsIGlzV2luZG93cz86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAobmFtZSA9PT0gJycpIHtcbiAgICByZXR1cm4gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi52YWxpZGF0aW9uLmVtcHR5TmFtZSk7XG4gIH1cblxuICBpZiAoaGFzQ29udHJvbENoYXJzKG5hbWUpKSB7XG4gICAgcmV0dXJuIHQoKCQpID0+ICQub2JzaWRpYW5MaWIudmFsaWRhdGlvbi5jb250cm9sQ2hhcmFjdGVyLCB7IG5hbWUgfSk7XG4gIH1cblxuICBjb25zdCB1bnNhZmVDaGFycyA9IG5ldyBTZXQobmFtZS5tYXRjaChnZXRPc0FuZE9ic2lkaWFuVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cykpKTtcbiAgaWYgKHVuc2FmZUNoYXJzLnNpemUgPiAwKSB7XG4gICAgcmV0dXJuIHQoKCQpID0+ICQub2JzaWRpYW5MaWIudmFsaWRhdGlvbi51bnNhZmVDaGFyYWN0ZXJzLCB7IGNoYXJhY3RlcnM6IFsuLi51bnNhZmVDaGFyc10uam9pbignICcpLCBuYW1lIH0pO1xuICB9XG5cbiAgaWYgKGhhc1dpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWUpKSB7XG4gICAgcmV0dXJuIHQoKCQpID0+ICQub2JzaWRpYW5MaWIudmFsaWRhdGlvbi50cmFpbGluZ0NoYXJhY3RlcnMsIHsgbmFtZSB9KTtcbiAgfVxuXG4gIHJldHVybiBpc1dpbmRvd3NSZXNlcnZlZE5hbWUobmFtZSkgPyB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnZhbGlkYXRpb24ud2luZG93c1Jlc2VydmVkTmFtZSwgeyBuYW1lIH0pIDogJyc7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJlZ2V4cCBtYXRjaGluZyBhbGwgdW5zYWZlIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lcy9wYXRocy5cbiAqXG4gKiBJbmNsdWRlcyBib3RoIE9TLXNwZWNpZmljIHJlc3RyaWN0aW9ucyBhbmQgT2JzaWRpYW4tc3BlY2lmaWMgb25lcy5cbiAqXG4gKiBAcGFyYW0gaXNXaW5kb3dzIC0gV2hldGhlciB0byBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgcmVzdHJpY3Rpb25zLiBEZWZhdWx0cyB0byBgUGxhdGZvcm0uaXNXaW5gLlxuICogQHJldHVybnMgQSByZWdleHAgbWF0Y2hpbmcgYWxsIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMvcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPc0FuZE9ic2lkaWFuVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cz86IGJvb2xlYW4pOiBSZWdFeHAge1xuICByZXR1cm4gb25lT2YoW1xuICAgIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cyksXG4gICAgT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTXG4gIF0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByZWdleHAgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgc2FmZSB0byB1c2UgaW4gZmlsZSBuYW1lcy9wYXRocyBhdCB0aGUgT1MgbGV2ZWwuXG4gKlxuICogQHBhcmFtIGlzV2luZG93cyAtIFdoZXRoZXIgdG8gaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIHJlc3RyaWN0aW9ucy4gRGVmYXVsdHMgdG8gYFBsYXRmb3JtLmlzV2luYC5cbiAqIEByZXR1cm5zIEEgcmVnZXhwIG1hdGNoaW5nIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHNhZmUgdG8gdXNlIGluIGZpbGUgbmFtZXMvcGF0aHMgYXQgdGhlIE9TIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAoaXNXaW5kb3dzPzogYm9vbGVhbik6IFJlZ0V4cCB7XG4gIGlzV2luZG93cyA/Pz0gUGxhdGZvcm0uaXNXaW47XG4gIHJldHVybiBpc1dpbmRvd3MgPyBXSU5ET1dTX1VOU0FGRV9QQVRIX0NIQVJTIDogVU5JWF9VTlNBRkVfUEFUSF9DSEFSUztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXZlcnkgc2VnbWVudCBvZiBhIHZhdWx0IHBhdGggd2l0aCB7QGxpbmsgZ2V0RmlsZU5hbWVWYWxpZGF0aW9uTWVzc2FnZX0uXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgdmF1bHQtcmVsYXRpdmUgcGF0aCB0byB2YWxpZGF0ZSwgd2l0aCBgL2AgYXMgdGhlIHNlcGFyYXRvci5cbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIFdpbmRvd3Mtc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4gRGVmYXVsdHMgdG8gYFBsYXRmb3JtLmlzV2luYC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIGZvciB0aGUgZmlyc3QgaW52YWxpZCBzZWdtZW50LCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgZXZlcnkgc2VnbWVudCBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGhWYWxpZGF0aW9uTWVzc2FnZShwYXRoOiBzdHJpbmcsIGlzV2luZG93cz86IGJvb2xlYW4pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5zcGxpdCgnLycpLm1hcCgoc2VnbWVudCkgPT4gZ2V0RmlsZU5hbWVWYWxpZGF0aW9uTWVzc2FnZShzZWdtZW50LCBpc1dpbmRvd3MpKS5maW5kKEJvb2xlYW4pID8/ICcnO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmFtZSBlbmRzIHdpdGggdGhlIGRvdHMgb3Igc3BhY2VzIFdpbmRvd3MgcmVmdXNlcy5cbiAqXG4gKiBBbnN3ZXJzIGZvciBXaW5kb3dzIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtIGluIHVzZTogYSB2YXVsdCBpcyBzeW5jZWQsIHNvIHRoZSBydWxlcyB0aGF0IG1hdHRlciBhcmVcbiAqIG5vdCBuZWNlc3NhcmlseSB0aG9zZSBvZiB0aGUgbWFjaGluZSBhc2tpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byBjaGVjay4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCBub3QgYSBwYXRoLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIGRvdCBvciBhIHNwYWNlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gV0lORE9XU19UUkFJTElOR19DSEFSU19SRUdfRVhQLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuYW1lIGlzIG9uZSBvZiB0aGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHJlZnVzZXMuXG4gKlxuICogVHdvIHN0ZXBzIHRoZSBjYWxsZXIgd291bGQgb3RoZXJ3aXNlIGhhdmUgdG8ga25vdyBhYm91dCBoYXBwZW4gaGVyZTogdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIGFyZVxuICogdHJpbW1lZCBCRUZPUkUgdGhlIHRlc3QsIGJlY2F1c2UgV2luZG93cyBzdHJpcHMgdGhlbSBiZWZvcmUgZGVjaWRpbmcgYW5kIGBDT04gYCBpcyB0aGVyZWZvcmUgYXNcbiAqIHJlc2VydmVkIGFzIGBDT05gOyBhbmQgdGhlIGV4dGVuc2lvbiBpcyBkcm9wcGVkLCBiZWNhdXNlIGBDT04ubWRgIGlzIHJlc2VydmVkIHRvby5cbiAqXG4gKiBgQ09OSU4kYCAvIGBDT05PVVQkYCBhbmQgdGhlIHN1cGVyc2NyaXB0IGBDT03CsmAgZm9ybXMgYXJlIGRlbGliZXJhdGVseSBOT1QgcmVzZXJ2ZWQ6IHRoZXkgYXJlIGFjY2VwdGVkXG4gKiBieSBldmVyeSBXaW5kb3dzIHZlcnNpb24gdGhhdCBydW5zIE9ic2lkaWFuLCBhbmQgbWF0Y2hpbmcgdGhlbSB3b3VsZCByZW5hbWUgZmlsZXMgdGhhdCB3b3JrLlxuICpcbiAqIEFuc3dlcnMgZm9yIFdpbmRvd3MgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaW4gdXNlOiBhIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHJ1bGVzIHRoYXQgbWF0dGVyIGFyZVxuICogbm90IG5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBtYWNoaW5lIGFza2luZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIHdpdGggb3Igd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGlzIHJlc2VydmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2luZG93c1Jlc2VydmVkTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZE5hbWUgPSB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZSk7XG4gIHJldHVybiBXSU5ET1dTX1JFU0VSVkVEX05BTUVfUkVHX0VYUC50ZXN0KGJhc2VuYW1lKHRyaW1tZWROYW1lLCBleHRuYW1lKHRyaW1tZWROYW1lKSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcyBXaW5kb3dzIHJlZnVzZXMgZnJvbSB0aGUgZW5kIG9mIGEgbmFtZS5cbiAqXG4gKiBUcmltIGJlZm9yZSB0ZXN0aW5nIGZvciBhIHJlc2VydmVkIG5hbWUsIG5ldmVyIGFmdGVyOiB0cmltbWluZyBhZnRlcndhcmRzIHR1cm5zIGFuIGFjY2VwdGVkIGBDT04gYCBpbnRvXG4gKiBhIHJlamVjdGVkIGBDT05gLiB7QGxpbmsgaXNXaW5kb3dzUmVzZXJ2ZWROYW1lfSBhbHJlYWR5IGRvZXMgdGhpcyBpbnRlcm5hbGx5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdG8gdHJpbS4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCBub3QgYSBwYXRoLlxuICogQHJldHVybnMgVGhlIG5hbWUgd2l0aG91dCBpdHMgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzLCB3aGljaCBtYXkgYmUgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZShXSU5ET1dTX1RSQUlMSU5HX0NIQVJTX1JFR19FWFAsICcnKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5hbWUgaG9sZHMgYSBjb250cm9sIGNoYXJhY3RlciwgVSswMDAwIHRvIFUrMDAxRi5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGhvbGRzIGEgY29udHJvbCBjaGFyYWN0ZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBoYXNDb250cm9sQ2hhcnMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgY2hhciBvZiBuYW1lKSB7XG4gICAgaWYgKGNoYXIgPCBGSVJTVF9OT05fQ09OVFJPTF9DSEFSKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLGtCQUdPO0FBQ1AscUJBQXNCO0FBQ3RCLHNCQUF5QjtBQUV6QixrQkFBa0I7QUFrQlgsU0FBUywwQkFBMEIsT0FBa0Q7QUFDMUYsU0FBUSxNQUEyQyxzQkFBc0I7QUFDM0U7QUFLTyxNQUFNLGlDQUFpQztBQUt2QyxNQUFNLDRCQUE0QjtBQUtsQyxNQUFNLHlCQUF5QjtBQVd0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlDQUFpQztBQUt2QyxNQUFNLHlCQUF5QjtBQXFCeEIsU0FBUyw2QkFBNkIsTUFBYyxXQUE2QjtBQUN0RixNQUFJLFNBQVMsSUFBSTtBQUNmLGVBQU8sZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLFdBQVcsU0FBUztBQUFBLEVBQ3BEO0FBRUEsTUFBSSxnQkFBZ0IsSUFBSSxHQUFHO0FBQ3pCLGVBQU8sZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLFdBQVcsa0JBQWtCLEVBQUUsS0FBSyxDQUFDO0FBQUEsRUFDckU7QUFFQSxRQUFNLGNBQWMsSUFBSSxJQUFJLEtBQUssTUFBTSxzQ0FBc0MsU0FBUyxDQUFDLENBQUM7QUFDeEYsTUFBSSxZQUFZLE9BQU8sR0FBRztBQUN4QixlQUFPLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxHQUFHLFdBQVcsRUFBRSxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUM3RztBQUVBLE1BQUksd0JBQXdCLElBQUksR0FBRztBQUNqQyxlQUFPLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLG9CQUFvQixFQUFFLEtBQUssQ0FBQztBQUFBLEVBQ3ZFO0FBRUEsU0FBTyxzQkFBc0IsSUFBSSxRQUFJLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxJQUFJO0FBQzFHO0FBVU8sU0FBUyxzQ0FBc0MsV0FBNkI7QUFDakYsYUFBTyxzQkFBTTtBQUFBLElBQ1gsMkJBQTJCLFNBQVM7QUFBQSxJQUNwQztBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUU8sU0FBUywyQkFBMkIsV0FBNkI7QUFDdEUsZ0JBQWMseUJBQVM7QUFDdkIsU0FBTyxZQUFZLDRCQUE0QjtBQUNqRDtBQVNPLFNBQVMseUJBQXlCLE1BQWMsV0FBNkI7QUFDbEYsU0FBTyxLQUFLLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLDZCQUE2QixTQUFTLFNBQVMsQ0FBQyxFQUFFLEtBQUssT0FBTyxLQUFLO0FBQzdHO0FBV08sU0FBUyx3QkFBd0IsTUFBdUI7QUFDN0QsU0FBTywrQkFBK0IsS0FBSyxJQUFJO0FBQ2pEO0FBa0JPLFNBQVMsc0JBQXNCLE1BQXVCO0FBQzNELFFBQU0sY0FBYyx5QkFBeUIsSUFBSTtBQUNqRCxTQUFPLDhCQUE4QixTQUFLLHNCQUFTLGlCQUFhLHFCQUFRLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZGO0FBV08sU0FBUyx5QkFBeUIsTUFBc0I7QUFDN0QsU0FBTyxLQUFLLFFBQVEsZ0NBQWdDLEVBQUU7QUFDeEQ7QUFRQSxTQUFTLGdCQUFnQixNQUF1QjtBQUM5QyxhQUFXLFFBQVEsTUFBTTtBQUN2QixRQUFJLE9BQU8sd0JBQXdCO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLCJuYW1lcyI6W119
|
|
@@ -32,6 +32,26 @@ export declare const WINDOWS_UNSAFE_PATH_CHARS: RegExp;
|
|
|
32
32
|
* Unix-specific unsafe file name path characters.
|
|
33
33
|
*/
|
|
34
34
|
export declare const UNIX_UNSAFE_PATH_CHARS: RegExp;
|
|
35
|
+
/**
|
|
36
|
+
* Validates a single file or folder name against every naming rule this module owns.
|
|
37
|
+
*
|
|
38
|
+
* The rules, checked in this order, and the first one broken names the message:
|
|
39
|
+
*
|
|
40
|
+
* 1. The name is not empty.
|
|
41
|
+
* 2. It holds no control character (U+0000 to U+001F).
|
|
42
|
+
* 3. It holds none of the characters {@link getOsAndObsidianUnsafePathCharsRegExp} matches.
|
|
43
|
+
* 4. It does not end with a dot or a space ({@link hasWindowsTrailingChars}).
|
|
44
|
+
* 5. It is not an MS-DOS device name ({@link isWindowsReservedName}), with or without an extension.
|
|
45
|
+
*
|
|
46
|
+
* Only rule 3 depends on `isWindows`. Rules 2, 4 and 5 apply on every platform, because a vault is synced,
|
|
47
|
+
* and a name created on macOS or Linux that Windows refuses breaks the vault there. The character set stays
|
|
48
|
+
* platform-dependent, because a name such as `Meeting: notes` is common on macOS, where it works.
|
|
49
|
+
*
|
|
50
|
+
* @param name - The name to validate. A single path segment, with or without its extension.
|
|
51
|
+
* @param isWindows - Whether to include the Windows-specific character set. Defaults to `Platform.isWin`.
|
|
52
|
+
* @returns A message describing the first broken rule, or an empty string if the name is valid.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getFileNameValidationMessage(name: string, isWindows?: boolean): string;
|
|
35
55
|
/**
|
|
36
56
|
* Returns a regexp matching all unsafe characters in file names/paths.
|
|
37
57
|
*
|
|
@@ -48,6 +68,14 @@ export declare function getOsAndObsidianUnsafePathCharsRegExp(isWindows?: boolea
|
|
|
48
68
|
* @returns A regexp matching characters that are not safe to use in file names/paths at the OS level.
|
|
49
69
|
*/
|
|
50
70
|
export declare function getOsUnsafePathCharsRegExp(isWindows?: boolean): RegExp;
|
|
71
|
+
/**
|
|
72
|
+
* Validates every segment of a vault path with {@link getFileNameValidationMessage}.
|
|
73
|
+
*
|
|
74
|
+
* @param path - The vault-relative path to validate, with `/` as the separator.
|
|
75
|
+
* @param isWindows - Whether to include the Windows-specific character set. Defaults to `Platform.isWin`.
|
|
76
|
+
* @returns The message for the first invalid segment, or an empty string if every segment is valid.
|
|
77
|
+
*/
|
|
78
|
+
export declare function getPathValidationMessage(path: string, isWindows?: boolean): string;
|
|
51
79
|
/**
|
|
52
80
|
* Checks whether a name ends with the dots or spaces Windows refuses.
|
|
53
81
|
*
|
|
@@ -160,7 +160,7 @@ export { PluginStatusBarItemRegistrar } from './status-bar-item-registrar.mjs';
|
|
|
160
160
|
export { getTemplaterFunctions, getTemplaterRenderTargetFile, parseTemplate, requireTemplaterApi, resolveTemplaterApi, TEMPLATER_PLUGIN_ID, TemplaterActiveFileProvider, TemplaterRunMode, TemplaterUnavailabilityReason, TemplaterUnavailableError } from './templater.mjs';
|
|
161
161
|
export { DurationTransformer } from './transformers/duration-transformer.mjs';
|
|
162
162
|
export { clickElement, clickMouse, hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement } from './trusted-input.mjs';
|
|
163
|
-
export { getOsAndObsidianUnsafePathCharsRegExp, getOsUnsafePathCharsRegExp, hasWindowsTrailingChars, isValidationMessageHolder, isWindowsReservedName, OBSIDIAN_UNSAFE_FILENAME_CHARS, trimWindowsTrailingChars, UNIX_UNSAFE_PATH_CHARS, WINDOWS_UNSAFE_PATH_CHARS } from './validation.mjs';
|
|
163
|
+
export { getFileNameValidationMessage, getOsAndObsidianUnsafePathCharsRegExp, getOsUnsafePathCharsRegExp, getPathValidationMessage, hasWindowsTrailingChars, isValidationMessageHolder, isWindowsReservedName, OBSIDIAN_UNSAFE_FILENAME_CHARS, trimWindowsTrailingChars, UNIX_UNSAFE_PATH_CHARS, WINDOWS_UNSAFE_PATH_CHARS } from './validation.mjs';
|
|
164
164
|
export { deleteIfNotUsed, DeleteIfNotUsedResult } from './vault-delete.mjs';
|
|
165
165
|
export { VaultTransaction } from './vault-transaction.mjs';
|
|
166
166
|
export { cleanupEmptyFolders, copySafe, createFolderSafe, CreateFolderSafeResult, createTemporaryFile, createTemporaryFolder, deleteEmptyFolder, deleteEmptyFolderHierarchy, getAbstractFilePathSafe, getAvailablePath, getFilePathSafe, getFolderPathSafe, getMarkdownFilesSorted, getNoteFilesSorted, getOrCreateAbstractFileSafe, getOrCreateFileSafe, getOrCreateFolderSafe, getSafeRenamePath, InvokeFileActionSafeResult, invokeWithFileSystemLock, isChild, isChildOrSelf, isEmptyFolder, listSafe, process, readSafe, renameSafe, saveNote, trashSafe } from './vault.mjs';
|