Merge branch 'release/10.9.0'

This commit is contained in:
Mo
2022-01-20 09:48:07 -06:00
53 changed files with 723 additions and 7808 deletions

View File

@@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.05 13.2333L13.2333 12.05L15 13.825L16.7667 12.05L17.95 13.2333L16.175 15L17.95 16.7667L16.7667 17.95L15 16.175L13.2333 17.95L12.05 16.7667L13.825 15L12.05 13.2333ZM4.16667 2.5H15.8333C16.7583 2.5 17.5 3.24167 17.5 4.16667V10.6667C16.9917 10.375 16.4333 10.1667 15.8333 10.0667V4.16667H4.16667V15.8333H10.0667C10.1667 16.4333 10.375 16.9917 10.6667 17.5H4.16667C3.24167 17.5 2.5 16.7583 2.5 15.8333V4.16667C2.5 3.24167 3.24167 2.5 4.16667 2.5ZM5.83333 5.83333H14.1667V7.5H5.83333V5.83333ZM5.83333 9.16667H14.1667V10.0667C13.4583 10.1833 12.8083 10.45 12.2333 10.8333H5.83333V9.16667ZM5.83333 12.5H10V14.1667H5.83333V12.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 717 B

View File

@@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4728 11.7841L10.4352 6.35376C10.2886 5.98329 10.1419 5.51532 9.99522 4.94986C9.92507 5.22934 9.85173 5.48932 9.7752 5.72981C9.70505 5.97029 9.6349 6.18477 9.56475 6.37326L7.53679 11.7841H12.4728ZM16.5 17H14.9312C14.7526 17 14.606 16.9545 14.4912 16.8635C14.3764 16.7725 14.2935 16.6555 14.2425 16.5125L13.0276 13.266H6.97241L5.75754 16.5125C5.7129 16.636 5.63 16.7498 5.50883 16.8538C5.38766 16.9513 5.24099 17 5.0688 17H3.5L8.97167 3H11.0283L16.5 17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -3,7 +3,7 @@ import { AppState } from '@/ui_models/app_state';
import { isDev } from '@/utils';
import { observer } from 'mobx-react-lite';
import { FunctionComponent } from 'preact';
import { useState } from 'preact/hooks';
import { useEffect, useState } from 'preact/hooks';
import { Checkbox } from '../Checkbox';
import { Icon } from '../Icon';
import { InputWithIcon } from '../InputWithIcon';
@@ -20,12 +20,6 @@ export const AdvancedOptions: FunctionComponent<Props> = observer(
appState.accountMenu;
const [showAdvanced, setShowAdvanced] = useState(false);
if (isDev && window._devAccountServer) {
setEnableServerOption(true);
setServer(window._devAccountServer);
application.setCustomHost(window._devAccountServer);
}
const handleServerOptionChange = (e: Event) => {
if (e.target instanceof HTMLInputElement) {
setEnableServerOption(e.target.checked);

View File

@@ -33,15 +33,14 @@ export const SignInPane: FunctionComponent<Props> = observer(
const emailInputRef = useRef<HTMLInputElement>(null);
const passwordInputRef = useRef<HTMLInputElement>(null);
if (isDev && window._devAccountEmail) {
setEmail(window._devAccountEmail);
setPassword(window._devAccountPassword as string);
}
useEffect(() => {
if (emailInputRef?.current) {
emailInputRef.current?.focus();
}
if (isDev && window._devAccountEmail) {
setEmail(window._devAccountEmail);
setPassword(window._devAccountPassword as string);
}
}, []);
const resetInvalid = () => {

View File

@@ -9,21 +9,22 @@ import {
import VisuallyHidden from '@reach/visually-hidden';
import { FunctionComponent } from 'preact';
import { IconType, Icon } from './Icon';
import { useEffect, useState } from 'preact/hooks';
export type DropdownItem = {
icon?: IconType;
iconClassName?: string;
label: string;
value: string;
disabled?: boolean;
};
type DropdownProps = {
id: string;
label: string;
items: DropdownItem[];
defaultValue: string;
onChange: (value: string) => void;
value: string;
onChange: (value: string, item: DropdownItem) => void;
disabled?: boolean;
};
type ListboxButtonProps = DropdownItem & {
@@ -59,20 +60,18 @@ export const Dropdown: FunctionComponent<DropdownProps> = ({
id,
label,
items,
defaultValue,
value,
onChange,
disabled,
}) => {
const [value, setValue] = useState(defaultValue);
useEffect(() => {
setValue(defaultValue);
}, [defaultValue]);
const labelId = `${id}-label`;
const handleChange = (value: string) => {
setValue(value);
onChange(value);
const selectedItem = items.find(
(item) => item.value === value
) as DropdownItem;
onChange(value, selectedItem);
};
return (
@@ -82,6 +81,7 @@ export const Dropdown: FunctionComponent<DropdownProps> = ({
value={value}
onChange={handleChange}
aria-labelledby={labelId}
disabled={disabled}
>
<ListboxButton
className="sn-dropdown-button"
@@ -106,6 +106,7 @@ export const Dropdown: FunctionComponent<DropdownProps> = ({
className="sn-dropdown-item"
value={item.value}
label={item.label}
disabled={item.disabled}
>
{item.icon ? (
<div className="flex mr-3">

View File

@@ -113,6 +113,7 @@ const ICONS = {
add: AddIcon,
help: HelpIcon,
keyboard: KeyboardIcon,
spellcheck: NotesIcon,
'list-bulleted': ListBulleted,
'link-off': LinkOffIcon,
listed: ListedIcon,

View File

@@ -35,6 +35,8 @@ const DeletePermanentlyButton = ({
</button>
);
const iconClass = 'color-neutral mr-2';
const getWordCount = (text: string) => {
if (text.trim().length === 0) {
return 0;
@@ -133,6 +135,39 @@ const NoteAttributes: FunctionComponent<{ application: SNApplication, note: SNNo
);
};
const SpellcheckOptions: FunctionComponent<{
appState: AppState, note: SNNote
}> = ({ appState, note }) => {
const editor = appState.application.componentManager.editorForNote(note);
const spellcheckControllable = Boolean(
!editor ||
appState.application.getFeature(editor.identifier)?.spellcheckControl
);
const noteSpellcheck = !spellcheckControllable ? true : note ? appState.notes.getSpellcheckStateForNote(note) : undefined;
return (
<div className="flex flex-col px-3 py-1.5">
<Switch
className="px-0 py-0"
checked={noteSpellcheck}
disabled={!spellcheckControllable}
onChange={() => {
appState.notes.toggleGlobalSpellcheckForNote(note);
}}
>
<span className="flex items-center">
<Icon type='spellcheck' className={iconClass} />
Spellcheck
</span>
</Switch>
{!spellcheckControllable && (
<p className="text-xs pt-1.5">Spellcheck cannot be controlled for this editor.</p>
)}
</div>
);
};
export const NotesOptions = observer(
({ application, appState, closeOnBlur, onSubmenuChange }: Props) => {
const [tagsMenuOpen, setTagsMenuOpen] = useState(false);
@@ -171,8 +206,6 @@ export const NotesOptions = observer(
const tagsButtonRef = useRef<HTMLButtonElement>(null);
const iconClass = 'color-neutral mr-2';
useEffect(() => {
if (onSubmenuChange) {
onSubmenuChange(tagsMenuOpen);
@@ -350,10 +383,9 @@ export const NotesOptions = observer(
>
<span
className={`whitespace-nowrap overflow-hidden overflow-ellipsis
${
appState.notes.isTagInSelectedNotes(tag)
? 'font-bold'
: ''
${appState.notes.isTagInSelectedNotes(tag)
? 'font-bold'
: ''
}`}
>
{tag.title}
@@ -484,9 +516,16 @@ export const NotesOptions = observer(
</button>
</>
)}
{notes.length === 1 ? (
<>
<div className="min-h-1px my-2 bg-border"></div>
<SpellcheckOptions appState={appState} note={notes[0]} />
<div className="min-h-1px my-2 bg-border"></div>
<NoteAttributes application={application} note={notes[0]} />
</>
) : null}

View File

@@ -49,6 +49,19 @@ const toggleFocusMode = (enabled: boolean) => {
}
};
export const sortThemes = (a: SNTheme, b: SNTheme) => {
const aIsLayerable = a.isLayerable();
const bIsLayerable = b.isLayerable();
if (aIsLayerable && !bIsLayerable) {
return 1;
} else if (!aIsLayerable && bIsLayerable) {
return -1;
} else {
return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
}
};
const QuickSettingsMenu: FunctionComponent<MenuProps> = observer(
({ application, appState }) => {
const {
@@ -79,23 +92,7 @@ const QuickSettingsMenu: FunctionComponent<MenuProps> = observer(
const themes = application.getDisplayableItems(
ContentType.Theme
) as SNTheme[];
setThemes(
themes.sort((a, b) => {
const aIsLayerable = a.isLayerable();
const bIsLayerable = b.isLayerable();
if (aIsLayerable && !bIsLayerable) {
return 1;
} else if (!aIsLayerable && bIsLayerable) {
return -1;
} else {
return a.name.toLowerCase() <
b.name.toLowerCase()
? -1
: 1;
}
})
);
setThemes(themes.sort(sortThemes));
setDefaultThemeOn(
!themes.find((theme) => theme.active && !theme.isLayerable())
);

View File

@@ -29,7 +29,7 @@ export const Switch: FunctionalComponent<SwitchProps> = (
return (
<label
className={`sn-component flex justify-between items-center cursor-pointer px-3 ${className}`}
className={`sn-component flex justify-between items-center cursor-pointer px-3 ${className} ${isDisabled ? 'faded' : ''}`}
{...(props.role ? { role: props.role } : {})}
>
{props.children}
@@ -51,9 +51,8 @@ export const Switch: FunctionalComponent<SwitchProps> = (
/>
<span
aria-hidden
className={`sn-switch-handle ${
checked ? 'sn-switch-handle--right' : ''
}`}
className={`sn-switch-handle ${checked ? 'sn-switch-handle--right' : ''
}`}
/>
</CustomCheckboxContainer>
</label>

View File

@@ -52,6 +52,7 @@ const PREFERENCES_MENU_ITEMS: PreferencesMenuItem[] = [
const READY_PREFERENCES_MENU_ITEMS: PreferencesMenuItem[] = [
{ id: 'account', label: 'Account', icon: 'user' },
{ id: 'general', label: 'General', icon: 'settings' },
{ id: 'appearance', label: 'Appearance', icon: 'themes' },
{ id: 'security', label: 'Security', icon: 'security' },
{ id: 'backups', label: 'Backups', icon: 'restore' },
{ id: 'listed', label: 'Listed', icon: 'listed' },

View File

@@ -18,6 +18,7 @@ import { AppState } from '@/ui_models/app_state';
import { useEffect, useMemo } from 'preact/hooks';
import { ExtensionPane } from './panes/ExtensionPane';
import { Backups } from '@/preferences/panes/Backups';
import { Appearance } from './panes/Appearance';
interface PreferencesProps extends MfaProps {
application: WebApplication;
@@ -42,7 +43,7 @@ const PaneSelector: FunctionComponent<
<AccountPreferences application={application} appState={appState} />
);
case 'appearance':
return null;
return <Appearance application={application} />;
case 'security':
return (
<Security

View File

@@ -0,0 +1,196 @@
import { Dropdown, DropdownItem } from '@/components/Dropdown';
import { PremiumModalProvider, usePremiumModal } from '@/components/Premium';
import { sortThemes } from '@/components/QuickSettingsMenu/QuickSettingsMenu';
import { HorizontalSeparator } from '@/components/shared/HorizontalSeparator';
import { Switch } from '@/components/Switch';
import { WebApplication } from '@/ui_models/application';
import { Features } from '@standardnotes/features';
import {
ContentType,
FeatureIdentifier,
FeatureStatus,
PrefKey,
SNTheme,
} from '@standardnotes/snjs';
import { observer } from 'mobx-react-lite';
import { FunctionComponent } from 'preact';
import { useEffect, useState } from 'preact/hooks';
import {
PreferencesGroup,
PreferencesPane,
PreferencesSegment,
Subtitle,
Title,
Text,
} from '../components';
type Props = {
application: WebApplication;
};
const AppearancePane: FunctionComponent<Props> = observer(({ application }) => {
const premiumModal = usePremiumModal();
const isEntitledToMidnightTheme =
application.getFeatureStatus(FeatureIdentifier.MidnightTheme) ===
FeatureStatus.Entitled;
const [themeItems, setThemeItems] = useState<DropdownItem[]>([]);
const [autoLightTheme, setAutoLightTheme] = useState<string>(
() =>
application.getPreference(
PrefKey.AutoLightThemeIdentifier,
'Default'
) as string
);
const [autoDarkTheme, setAutoDarkTheme] = useState<string>(
() =>
application.getPreference(
PrefKey.AutoDarkThemeIdentifier,
isEntitledToMidnightTheme ? FeatureIdentifier.MidnightTheme : 'Default'
) as string
);
const [useDeviceSettings, setUseDeviceSettings] = useState(
() =>
application.getPreference(PrefKey.UseSystemColorScheme, false) as boolean
);
useEffect(() => {
const themesAsItems: DropdownItem[] = (
application.getDisplayableItems(ContentType.Theme) as SNTheme[]
)
.filter((theme) => !theme.isLayerable())
.sort(sortThemes)
.map((theme) => {
return {
label: theme.name,
value: theme.identifier as string,
};
});
Features.filter(
(feature) =>
feature.content_type === ContentType.Theme && !feature.layerable
).forEach((theme) => {
if (
themesAsItems.findIndex((item) => item.value === theme.identifier) ===
-1
) {
themesAsItems.push({
label: theme.name as string,
value: theme.identifier,
icon: 'premium-feature',
});
}
});
themesAsItems.unshift({
label: 'Default',
value: 'Default',
});
setThemeItems(themesAsItems);
}, [application]);
const toggleUseDeviceSettings = () => {
application.setPreference(PrefKey.UseSystemColorScheme, !useDeviceSettings);
if (!application.getPreference(PrefKey.AutoLightThemeIdentifier)) {
application.setPreference(
PrefKey.AutoLightThemeIdentifier,
autoLightTheme as FeatureIdentifier
);
}
if (!application.getPreference(PrefKey.AutoDarkThemeIdentifier)) {
application.setPreference(
PrefKey.AutoDarkThemeIdentifier,
autoDarkTheme as FeatureIdentifier
);
}
setUseDeviceSettings(!useDeviceSettings);
};
const changeAutoLightTheme = (value: string, item: DropdownItem) => {
if (item.icon === 'premium-feature') {
premiumModal.activate(`${item.label} theme`);
} else {
application.setPreference(
PrefKey.AutoLightThemeIdentifier,
value as FeatureIdentifier
);
setAutoLightTheme(value);
}
};
const changeAutoDarkTheme = (value: string, item: DropdownItem) => {
if (item.icon === 'premium-feature') {
premiumModal.activate(`${item.label} theme`);
} else {
application.setPreference(
PrefKey.AutoDarkThemeIdentifier,
value as FeatureIdentifier
);
setAutoDarkTheme(value);
}
};
return (
<PreferencesPane>
<PreferencesGroup>
<PreferencesSegment>
<Title>Themes</Title>
<div className="mt-2">
<div className="flex items-center justify-between">
<div className="flex flex-col">
<Subtitle>Use system color scheme</Subtitle>
<Text>
Automatically change active theme based on your system settings.
</Text>
</div>
<Switch
onChange={toggleUseDeviceSettings}
checked={useDeviceSettings}
/>
</div>
<HorizontalSeparator classes="mt-5 mb-3" />
<div>
<Subtitle>Automatic Light Theme</Subtitle>
<Text>Theme to be used for system light mode:</Text>
<div className="mt-2">
<Dropdown
id="auto-light-theme-dropdown"
label="Select the automatic light theme"
items={themeItems}
value={autoLightTheme}
onChange={changeAutoLightTheme}
disabled={!useDeviceSettings}
/>
</div>
</div>
<HorizontalSeparator classes="mt-5 mb-3" />
<div>
<Subtitle>Automatic Dark Theme</Subtitle>
<Text>Theme to be used for system dark mode:</Text>
<div className="mt-2">
<Dropdown
id="auto-dark-theme-dropdown"
label="Select the automatic dark theme"
items={themeItems}
value={autoDarkTheme}
onChange={changeAutoDarkTheme}
disabled={!useDeviceSettings}
/>
</div>
</div>
</div>
</PreferencesSegment>
</PreferencesGroup>
</PreferencesPane>
);
});
export const Appearance: FunctionComponent<Props> = observer(
({ application }) => (
<PremiumModalProvider state={application.getAppState().features}>
<AppearancePane application={application} />
</PremiumModalProvider>
)
);

View File

@@ -157,7 +157,7 @@ export const EmailBackups = observer(({ application }: Props) => {
id="def-editor-dropdown"
label="Select email frequency"
items={emailFrequencyOptions}
defaultValue={emailFrequency}
value={emailFrequency}
onChange={(item) => {
updateEmailFrequency(item as EmailBackupFrequency);
}}

View File

@@ -1,6 +1,6 @@
import { Dropdown, DropdownItem } from '@/components/Dropdown';
import { IconType } from '@/components/Icon';
import { FeatureIdentifier } from '@standardnotes/snjs';
import { FeatureIdentifier, PrefKey } from '@standardnotes/snjs';
import {
PreferencesGroup,
PreferencesSegment,
@@ -16,6 +16,8 @@ import {
} from '@standardnotes/snjs';
import { FunctionComponent } from 'preact';
import { useEffect, useState } from 'preact/hooks';
import { HorizontalSeparator } from '@/components/shared/HorizontalSeparator';
import { Switch } from '@/components/Switch';
type Props = {
application: WebApplication;
@@ -82,11 +84,20 @@ const getDefaultEditor = (application: WebApplication) => {
export const Defaults: FunctionComponent<Props> = ({ application }) => {
const [editorItems, setEditorItems] = useState<DropdownItem[]>([]);
const [defaultEditorValue] = useState(
const [defaultEditorValue, setDefaultEditorValue] = useState(
() =>
getDefaultEditor(application)?.package_info?.identifier || 'plain-editor'
);
const [spellcheck, setSpellcheck] = useState(() =>
application.getPreference(PrefKey.EditorSpellcheck, true)
);
const toggleSpellcheck = () => {
setSpellcheck(!spellcheck);
application.getAppState().toggleGlobalSpellcheck();
};
useEffect(() => {
const editors = application.componentManager
.componentsForArea(ComponentArea.Editor)
@@ -117,6 +128,7 @@ export const Defaults: FunctionComponent<Props> = ({ application }) => {
}, [application]);
const setDefaultEditor = (value: string) => {
setDefaultEditorValue(value as FeatureIdentifier);
const editors = application.componentManager.componentsForArea(
ComponentArea.Editor
);
@@ -144,11 +156,22 @@ export const Defaults: FunctionComponent<Props> = ({ application }) => {
id="def-editor-dropdown"
label="Select the default editor"
items={editorItems}
defaultValue={defaultEditorValue}
value={defaultEditorValue}
onChange={setDefaultEditor}
/>
</div>
</div>
<HorizontalSeparator classes="mt-5 mb-3" />
<div className="flex items-center justify-between">
<div className="flex flex-col">
<Subtitle>Spellcheck</Subtitle>
<Text>
The default spellcheck value for new notes. Spellcheck can be configured per note from the note context menu.
Spellcheck may degrade overall typing performance with long notes.
</Text>
</div>
<Switch onChange={toggleSpellcheck} checked={spellcheck} />
</div>
</PreferencesSegment>
</PreferencesGroup>
);

View File

@@ -25,9 +25,6 @@ export const Tools: FunctionalComponent<Props> = observer(
const [marginResizers, setMarginResizers] = useState(() =>
application.getPreference(PrefKey.EditorResizersEnabled, true)
);
const [spellcheck, setSpellcheck] = useState(() =>
application.getPreference(PrefKey.EditorSpellcheck, true)
);
const toggleMonospaceFont = () => {
setMonospaceFont(!monospaceFont);
@@ -39,11 +36,6 @@ export const Tools: FunctionalComponent<Props> = observer(
application.setPreference(PrefKey.EditorResizersEnabled, !marginResizers);
};
const toggleSpellcheck = () => {
setSpellcheck(!spellcheck);
application.setPreference(PrefKey.EditorSpellcheck, !spellcheck);
};
return (
<PreferencesGroup>
<PreferencesSegment>
@@ -67,17 +59,6 @@ export const Tools: FunctionalComponent<Props> = observer(
checked={marginResizers}
/>
</div>
<HorizontalSeparator classes="mt-5 mb-3" />
<div className="flex items-center justify-between">
<div className="flex flex-col">
<Subtitle>Spellcheck</Subtitle>
<Text>
May degrade performance, especially with long notes. This option only controls
spellcheck in the Plain Editor.
</Text>
</div>
<Switch onChange={toggleSpellcheck} checked={spellcheck} />
</div>
</div>
</PreferencesSegment>
</PreferencesGroup>

View File

@@ -10,6 +10,7 @@ import {
UuidString,
FeatureStatus,
PayloadSource,
PrefKey,
} from '@standardnotes/snjs';
const CACHED_THEMES_KEY = 'cachedThemes';
@@ -19,6 +20,53 @@ export class ThemeManager extends ApplicationService {
private unregisterDesktop!: () => void;
private unregisterStream!: () => void;
constructor(application: WebApplication) {
super(application);
this.colorSchemeEventHandler = this.colorSchemeEventHandler.bind(this);
}
private colorSchemeEventHandler(event: MediaQueryListEvent) {
this.setThemeAsPerColorScheme(event.matches);
}
private setThemeAsPerColorScheme(prefersDarkColorScheme: boolean) {
const useDeviceThemeSettings = this.application.getPreference(
PrefKey.UseSystemColorScheme,
false
);
if (useDeviceThemeSettings) {
const preference = prefersDarkColorScheme
? PrefKey.AutoDarkThemeIdentifier
: PrefKey.AutoLightThemeIdentifier;
const themes = this.application.getDisplayableItems(
ContentType.Theme
) as SNTheme[];
const enableDefaultTheme = () => {
const activeTheme = themes.find(
(theme) => theme.active && !theme.isLayerable()
);
if (activeTheme) this.application.toggleTheme(activeTheme);
};
const themeIdentifier = this.application.getPreference(
preference,
'Default'
) as string;
if (themeIdentifier === 'Default') {
enableDefaultTheme();
} else {
const theme = themes.find(
(theme) => theme.package_info.identifier === themeIdentifier
);
if (theme && !theme.active) {
this.application.toggleTheme(theme);
}
}
}
}
async onAppEvent(event: ApplicationEvent) {
super.onAppEvent(event);
if (event === ApplicationEvent.SignedOut) {
@@ -32,6 +80,15 @@ export class ThemeManager extends ApplicationService {
await this.activateCachedThemes();
} else if (event === ApplicationEvent.FeaturesUpdated) {
this.reloadThemeStatus();
} else if (event === ApplicationEvent.Launched) {
window
.matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', this.colorSchemeEventHandler);
} else if (event === ApplicationEvent.PreferencesChanged) {
const prefersDarkColorScheme = window.matchMedia(
'(prefers-color-scheme: dark)'
);
this.setThemeAsPerColorScheme(prefersDarkColorScheme.matches);
}
}
@@ -46,6 +103,9 @@ export class ThemeManager extends ApplicationService {
this.unregisterStream();
(this.unregisterDesktop as unknown) = undefined;
(this.unregisterStream as unknown) = undefined;
window
.matchMedia('(prefers-color-scheme: dark)')
.removeEventListener('change', this.colorSchemeEventHandler);
super.deinit();
}

View File

@@ -1,3 +1,4 @@
import { isDev } from '@/utils';
import {
action,
computed,
@@ -74,7 +75,11 @@ export class AccountMenuState {
this.appEventListeners.push(
this.application.addEventObserver(async () => {
runInAction(() => {
this.setServer(this.application.getHost());
if (isDev && window._devAccountServer) {
this.setServer(window._devAccountServer);
} else {
this.setServer(this.application.getHost());
}
});
}, ApplicationEvent.Launched)
);

View File

@@ -17,6 +17,7 @@ import {
ComponentViewer,
SNTag,
NoteViewController,
SNTheme,
} from '@standardnotes/snjs';
import pull from 'lodash/pull';
import {
@@ -281,6 +282,18 @@ export class AppState {
}
}
isGlobalSpellcheckEnabled(): boolean {
return this.application.getPreference(PrefKey.EditorSpellcheck, true);
}
async toggleGlobalSpellcheck() {
const currentValue = this.isGlobalSpellcheckEnabled();
return this.application.setPreference(
PrefKey.EditorSpellcheck,
!currentValue
);
}
private tagChangedNotifier(): IReactionDisposer {
return reaction(
() => this.tags.selectedUuid,

View File

@@ -378,6 +378,23 @@ export class NotesState {
this.selectedNotes = {};
}
getSpellcheckStateForNote(note: SNNote) {
return note.spellcheck != undefined
? note.spellcheck
: this.appState.isGlobalSpellcheckEnabled();
}
async toggleGlobalSpellcheckForNote(note: SNNote) {
await this.application.changeItem<NoteMutator>(
note.uuid,
(mutator) => {
mutator.toggleSpellcheck();
},
false
);
this.application.sync();
}
async addTagToSelectedNotes(tag: SNTag): Promise<void> {
const selectedNotes = Object.values(this.selectedNotes);
const parentChainTags = this.application.getTagParentChain(tag);

View File

@@ -1,7 +1,6 @@
import { confirmDialog } from '@/services/alertService';
import { STRING_DELETE_TAG, STRING_MISSING_SYSTEM_TAG } from '@/strings';
import { STRING_DELETE_TAG } from '@/strings';
import {
ApplicationEvent,
ComponentAction,
ContentType,
MessageData,
@@ -9,7 +8,7 @@ import {
SNSmartTag,
SNTag,
TagMutator,
UuidString,
UuidString
} from '@standardnotes/snjs';
import {
action,
@@ -17,7 +16,7 @@ import {
makeAutoObservable,
makeObservable,
observable,
runInAction,
runInAction
} from 'mobx';
import { WebApplication } from '../application';
import { FeaturesState, SMART_TAGS_FEATURE_NAME } from './features_state';
@@ -126,9 +125,6 @@ export class TagsState {
) as SNTag[];
this.smartTags = this.application.getSmartTags();
this.tagsCountsState.update(this.tags);
this.allNotesCount_ = this.countAllNotes();
const selectedTag = this.selected_;
if (selectedTag) {
const matchingTag = items.find(
@@ -150,13 +146,13 @@ export class TagsState {
);
appEventListeners.push(
this.application.addEventObserver(async (eventName) => {
switch (eventName) {
case ApplicationEvent.CompletedIncrementalSync:
runInAction(() => {
this.allNotesCount_ = this.countAllNotes();
});
break;
this.application.addNoteCountChangeObserver((tagUuid) => {
if (!tagUuid) {
this.allNotesCount_ = this.application.allCountableNotesCount();
} else {
this.tagsCountsState.update([
this.application.findItem(tagUuid) as SNTag,
]);
}
})
);
@@ -199,32 +195,33 @@ export class TagsState {
public async assignParent(
tagUuid: string,
parentUuid: string | undefined
futureParentUuid: string | undefined
): Promise<void> {
const tag = this.application.findItem(tagUuid) as SNTag;
const currentParent = this.application.getTagParent(tag);
const currentParentUuid = currentParent?.parentId;
const currentParentUuid = currentParent?.uuid;
if (currentParentUuid === parentUuid) {
if (currentParentUuid === futureParentUuid) {
return;
}
const parent =
parentUuid && (this.application.findItem(parentUuid) as SNTag);
const futureParent =
futureParentUuid &&
(this.application.findItem(futureParentUuid) as SNTag);
if (!parent) {
if (!futureParent) {
const futureSiblings = rootTags(this.application);
if (!isValidFutureSiblings(this.application, futureSiblings, tag)) {
return;
}
await this.application.unsetTagParent(tag);
} else {
const futureSiblings = this.application.getTagChildren(parent);
const futureSiblings = this.application.getTagChildren(futureParent);
if (!isValidFutureSiblings(this.application, futureSiblings, tag)) {
return;
}
await this.application.setTagParent(parent, tag);
await this.application.setTagParent(futureParent, tag);
}
await this.application.sync();
@@ -390,23 +387,6 @@ export class TagsState {
}
}
private countAllNotes(): number {
const allTag = this.application.getSmartTags().find((tag) => tag.isAllTag);
if (!allTag) {
console.error(STRING_MISSING_SYSTEM_TAG);
return -1;
}
const notes = this.application
.notesMatchingSmartTag(allTag)
.filter((note) => {
return !note.archived && !note.trashed;
});
return notes.length;
}
public onFoldersComponentMessage(
action: ComponentAction,
data: MessageData
@@ -439,9 +419,6 @@ export class TagsState {
}
}
/**
* Bug fix for issue 1201550111577311,
*/
class TagsCountsState {
public counts: { [uuid: string]: number } = {};
@@ -453,13 +430,13 @@ class TagsCountsState {
}
public update(tags: SNTag[]) {
const newCounts: { [uuid: string]: number } = {};
const newCounts: { [uuid: string]: number } = Object.assign(
{},
this.counts
);
tags.forEach((tag) => {
newCounts[tag.uuid] = this.application.referencesForItem(
tag,
ContentType.Note
).length;
newCounts[tag.uuid] = this.application.countableNotesForTag(tag);
});
this.counts = newCounts;

View File

@@ -201,6 +201,8 @@ export class NoteView extends PureViewCtrl<unknown, EditorState> {
this.editorValues.text = note.text;
}
this.reloadSpellcheck();
const isTemplateNoteInsertedToBeInteractableWithEditor =
source === PayloadSource.Constructor && note.dirty;
if (isTemplateNoteInsertedToBeInteractableWithEditor) {
@@ -694,29 +696,35 @@ export class NoteView extends PureViewCtrl<unknown, EditorState> {
this.application.sync();
}
async reloadPreferences() {
const monospaceFont = this.application.getPreference(
PrefKey.EditorMonospaceEnabled,
true
);
const spellcheck = this.application.getPreference(
PrefKey.EditorSpellcheck,
true
);
const marginResizersEnabled = this.application.getPreference(
PrefKey.EditorResizersEnabled,
true
);
async reloadSpellcheck() {
const spellcheck = this.appState.notes.getSpellcheckStateForNote(this.note);
if (spellcheck !== this.state.spellcheck) {
await this.setState({ textareaUnloading: true });
await this.setState({ textareaUnloading: false });
this.reloadFont();
await this.setState({
spellcheck,
});
}
}
async reloadPreferences() {
const monospaceFont = this.application.getPreference(
PrefKey.EditorMonospaceEnabled,
true
);
const marginResizersEnabled = this.application.getPreference(
PrefKey.EditorResizersEnabled,
true
);
await this.reloadSpellcheck();
await this.setState({
monospaceFont,
spellcheck,
marginResizersEnabled,
});

View File

@@ -1,6 +1,6 @@
{
"name": "standard-notes-web",
"version": "3.9.14",
"version": "3.9.20",
"license": "AGPL-3.0-or-later",
"repository": {
"type": "git",
@@ -27,7 +27,6 @@
"@babel/preset-typescript": "^7.15.0",
"@reach/disclosure": "^0.16.2",
"@reach/visually-hidden": "^0.16.0",
"@standardnotes/components": "1.2.8",
"@svgr/webpack": "^5.5.0",
"@types/angular": "^1.8.3",
"@types/jest": "^27.0.3",
@@ -86,10 +85,11 @@
"@reach/dialog": "^0.16.2",
"@reach/listbox": "^0.16.2",
"@reach/tooltip": "^0.16.2",
"@standardnotes/features": "1.20.7",
"@standardnotes/settings": "^1.9.0",
"@standardnotes/sncrypto-web": "1.5.3",
"@standardnotes/snjs": "2.35.5",
"@standardnotes/components": "1.4.3",
"@standardnotes/features": "1.25.0",
"@standardnotes/snjs": "2.41.0",
"@standardnotes/settings": "^1.10.0",
"@standardnotes/sncrypto-web": "1.6.0",
"mobx": "^6.3.5",
"mobx-react-lite": "^3.2.2",
"preact": "^10.5.15",

View File

@@ -35,54 +35,54 @@
"binary": "42d28f3598669b801821879f0b7e26389300f151bfbc566b11c214e6091719ed"
},
"org.standardnotes.code-editor": {
"version": "1.3.8",
"base64": "9969f2997d06deb41af4b40edcda19b4eed72fda6ea2ff116b96616a0d3dba67",
"binary": "8c6fbc89151e11b0ba39475f3180f08ed38f75098f600befa5875eb993435404"
"version": "1.3.9",
"base64": "f9f327b77d1e9084505ae66ae9f91aa116db52fe86de99addc64ebaca9e7dc64",
"binary": "3049e8e87e9bd5928654c9aeea16c8955e180aaae26932cbebfd9092c24346d5"
},
"org.standardnotes.bold-editor": {
"version": "1.2.10",
"base64": "0de1df66cc3ae7774a3c0cedb2454e3465cadabf41ba5060ab9e543a2bea5dea",
"binary": "bac85952fbe8af1eac49701da69b811de531fd15b1cfd6bbc90d61d9c785f5d1"
"version": "1.3.2",
"base64": "7a4fec03c556d17aa2f14a9157a20754c429a54843504211017fc21ca6d8b10e",
"binary": "80ff2f747607b6668c5e9b439203d89740de21b822d01b6b4d2051bf232a80f3"
},
"org.standardnotes.plus-editor": {
"version": "1.5.0",
"base64": "f8923ab4a464ee113d47fa164ee7efbc6337e9e538105ae473b00492fb4ec46e",
"binary": "d4645ee7a38eeb1046239ea337333dcb64dc01c81f05e20307696099364b485b"
"version": "1.6.1",
"base64": "741c77ab437b17e9e76755485b828a8530bfc0c713258e72374a6fced61a3aef",
"binary": "02da20d1969bc2cc9bc9e164bcd6f993183747c8d6c3edae814fa12789950544"
},
"org.standardnotes.simple-markdown-editor": {
"version": "1.4.0",
"base64": "853cfcaf6c1e13796869b4c6655dab82f9d75a25d9e1e9f2e5e3137c7dae03d2",
"binary": "3ac9e1133a109d91dcefbdc344855f82bbbd5f0409c60d9c1f040ee811bd14ae"
"version": "1.4.1",
"base64": "5ba494941267a51961d73c8cc58ab608cde50f8d5772401a947482472d3f8b2f",
"binary": "65cbacc96b5271c0e846e7a2d3bd243f87091055311ca30a2c4a7d2ec228462d"
},
"org.standardnotes.advanced-markdown-editor": {
"version": "1.3.14",
"base64": "2e2db371fb028bb1c1785102a01d39673d56f72d50ed8ea3c558cce690f23060",
"binary": "657eb02b34978b9d2412a0fc9525ec0b3bd6080d01069a11659b289d2c9eafa0"
"version": "1.4.1",
"base64": "8772f107ae2913bf653e749c28d8ed2eae055ae5aa694d39f43db3ec7d787d86",
"binary": "2989c33b1997e054622bafcf50a9b966fc2d6acee640aa9a52d7efc19e15c123"
},
"org.standardnotes.minimal-markdown-editor": {
"version": "1.3.7",
"base64": "b785ff85d8803ed0323163221e36048b43086e85c7cc5f1c12abb5c5b270a6ed",
"binary": "3a8cfaa512f8734faf75ae9ee8ece3a55409d50dbeebfe9cbeca7ff4b40a8426"
"version": "1.3.8",
"base64": "a48584b5e0601a43403ec7ca10e6cc7958072f2dce9c29bd883bcabde8a2288a",
"binary": "8d08f2ffe85a4ad234aa16772266554bc7849778a470d8e6b9293e313890c53a"
},
"org.standardnotes.fancy-markdown-editor": {
"version": "1.3.4",
"base64": "fbee0c66041d942b4f62d9bf4bbc9df99c64b3d2aad4a00be66d0516dd86a922",
"binary": "f2f36a306abd5a878ec6d204325e001db8cbaebe50629687d6f14c35bb1f78b1"
"version": "1.3.5",
"base64": "db05eaff4380af3f89c30559b2da6a1ab7075591718306e8ecfc8fa3864a1891",
"binary": "7adf87b091dd45c4a9d3adaf9f0e12f18acd7fb74078a7be909f5de075eab8e0"
},
"org.standardnotes.simple-task-editor": {
"version": "1.3.7",
"base64": "76211fea01d5ad5d44c70a27e90493ffde010621abb3996408c1b5da2e141d3c",
"binary": "6a9236dda72e41408005993d37685cfa98cc2d82d4f2085aea8c88b3a0951501"
"version": "1.3.8",
"base64": "012523870d7c8b7024ea2da31c1c216a0ccfa5cf05183913f0486f1b845a366d",
"binary": "17f3bfdd55ab517a7e47c70b0ebc8c933b1eb5fdeabbc88e8064408421e2e4f8"
},
"org.standardnotes.token-vault": {
"version": "2.0.7",
"base64": "56f8ac6a46a60c9e949e5409696f1afe93296563c6940b7df1770a1dec41d7ab",
"binary": "525da86875fb7238ae92eb4bd60a829add4a79623a15ca3182aa221cd44b32f4"
"version": "2.0.9",
"base64": "a40b7df5ac564c763fb1b8f588dcf584576cb4c2ee6d88e456cfa2dc49fec91c",
"binary": "04d6c4765de4e2cdd4e28f3f8c30e79a49e980fa1cdd9df812e844f8486795f3"
},
"org.standardnotes.standard-sheets": {
"version": "1.4.2",
"base64": "d32d7f8cc8141d9c8983849d8bcb25bfb1000710b6380ee7287a8c22c6366a90",
"binary": "1cf178db81042c7afe779cd53114a4d0d5004259d6fbba315eb0a78e7caabece"
"version": "1.4.3",
"base64": "e38ed30e821bd7a4dc13026898215c892911c91217e5dcdf9d9ebdc25e05b711",
"binary": "c51b4bfbb11ca60d4f81c7c28fba7d24da56b6dcdb799d12e34e1882d9873db3"
},
"org.standardnotes.file-safe": {
"version": "2.0.10",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,9 @@
{
"name": "sn-advanced-markdown-editor",
"version": "1.3.14",
"version": "1.4.1",
"description": "A Standard Notes derived editor that offers full support for Markdown editing.",
"main": "dist/dist.js",
"author": "Standard Notes <hello@standardnotes.org>",
"author": "Standard Notes <hello@standardnotes.com>",
"license": "AGPL-3.0",
"sn": {
"main": "dist/index.html"
@@ -20,7 +20,7 @@
"@babel/cli": "^7.13.10",
"@babel/core": "^7.13.13",
"@babel/preset-env": "^7.13.12",
"@standardnotes/component-relay": "2.1.0",
"@standardnotes/component-relay": "2.2.0",
"@standardnotes/eslint-config-extensions": "^1.0.2",
"copy-webpack-plugin": "^8.1.0",
"css-loader": "^5.2.0",

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-bold-editor",
"version": "1.2.10",
"version": "1.3.2",
"main": "dist/dist.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
@@ -17,7 +17,7 @@
"@babel/eslint-parser": "^7.13.14",
"@babel/preset-env": "^7.13.12",
"@babel/preset-react": "^7.13.13",
"@standardnotes/editor-kit": "2.1.4",
"@standardnotes/editor-kit": "2.2.1",
"@standardnotes/eslint-config-extensions": "^1.0.3",
"babel-loader": "^8.2.2",
"copy-webpack-plugin": "^8.1.1",

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-code-editor",
"version": "1.3.8",
"version": "1.3.9",
"description": "A code editor for Standard Notes",
"main": "dist/main.js",
"author": "Standard Notes <hello@standardnotes.org>",
@@ -16,8 +16,8 @@
"@babel/cli": "^7.12.10",
"@babel/core": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"@standardnotes/component-relay": "2.0.3",
"codemirror": "^5.59.2",
"@standardnotes/component-relay": "2.2.0",
"codemirror": "5.59.2",
"copy-webpack-plugin": "^7.0.0",
"css-loader": "^5.0.1",
"eslint": "^7.18.0",

View File

@@ -229,12 +229,12 @@ h3 {
}
h1 {
margin: .5em 0 .25em;
margin: 0.5em 0 0.25em;
font-size: 225%;
}
h2 {
margin: 1em 0 .25em;
margin: 1em 0 0.25em;
font-size: 175%;
}
@@ -425,9 +425,9 @@ textarea {
.result-html .svg-preview {
overflow: visible;
-webkit-transition: opacity .4s ease-in-out;
-moz-transition: opacity .4s ease-in-out;
transition: opacity .4s ease-in-out;
-webkit-transition: opacity 0.4s ease-in-out;
-moz-transition: opacity 0.4s ease-in-out;
transition: opacity 0.4s ease-in-out;
fill: var(--sn-stylekit-info-color);
}
@@ -520,3 +520,5 @@ textarea {
-webkit-text-fill-color: initial;
}
}
/*# sourceMappingURL=app.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<base target="_blank">
<base target="_blank">
<meta charset="UTF-8">
<title>Markdown Math</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -18,61 +18,35 @@
<button class="toolbar-button _download-source" title="Download source"></button>
</div>
<div class="header-item demo-control">
<input
class="control-input"
id="id_html"
type="radio"
name="source_type"
checked="checked" ><label
class="control-item"
for="id_html"
title="Example of rendered HTML"
data-result-as="html"
>preview</label>
<input
class="control-input"
id="id_src"
type="radio"
name="source_type"
><label
class="control-item"
for="id_src"
title="HTML with rendered equations"
data-result-as="src"
>html</label>
<input
class="control-input"
id="id_htmltex"
type="radio"
name="source_type"
><label
class="control-item"
for="id_htmltex"
title="HTML with raw LaTeX equations"
data-result-as="htmltex"
>html-tex</label>
<input
class="control-input"
id="id_md"
type="radio"
name="source_type"
><label
class="control-item"
for="id_md"
title="Markdown with rendered equations"
data-result-as="md"
>md</label>
<button class="toolbar-button _download-result" title="Download result"></button>
<input class="control-input" id="id_html" type="radio" name="source_type" checked="checked"><label
class="control-item" for="id_html" title="Example of rendered HTML" data-result-as="html">preview</label>
<input class="control-input" id="id_src" type="radio" name="source_type"><label class="control-item" for="id_src"
title="HTML with rendered equations" data-result-as="src">html</label>
<input class="control-input" id="id_htmltex" type="radio" name="source_type"><label class="control-item"
for="id_htmltex" title="HTML with raw LaTeX equations" data-result-as="htmltex">html-tex</label>
<input class="control-input" id="id_md" type="radio" name="source_type"><label class="control-item" for="id_md"
title="Markdown with rendered equations" data-result-as="md">md</label>
<button class="toolbar-button _download-result" title="Download result"></button>
</div>
</div>
<div class="container full-height" id="container-block"><!--
--><div class="half-width full-height source-wrap" id="source-block"><textarea id="editor-source" class="source full-height"></textarea></div><!--
--><div class="slider full-height" id="slider"></div><!--
--><div class="half-width full-height" id="result-block">
<div class="container full-height" id="container-block">
<!--
-->
<div class="half-width full-height source-wrap" id="source-block"><textarea id="editor-source"
class="source full-height"></textarea></div>
<!--
-->
<div class="slider full-height" id="slider"></div>
<!--
-->
<div class="half-width full-height" id="result-block">
<div class="result-html full-height"></div>
<pre class="result-src full-height"><code class="result-src-content"></code></pre>
</div><!--
--></div>
<script src="dist/dist.js"></script>
</div>
<!--
-->
</div>
<script src="dist/dist.js"></script>
</body>
</html>

View File

@@ -1,6 +1,6 @@
{
"name": "sn-fancy-markdown-editor",
"version": "1.3.4",
"version": "1.3.5",
"description": "",
"main": "index.js",
"scripts": {
@@ -11,6 +11,7 @@
"@babel/cli": "^7.7.7",
"@babel/core": "^7.7.7",
"@babel/preset-env": "^7.7.7",
"@standardnotes/component-relay": "2.2.0",
"draggabilly": "^2.2.0",
"grunt": "^1.0.4",
"grunt-babel": "^8.0.0",
@@ -18,15 +19,16 @@
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-sass": "^1.0.0",
"grunt-contrib-uglify": "^5.0.1",
"grunt-contrib-watch": "^1.1.0",
"grunt-newer": "^1.3.0",
"grunt-remove-comments": "^0.1.6",
"katex": "^0.11.1",
"markdown-it": "^10.0.0",
"markdown-it-footnote": "^3.0.2",
"markdown-it-sub": "^1.0.0",
"markdown-it-sup": "^1.0.0",
"markdown-it-task-lists": "^2.1.1",
"sn-components-api": "1.2.8",
"sn-stylekit": "2.0.20"
}
}

View File

@@ -492,3 +492,5 @@ html {
.CodeMirror .cm-link, .CodeMirror .cm-string, .CodeMirror .cm-keyword {
color: var(--sn-stylekit-info-color);
}
/*# sourceMappingURL=app.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-minimal-markdown-editor",
"version": "1.3.7",
"version": "1.3.8",
"description": "A minimal Markdown editor for Standard Notes.",
"main": "dist/dist.js",
"author": "Standard Notes <hello@standardnotes.org>",
@@ -13,6 +13,7 @@
"devDependencies": {
"@babel/core": "^7.11.1",
"@babel/preset-env": "^7.11.0",
"@standardnotes/component-relay": "2.2.0",
"babel-cli": "^6.26.0",
"codemirror": "^5.56.0",
"grunt": "^1.2.1",
@@ -23,7 +24,6 @@
"grunt-contrib-sass": "^1.0.0",
"grunt-contrib-watch": "^1.1.0",
"grunt-newer": "^1.3.0",
"sn-components-api": "1.2.8",
"sn-stylekit": "2.1.0"
}
}

View File

@@ -1,2 +1,2 @@
document.addEventListener("DOMContentLoaded",(function(){let e,t,n,o,i,a=!1,r=!0,s=!1;const l=["address","article","aside","blockquote","details","dialog","dd","div","dl","dt","fieldset","figcaption","figure","footer","form","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","ol","p","pre","section","table","ul"].join(", ");function c(){if(t){const i=t;e.saveItemWithPresave(i,(()=>{o=$("#summernote").summernote("code"),i.clientData=n,i.content.text=o,i.content.preview_plain=function(e,t=90){return e.length<=t?e:e.substring(0,t)+"..."}(function(e){const t=document.implementation.createHTMLDocument("New").body;return t.innerHTML=e,t.textContent||t.innerText||""}(o)),i.content.preview_html=null}))}}function u(){return e.getComponentDataValueForKey("notes")||{}}$("#summernote").summernote({height:500,minHeight:null,maxHeight:null,focus:!0,tabDisable:!0,showDomainOnlyForAutolink:!1,toolbar:[["para",["style"]],["style",["bold","italic","underline","strikethrough","clear"]],["fontsize",["fontsize","fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["height",["height"]],["insert",["table","link","hr","picture","video"]],["misc",["codeview","help"]]],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Monospace","Roboto","system-ui","Tahoma","Times New Roman","Verdana"],callbacks:{onInit:function(){},onImageUpload:function(){alert("Until we can encrypt image files, uploads are not currently supported. We recommend using the Image button in the toolbar and copying an image URL instead.")}}}),$("#summernote").on("summernote.change",(function(){document.querySelectorAll(l).forEach((e=>e.setAttribute("dir","auto"))),a||c()})),$("textarea.note-codable").on("input",(()=>{c()})),e=new ComponentRelay({initialPermissions:[{name:"stream-context-item"}],targetWindow:window,onReady:()=>{const t=e.platform;t&&document.body.classList.add(t)}}),e.streamContextItem((l=>{!function(l){if(l.uuid!==i&&(o=null,r=!0,i=l.uuid),t=l,l.isMetadataUpdate)return;n=l.clientData;let c=l.content.text;if(c==o)return;const m=$("#summernote");if(m){a=!0;const t=/<[a-z][\s\S]*>/i.test(c);s||(m.summernote("fullscreen.toggle"),s=!0),r&&!t&&(c=((c||"")+"").replace(/\t/g," ").replace(/\r\n|\r|\n/g,"<br />"));let n=!1;if(function(e){const t=(new DOMParser).parseFromString(`<body>${e}</body>`,"text/html");return Array.from(t.body.childNodes).some((e=>"SCRIPT"==e.nodeName))}(c)){const t=u()[i];t?n=t.trustUnsafeContent||!1:new Promise((e=>{new Stylekit.SKAlert({title:null,text:"Weve detected that this note contains a script or code snippet which may be unsafe to execute. Scripts executed in the editor have the ability to impersonate as the editor to Standard Notes. Press Continue to mark this script as safe and proceed, or Cancel to avoid rendering this note.",buttons:[{text:"Cancel",style:"neutral",action:function(){e(!1)}},{text:"Continue",style:"danger",action:function(){e(!0)}}]}).present()})).then((t=>{t&&(function(t,n){const o=u();o[i]={trustUnsafeContent:n},e.setComponentDataValueForKey("notes",o)}(0,t),n=t)}))}else n=!0;if(!n)return m.summernote("code",""),void m.summernote("disable");m.summernote("enable"),m.summernote("code",c),r&&(m.summernote("commit"),r=!1),a=!1}}(l)}))}));
document.addEventListener("DOMContentLoaded",(function(){let e,t,n,o,i,a=!1,r=!0,s=!1;const l=["address","article","aside","blockquote","details","dialog","dd","div","dl","dt","fieldset","figcaption","figure","footer","form","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","ol","p","pre","section","table","ul"].join(", ");function c(){if(t){const i=t;e.saveItemWithPresave(i,(()=>{o=$("#summernote").summernote("code"),i.clientData=n,i.content.text=o,i.content.preview_plain=function(e,t=90){return e.length<=t?e:e.substring(0,t)+"..."}(function(e){const t=document.implementation.createHTMLDocument("New").body;return t.innerHTML=e,t.textContent||t.innerText||""}(o)),i.content.preview_html=null}))}}function u(){return e.getComponentDataValueForKey("notes")||{}}$("#summernote").summernote({height:500,minHeight:null,maxHeight:null,focus:!0,tabDisable:!0,showDomainOnlyForAutolink:!1,toolbar:[["para",["style"]],["style",["bold","italic","underline","strikethrough","clear"]],["fontsize",["fontsize","fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["height",["height"]],["insert",["table","link","hr","picture","video"]],["misc",["codeview","help"]]],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Monospace","Roboto","system-ui","Tahoma","Times New Roman","Verdana"],callbacks:{onInit:function(){},onImageUpload:function(){alert("Until we can encrypt image files, uploads are not currently supported. We recommend using the Image button in the toolbar and copying an image URL instead.")}}}),$("#summernote").on("summernote.change",(function(){document.querySelectorAll(l).forEach((e=>e.setAttribute("dir","auto"))),a||c()})),$("textarea.note-codable").on("input",(()=>{c()})),e=new ComponentRelay({initialPermissions:[{name:"stream-context-item"}],targetWindow:window,onReady:()=>{const t=e.platform;t&&document.body.classList.add(t)}}),e.streamContextItem((l=>{!function(l){if(l.uuid!==i&&(o=null,r=!0,i=l.uuid),t=l,l.isMetadataUpdate)return;n=l.clientData;let c=l.content.text;if($(".note-editable").attr("spellcheck",JSON.stringify(l.content.spellcheck)),c==o)return;const m=$("#summernote");if(m){a=!0;const t=/<[a-z][\s\S]*>/i.test(c);s||(m.summernote("fullscreen.toggle"),s=!0),r&&!t&&(c=((c||"")+"").replace(/\t/g," ").replace(/\r\n|\r|\n/g,"<br />"));let n=!1;if(function(e){const t=(new DOMParser).parseFromString(`<body>${e}</body>`,"text/html");return Array.from(t.body.childNodes).some((e=>"SCRIPT"==e.nodeName))}(c)){const t=u()[i];t?n=t.trustUnsafeContent||!1:new Promise((e=>{new Stylekit.SKAlert({title:null,text:"Weve detected that this note contains a script or code snippet which may be unsafe to execute. Scripts executed in the editor have the ability to impersonate as the editor to Standard Notes. Press Continue to mark this script as safe and proceed, or Cancel to avoid rendering this note.",buttons:[{text:"Cancel",style:"neutral",action:function(){e(!1)}},{text:"Continue",style:"danger",action:function(){e(!0)}}]}).present()})).then((t=>{t&&(function(t,n){const o=u();o[i]={trustUnsafeContent:n},e.setComponentDataValueForKey("notes",o)}(0,t),n=t)}))}else n=!0;if(!n)return m.summernote("code",""),void m.summernote("disable");m.summernote("enable"),m.summernote("code",c),r&&(m.summernote("commit"),r=!1),a=!1}}(l)}))}));
//# sourceMappingURL=dist.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,9 @@
{
"name": "sn-plus-editor",
"version": "1.5.0",
"version": "1.6.1",
"description": "A rich text editor for Standard Notes",
"main": "dist/dist.js",
"author": "Standard Notes <hello@standardnotes.org>",
"author": "Standard Notes <hello@standardnotes.com>",
"scripts": {
"lint": "eslint --ext .js .",
"build": "webpack --config webpack.prod.js",
@@ -17,7 +17,7 @@
"@babel/core": "^7.13.8",
"@babel/eslint-parser": "^7.13.8",
"@babel/preset-env": "^7.13.8",
"@standardnotes/component-relay": "2.1.0",
"@standardnotes/component-relay": "2.2.0",
"@standardnotes/eslint-config-extensions": "1.0.1",
"bootstrap": "3.4.1",
"css-loader": "^5.1.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-simple-markdown-editor",
"version": "1.4.0",
"version": "1.4.1",
"main": "dist/dist.js",
"scripts": {
"lint": "eslint --cache --ext .jsx,.js --format=node_modules/eslint-formatter-pretty .",
@@ -23,7 +23,7 @@
"@babel/preset-stage-0": "^7.8.3",
"@babel/register": "^7.10.5",
"@babel/runtime": "^7.11.2",
"@standardnotes/component-relay": "2.1.0",
"@standardnotes/component-relay": "2.2.0",
"@standardnotes/eslint-config-extensions": "^1.0.0",
"babel-loader": "^8.1.0",
"copy-webpack-plugin": "6.0.3",

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-simple-task-editor",
"version": "1.3.7",
"version": "1.3.8",
"main": "dist/dist.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
@@ -19,7 +19,7 @@
"@babel/plugin-transform-runtime": "^7.13.0",
"@babel/preset-env": "^7.13.10",
"@babel/preset-react": "^7.12.13",
"@standardnotes/component-relay": "2.0.3",
"@standardnotes/component-relay": "2.2.0",
"@standardnotes/eslint-config-extensions": "^1.0.2",
"babel-loader": "^8.2.2",
"css-loader": "^5.1.3",
@@ -36,7 +36,7 @@
"sass-loader": "^11.0.1",
"sn-stylekit": "2.0.19",
"sortablejs": "^1.10.1",
"style-loader": "~1.0.1",
"style-loader": "^1.0.1",
"terser-webpack-plugin": "^5.1.1",
"validate-commit-msg": "2.x",
"webpack": "^5.24.4",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-spreadsheets",
"version": "1.4.2",
"version": "1.4.3",
"main": "dist/dist.js",
"scripts": {
"lint": "eslint app/ --ext .js",
@@ -20,6 +20,7 @@
"@babel/plugin-transform-runtime": "^7.10.1",
"@babel/preset-env": "^7.14.7",
"@babel/preset-react": "^7.10.1",
"@standardnotes/component-relay": "2.2.0",
"@standardnotes/eslint-config-extensions": "^1.0.4",
"babel-loader": "^8.2.2",
"copy-webpack-plugin": "^9.0.1",
@@ -31,7 +32,6 @@
"react": "16.x",
"react-dom": "16.x",
"sass-loader": "^11.0.1",
"sn-components-api": "1.2.8",
"sn-stylekit": "2.0.22",
"style-loader": "^3.0.0",
"terser-webpack-plugin": "^5.1.4",

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "sn-token-vault",
"version": "2.0.7",
"version": "2.0.9",
"main": "dist/dist.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
@@ -19,7 +19,7 @@
"@babel/plugin-transform-runtime": "^7.13.10",
"@babel/preset-env": "^7.13.10",
"@babel/preset-react": "^7.12.13",
"@standardnotes/editor-kit": "2.1.4",
"@standardnotes/editor-kit": "2.2.1",
"@standardnotes/eslint-config-extensions": "^1.0.1",
"@svgr/webpack": "^6.1.2",
"babel-loader": "^8.2.2",

192
yarn.lock
View File

@@ -2597,75 +2597,69 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
"@standardnotes/auth@3.8.1":
version "3.8.1"
resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-3.8.1.tgz#4197fb2f7e223c6bd13a870a3feac3c73294fb3c"
integrity sha512-Q2/81dgFGIGuYlQ4VnSjGRsDB0Qw0tQP/qsiuV+DQj+wdp5Wy5WX3Q4g+p2PNvoyEAYgbuduEHZfWuTLAaIdyw==
"@standardnotes/auth@^3.15.3":
version "3.15.3"
resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-3.15.3.tgz#bf77332e0ac3d846acc45f25083459e42f4a4374"
integrity sha512-16wgMl0qmq8w+HUktfQ7ODoprkngSs0vsSF5G9aHM1L+lFMwlGeVOztHH2zwG91pFkl7BaK6LcEimoYiml6VAw==
dependencies:
"@standardnotes/common" "^1.2.1"
"@standardnotes/common" "^1.8.0"
jsonwebtoken "^8.5.1"
"@standardnotes/auth@3.8.3", "@standardnotes/auth@^3.8.1":
version "3.8.3"
resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-3.8.3.tgz#6e627c1a1a9ebf91d97f52950d099bf7704382e3"
integrity sha512-wz056b3pv8IIX74lYaqjCUvnw3NSow+ex5pn/VlGxg8r7gq19WsmgyXP2BoE7nqKddO1JMlFok+4gdnutYF0Cw==
"@standardnotes/common@^1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@standardnotes/common/-/common-1.8.0.tgz#af72ad85f0d410ae31c0c110137911e2595634de"
integrity sha512-R3nfAvhaXp5ufMB0M0fmV9yizE/Of2PGNJKnxtdxwowAq/ZakHu8Rh/v485PXrCaCFREVOZQO8kg0RQM8YngSw==
"@standardnotes/components@1.4.3":
version "1.4.3"
resolved "https://registry.yarnpkg.com/@standardnotes/components/-/components-1.4.3.tgz#e48205a00b2727a9d68c051785806f35985754b5"
integrity sha512-MUVPEQmRICLgQ3s+TPNP09w6GBbIO1B0WaqAoYJX3x21RAxyHwxIKzuz66g2VmlzrHevD92hepix3/ps0qwa4g==
"@standardnotes/domain-events@^2.17.1":
version "2.17.1"
resolved "https://registry.yarnpkg.com/@standardnotes/domain-events/-/domain-events-2.17.1.tgz#fa10eac7b6072da5d8e06b5e0b41eee256ed3879"
integrity sha512-9B0WtXPwL4RhZtlJ5DAapXMV8rAxyJ9oYaktfe67xm5OXbO5rgqyfe05O7u2N1SVj31PlQbJinrnelXiWpQfrA==
dependencies:
"@standardnotes/common" "^1.2.1"
"@standardnotes/auth" "^3.15.3"
"@standardnotes/common@1.2.1", "@standardnotes/common@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@standardnotes/common/-/common-1.2.1.tgz#9db212db86ccbf08b347da02549b3dbe4bedbb02"
integrity sha512-HilBxS50CBlC6TJvy1mrnhGVDzOH63M/Jf+hyMxQ0Vt1nYzpd0iyxVEUrgMh7ZiyO1b9CLnCDED99Jy9rnZWVQ==
"@standardnotes/components@1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@standardnotes/components/-/components-1.2.8.tgz#fc104f520edcc6c80e958167758d844094297554"
integrity sha512-M6pBV0ZULNZr+Q5d+xq1i5ZahZtwy6Daf+XGRQOBbWjrme/ECAW+2VXBRk3YkK4+DbRTziFDoiod9wJ011mQiw==
"@standardnotes/domain-events@2.5.1":
version "2.5.1"
resolved "https://registry.yarnpkg.com/@standardnotes/domain-events/-/domain-events-2.5.1.tgz#e6433e940ae616683d1c24f76133c70755504c44"
integrity sha512-p0VB4Al/ZcVqcj9ztU7TNqzc3jjjG6/U7x9lBW/QURHxpB+PnwJq3kFU5V5JA9QpCOYlXLT71CMERMf/O5QX6g==
"@standardnotes/features@1.25.0", "@standardnotes/features@^1.25.0":
version "1.25.0"
resolved "https://registry.yarnpkg.com/@standardnotes/features/-/features-1.25.0.tgz#7ea32b547030ae82a60a2b30c458073072bd60c9"
integrity sha512-8mwP6/WC/5YSfjNw/uburRDpXltebXyKWVmTWlewNdwWEnXMaTm9FqmuYvs1EDPPBIlKYheLQfK6bu78eEjLMQ==
dependencies:
"@standardnotes/auth" "^3.8.1"
"@standardnotes/auth" "^3.15.3"
"@standardnotes/common" "^1.8.0"
"@standardnotes/features@1.20.7", "@standardnotes/features@^1.20.7":
version "1.20.7"
resolved "https://registry.yarnpkg.com/@standardnotes/features/-/features-1.20.7.tgz#d666569492e942eaecc05e40a79d50d33df4fbe9"
integrity sha512-eaZu/+PvHYXWaq6r3ET87t52lZqFknZVUEjspAL34Fdr+5cDma5ZRoylx6hPCVDO9VpHd6fjGWlS+5kZ+qJ+bA==
"@standardnotes/settings@^1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@standardnotes/settings/-/settings-1.10.0.tgz#b46d4805c9a1cfb3fa3d9b3915daae9dd5661789"
integrity sha512-FUy4RDI7nFnbOGAaX5wMvBz+6Yto5tXGXDAi7bnWALZByTIlN8bkFZ2CNk2skjpzeOxBjqhCRi+GRCcuMqZ70A==
"@standardnotes/sncrypto-common@^1.6.0":
version "1.6.0"
resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.6.0.tgz#c6174adf65c778c8d53e45ea4c68087786f86b67"
integrity sha512-3gTTokb+DWxtBH72auVtoB76V9pCZWyQ7hmClgBuQF3i5j6HvuuBZGiicHmwAv1zJxMi/op3haE8lwzQc8NJ9g==
"@standardnotes/sncrypto-web@1.6.0":
version "1.6.0"
resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.6.0.tgz#eb09aad9b617fbb1e1dcac13dd049a473bcc4feb"
integrity sha512-FhehxNCcqjiA8aNRApdswVIZ3IydzXPoKG8K4AKsThUlIGlFra7qeyyVVxmEj0dTW7tXpP3SXH01n0LiYgM8vw==
dependencies:
"@standardnotes/auth" "3.8.3"
"@standardnotes/common" "1.2.1"
"@standardnotes/settings@^1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@standardnotes/settings/-/settings-1.9.0.tgz#0f01da5f6782363e4d77ee584b40f8614c555626"
integrity sha512-y+Mh7NuXtekEDr4PAvzg9KcRaCdd+0zlTXWO2D5MG28lLv/uhZmSsyWxZCVZqW3Rx6vz3c9IJdi7SoXN51gzSQ==
"@standardnotes/sncrypto-common@1.5.2", "@standardnotes/sncrypto-common@^1.5.2":
version "1.5.2"
resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.5.2.tgz#be9404689d94f953c68302609a4f76751eaa82cd"
integrity sha512-+OQ6gajTcVSHruw33T52MHyBDKL1vRCfQBXQn4tt4+bCfBAe+PFLkEQMHp35bg5twCfg9+wUf2KhmNNSNyBBZw==
"@standardnotes/sncrypto-web@1.5.3":
version "1.5.3"
resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.5.3.tgz#b055bcac553914cbeebfa10e45f46fff817116c3"
integrity sha512-thyFc71cTJTfmLNPgT1hDMiMefZ1bgN0eTa22GEJSp4T41J/X9MldyP2dTmc7sHNM95TJlwzlIJ0iQtxFUE50w==
dependencies:
"@standardnotes/sncrypto-common" "^1.5.2"
"@standardnotes/sncrypto-common" "^1.6.0"
buffer "^6.0.3"
libsodium-wrappers "^0.7.9"
"@standardnotes/snjs@2.35.5":
version "2.35.5"
resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.35.5.tgz#eddeb2ec084d3828ffbec5bbece8ba6483956234"
integrity sha512-nftxSfHhS45jTUfe98rTV1Ie3zLVrke2M1U8OwttA7vQvg5e9f3aoLUml5efNMe02r7xVYf09/BIwxvZ0Zo4uw==
"@standardnotes/snjs@2.41.0":
version "2.41.0"
resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.41.0.tgz#48d02e981780a9d7d823f6186497a1c6459bbd66"
integrity sha512-Rnl5wWbMKTQ+bQb7zGK/7HFt43bMBlP06G5zoEE0Vj/uxyneLxaEX+iPNXRUDqeHfxvedtTnIXsLGFEux/G1dg==
dependencies:
"@standardnotes/auth" "3.8.1"
"@standardnotes/common" "1.2.1"
"@standardnotes/domain-events" "2.5.1"
"@standardnotes/features" "^1.20.7"
"@standardnotes/settings" "^1.9.0"
"@standardnotes/sncrypto-common" "1.5.2"
"@standardnotes/auth" "^3.15.3"
"@standardnotes/common" "^1.8.0"
"@standardnotes/domain-events" "^2.17.1"
"@standardnotes/features" "^1.25.0"
"@standardnotes/settings" "^1.10.0"
"@standardnotes/sncrypto-common" "^1.6.0"
"@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
version "5.4.0"
@@ -3897,6 +3891,11 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -4861,6 +4860,13 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
dependencies:
safe-buffer "^5.0.1"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -7102,6 +7108,22 @@ json5@^2.1.2:
dependencies:
minimist "^1.2.5"
jsonwebtoken@^8.5.1:
version "8.5.1"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
lodash.isboolean "^3.0.3"
lodash.isinteger "^4.0.4"
lodash.isnumber "^3.0.3"
lodash.isplainobject "^4.0.6"
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
semver "^5.6.0"
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -7128,6 +7150,23 @@ jstransformer@1.0.0:
array-includes "^3.1.2"
object.assign "^4.1.2"
jwa@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
dependencies:
buffer-equal-constant-time "1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
jws@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
dependencies:
jwa "^1.4.1"
safe-buffer "^5.0.1"
kind-of@^3.0.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -7275,6 +7314,36 @@ lodash.debounce@^4.0.8:
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
lodash.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
lodash.isboolean@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
lodash.isinteger@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
lodash.isnumber@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
lodash.isstring@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
lodash.memoize@4.x:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -7285,6 +7354,11 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash.once@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
lodash@^4.0.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@~4.17.10:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
@@ -9082,7 +9156,7 @@ selfsigned@^1.10.11:
dependencies:
node-forge "^0.10.0"
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0:
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==