diff --git a/.vscode/settings.json b/.vscode/settings.json index 02e4b763..f08af973 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,15 @@ "[typescriptreact]": { "editor.formatOnSave": true }, + "[scss]": { + "editor.formatOnSave": true + }, + "[css]": { + "editor.formatOnSave": true + }, + "[sass]": { + "editor.formatOnSave": true + }, "eslint.alwaysShowStatus": true, "prettier.singleQuote": false, "editor.codeActionsOnSave": { diff --git a/@types/Common/index.d.ts b/@types/Common/index.d.ts index 0477f109..c900c077 100755 --- a/@types/Common/index.d.ts +++ b/@types/Common/index.d.ts @@ -1,153 +1,169 @@ interface Tab { - id: number; - title?: string; - url?: string; - showBackBtn?: boolean; - moves?: boolean; - fileKey?: string; - order?: number; + id: number; + title?: string; + url?: string; + showBackBtn?: boolean; + moves?: boolean; + fileKey?: string; + order?: number; + focused?: boolean; } interface SavedTab { - title?: string; - url?: string; + title?: string; + url?: string; } interface ShortcutsMap { - accelerator: string; - value: string; - type: 'action' | 'command' | 'id'; + accelerator: string; + value: string; + type: "action" | "command" | "id"; } -interface SctionState { - [state: string]: boolean; - 'newFile': boolean; - 'openFileBrowser': boolean; - 'reopenClosedTab': boolean; - 'closeTab': boolean; - 'save-as': boolean; - 'export-selected-exportables': boolean; - 'undo': boolean; - 'redo': boolean; - 'paste-over-selection': boolean; - 'toggle-dropper': boolean; - 'set-default-style': boolean; - 'copy-properties': boolean; - 'paste-properties': boolean; - 'selectAll': boolean; - 'deselect-all': boolean; - 'select-inverse': boolean; - 'select-same-style': boolean; - 'select-same-fill': boolean; - 'select-same-stroke': boolean; - 'select-same-effect': boolean; - 'select-same-text': boolean; - 'select-same-font': boolean; - 'select-same-instance': boolean; - 'toggle-grid': boolean; - 'toggle-shown-layout-grids': boolean; - 'toggle-show-masks': boolean; - 'toggle-show-artboard-outlines': boolean; - 'toggle-rulers': boolean; - 'toggle-sidebar': boolean; - 'toggle-ui': boolean; - 'toggle-outlines': boolean; - 'toggle-layers': boolean; - 'toggle-publish': boolean; - 'toggle-library': boolean; - 'toggle-pixel-preview': boolean; - 'toggle-checkerboard': boolean; - 'zoom-in': boolean; - 'zoom-out': boolean; - 'zoom-reset': boolean; - 'zoom-to-fit': boolean; - 'zoom-to-selection': boolean; - 'scale-normal': boolean; - 'scale-inc0.1': boolean; - 'scale-dic0.1': boolean; - 'scale-inc0.05': boolean; - 'scale-dic0.05': boolean; - 'next-artboard': boolean; - 'previous-artboard': boolean; - 'group-selection': boolean; - 'ungroup-selection': boolean; - 'frame-selection': boolean; - 'mask-selection': boolean; - 'create-symbol': boolean; - 'find-symbol': boolean; - 'reset-symbol': boolean; - 'detach-instance': boolean; - 'resize-to-fit': boolean; - 'toggle-frame-clipping': boolean; - 'bring-to-front': boolean; - 'bring-forward': boolean; - 'send-backward': boolean; - 'send-to-back': boolean; - 'flip-horizontal': boolean; - 'flip-vertical': boolean; - 'rotate-180': boolean; - 'rotate-90-counterclockwise': boolean; - 'rotate-90-clockwise': boolean; - 'flatten-selection': boolean; - 'outline-stroke': boolean; - 'live-boolean-union': boolean; - 'live-boolean-subtract': boolean; - 'live-boolean-intersect': boolean; - 'live-boolean-xor': boolean; - 'duplicate-in-place': boolean; - 'delete-selection': boolean; - 'convert-to-raster': boolean; - 'toggle-shown-for-selected-nodes': boolean; - 'toggle-locked-for-selected-nodes': boolean; - 'hide-sibling-layers': boolean; - 'collapse-layers': boolean; - 'remove-fill': boolean; - 'remove-stroke': boolean; - 'swap-fill-and-stroke': boolean; - 'join-selection': boolean; - 'smooth-join-selection': boolean; - 'delete-and-heal-selection': boolean; - 'text-toggle-bold': boolean; - 'text-toggle-italic': boolean; - 'text-toggle-underline': boolean; - 'text-toggle-strikethrough': boolean; - 'text-original-case': boolean; - 'text-upper-case': boolean; - 'text-lower-case': boolean; - 'round-to-pixels': boolean; - 'align-left': boolean; - 'align-horizontal-center': boolean; - 'align-right': boolean; - 'align-top': boolean; - 'align-vertical-center': boolean; - 'align-bottom': boolean; - 'pack-horizontal': boolean; - 'pack-vertical': boolean; - 'distribute-horizontal-spacing': boolean; - 'distribute-vertical-spacing': boolean; - 'distribute-left': boolean; - 'distribute-horizontal-center': boolean; - 'distribute-right': boolean; - 'distribute-top': boolean; - 'distribute-vertical-center': boolean; - 'distribute-bottom': boolean; +type View = "TopPanel" | "Settings" | "ThemeCreator"; +type SettingsView = "General" | "Themes"; + +// TODO: don't uses? +interface SectionState { + [state: string]: boolean; + newFile: boolean; + openFileBrowser: boolean; + reopenClosedTab: boolean; + closeTab: boolean; + "save-as": boolean; + "export-selected-exportables": boolean; + undo: boolean; + redo: boolean; + "paste-over-selection": boolean; + "toggle-dropper": boolean; + "set-default-style": boolean; + "copy-properties": boolean; + "paste-properties": boolean; + selectAll: boolean; + "deselect-all": boolean; + "select-inverse": boolean; + "select-same-style": boolean; + "select-same-fill": boolean; + "select-same-stroke": boolean; + "select-same-effect": boolean; + "select-same-text": boolean; + "select-same-font": boolean; + "select-same-instance": boolean; + "toggle-grid": boolean; + "toggle-shown-layout-grids": boolean; + "toggle-show-masks": boolean; + "toggle-show-artboard-outlines": boolean; + "toggle-rulers": boolean; + "toggle-sidebar": boolean; + "toggle-ui": boolean; + "toggle-outlines": boolean; + "toggle-layers": boolean; + "toggle-publish": boolean; + "toggle-library": boolean; + "toggle-pixel-preview": boolean; + "toggle-checkerboard": boolean; + "zoom-in": boolean; + "zoom-out": boolean; + "zoom-reset": boolean; + "zoom-to-fit": boolean; + "zoom-to-selection": boolean; + "scale-normal": boolean; + "scale-inc0.1": boolean; + "scale-dic0.1": boolean; + "scale-inc0.05": boolean; + "scale-dic0.05": boolean; + "next-artboard": boolean; + "previous-artboard": boolean; + "group-selection": boolean; + "ungroup-selection": boolean; + "frame-selection": boolean; + "mask-selection": boolean; + "create-symbol": boolean; + "find-symbol": boolean; + "reset-symbol": boolean; + "detach-instance": boolean; + "resize-to-fit": boolean; + "toggle-frame-clipping": boolean; + "bring-to-front": boolean; + "bring-forward": boolean; + "send-backward": boolean; + "send-to-back": boolean; + "flip-horizontal": boolean; + "flip-vertical": boolean; + "rotate-180": boolean; + "rotate-90-counterclockwise": boolean; + "rotate-90-clockwise": boolean; + "flatten-selection": boolean; + "outline-stroke": boolean; + "live-boolean-union": boolean; + "live-boolean-subtract": boolean; + "live-boolean-intersect": boolean; + "live-boolean-xor": boolean; + "duplicate-in-place": boolean; + "delete-selection": boolean; + "convert-to-raster": boolean; + "toggle-shown-for-selected-nodes": boolean; + "toggle-locked-for-selected-nodes": boolean; + "hide-sibling-layers": boolean; + "collapse-layers": boolean; + "remove-fill": boolean; + "remove-stroke": boolean; + "swap-fill-and-stroke": boolean; + "join-selection": boolean; + "smooth-join-selection": boolean; + "delete-and-heal-selection": boolean; + "text-toggle-bold": boolean; + "text-toggle-italic": boolean; + "text-toggle-underline": boolean; + "text-toggle-strikethrough": boolean; + "text-original-case": boolean; + "text-upper-case": boolean; + "text-lower-case": boolean; + "round-to-pixels": boolean; + "align-left": boolean; + "align-horizontal-center": boolean; + "align-right": boolean; + "align-top": boolean; + "align-vertical-center": boolean; + "align-bottom": boolean; + "pack-horizontal": boolean; + "pack-vertical": boolean; + "distribute-horizontal-spacing": boolean; + "distribute-vertical-spacing": boolean; + "distribute-left": boolean; + "distribute-horizontal-center": boolean; + "distribute-right": boolean; + "distribute-top": boolean; + "distribute-vertical-center": boolean; + "distribute-bottom": boolean; +} + +interface FeatureFlags { + desktop_beta_use_agent_for_fonts?: boolean; } -interface ISettings { - app: { - panelHeight: number; - showMainMenu: boolean; - disabledMainMenu: boolean; - saveLastOpenedTabs: boolean; - windowFrame: boolean; - disabledFonts: boolean; - exportDir: string; - fontDirs: string[]; - lastOpenedTabs: SavedTab[]; - }; - ui: { - scalePanel: number; - scaleFigmaUI: number; - }; - [path: string]: any; -} \ No newline at end of file +interface SettingsInterface { + clientId: string; + app: { + logLevel: number; + enableColorSpaceSrgb: boolean; + visibleNewProjectBtn: boolean; + panelHeight: number; + saveLastOpenedTabs: boolean; + exportDir: string; + fontDirs: string[]; + lastOpenedTabs: SavedTab[]; + featureFlags: FeatureFlags; + savedExtensions: Extensions.ExtensionJson[]; + lastSavedPluginDir?: string; + lastExportDir?: string; + }; + ui: { + scalePanel: number; + scaleFigmaUI: number; + }; + theme: { + currentTheme: string; + }; + [path: string]: any; +} diff --git a/@types/Common/menu.d.ts b/@types/Common/menu.d.ts index 14a08878..4c842c99 100644 --- a/@types/Common/menu.d.ts +++ b/@types/Common/menu.d.ts @@ -10,7 +10,7 @@ declare namespace Menu { * Public types */ type NativeClick = (item: _MenuItem, window: _BrowserWindow, event: Event) => void; - type CutsomClick = (item: _MenuItemConstructorOptions, window: _BrowserWindow, event: Event) => void; + type CustomClick = (item: _MenuItemConstructorOptions, window: _BrowserWindow, event: Event) => void; type Params = ParamsId | ParamsAction | ParamsCommand; type MenuItem = Items.MenuName & (Items.PluginItem | Items.Separator | Items.Submenu | Items.Menu | Items.StringKey); @@ -26,7 +26,10 @@ declare namespace Menu { type: string; key: string; string: string; - plugin: string; + plugin?: string; + visible?: boolean; + disabled?: boolean; + click?: (menuItem: Menu.PluginMenuItem, browserWindow: _BrowserWindow | undefined, event: KeyboardEvent) => void; } interface Separator { @@ -38,8 +41,8 @@ declare namespace Menu { submenu: [MenuName & Separator & Submenu & Menu & PluginItem & StringKey]; } interface Menu { - disabled?: boolean; type: "run-menu-action"; + disabled?: boolean; menuAction: MenuAction; name: MenuName; } @@ -59,14 +62,14 @@ declare namespace Menu { interface ParamsId { id: string; - click?: NativeClick | CutsomClick; + click?: NativeClick | CustomClick; } interface ParamsAction { action: string; - click?: NativeClick | CutsomClick; + click?: NativeClick | CustomClick; } interface ParamsCommand { command: string; - click?: NativeClick | CutsomClick; + click?: NativeClick | CustomClick; } } diff --git a/@types/Common/themes.d.ts b/@types/Common/themes.d.ts new file mode 100644 index 00000000..8941c860 --- /dev/null +++ b/@types/Common/themes.d.ts @@ -0,0 +1,128 @@ +declare namespace Themes { + interface CSSRuleListCustom extends CSSRuleList, IterableIterator {} + + interface ColorsMap { + [property: string]: string; + } + + interface Theme { + name: string; + author: string; + id: string; + url?: string; + palette: Palette; + } + + interface Palette { + /** + * text color + */ + text: string; + /** + * active text color + */ + "text-active": string; + /** + * disabled text color + */ + "text-disabled": string; + /** + * bg color of panels and a page bg + */ + "bg-panel": string; + /** + * tool bar bg color + */ + "bg-toolbar": string; + /** + * tool bar item bg color on hover + */ + "bg-toolbar-hover": string; + /** + * share button, selected tool bar item, other selections color + */ + "bg-toolbar-active": string; + /** + * tool bar icons color + */ + "fg-toolbar": string; + /** + * tool bar icons color on hover + */ + "fg-toolbar-hover": string; + /** + * tool bar active icon color + */ + "fg-toolbar-active": string; + /** + * tool bar disabled icon color + */ + "fg-toolbar-disabled": string; + /** + * tool bar name of project text color + */ + "fg-toolbar-filename": string; + /** + * tool bar name of folder project text color + */ + "fg-toolbar-foldername": string; + /** + * tool bar chevron color + */ + "fg-toolbar-chevron": string; + /** + * unsaved icon color + */ + "fg-toolbar-unsavedicon": string; + /** + * tool bar login button color + */ + "fg-toolbar-login-button": string; + /** + * tool bar login button border color + */ + "fg-toolbar-login-button-border": string; + /** + * tool bar active login button color + */ + "fg-toolbar-login-button-active": string; + /** + * tool bar item dropdown menu bg color + */ + "bg-overlay": string; + /** + * tool bar item dropdown menu outline shadow color + */ + "bg-overlay-outline": string; + /** + * tool bar item dropdown menu border color + */ + "bg-overlay-inner-outline": string; + "bg-tab": string; + "bg-tab-hover": string; + "bg-tab-active": string; + "fg-tab": string; + "fg-tab-hover": string; + "fg-tab-active": string; + "bg-header": string; + "fg-header": string; + "bg-header-control": string; + "bg-header-control-hover": string; + "bg-header-control-active": string; + "fg-header-control": string; + "fg-header-control-hover": string; + "fg-header-control-active": string; + "fg-component": string; + "fg-component-disabled": string; + "fg-component-disabled-row-active": string; + borders: string; + "bg-window-close": string; + "bg-beta-label": string; + [index: string]: string; + } +} + +interface CSSStyleDeclaration { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [index: string]: any; +} diff --git a/@types/Common/types.d.ts b/@types/Common/types.d.ts new file mode 100644 index 00000000..a392d677 --- /dev/null +++ b/@types/Common/types.d.ts @@ -0,0 +1,5 @@ +declare namespace Types { + interface Dic { + [key: string]: T; + } +} diff --git a/@types/Main/extension.d.ts b/@types/Main/extension.d.ts index 950b99c6..743ed254 100644 --- a/@types/Main/extension.d.ts +++ b/@types/Main/extension.d.ts @@ -1,6 +1,8 @@ declare namespace Extensions { type _FSWatcher = import("chokidar").FSWatcher; + type ManifestObserver = (args: Extensions.NotifyObserverParams) => void; + enum Observertype { ADDED = "added", CHANGED = "changed", @@ -33,4 +35,27 @@ declare namespace Extensions { type: string; localLoadResult?: Extension; } + + interface AddPathReturnValue { + id: number; + existed: boolean; + } + + interface ManifestFile { + name: string; + id: string; + api: string; + main: string; + build?: string; + } + + interface ExtensionSource { + source: string; + html: string; + } + interface ExtensionSourceError { + buildErrCode: boolean; + stderr: string; + path: string; + } } diff --git a/@types/Renderer/index.d.ts b/@types/Renderer/index.d.ts index dbd583b8..9b76040f 100755 --- a/@types/Renderer/index.d.ts +++ b/@types/Renderer/index.d.ts @@ -1,12 +1,8 @@ interface Window extends EventTarget, - WindowTimers, WindowSessionStorage, WindowLocalStorage, - WindowConsole, GlobalEventHandlers, - IDBEnvironment, - WindowBase64, AnimationFrameProvider, WindowOrWorkerGlobalScope, WindowEventHandlers { diff --git a/@types/Renderer/stores.d.ts b/@types/Renderer/stores.d.ts index 6b91158a..e0178f13 100755 --- a/@types/Renderer/stores.d.ts +++ b/@types/Renderer/stores.d.ts @@ -1,9 +1,9 @@ interface TabsStore { tabs: Array; - current: number; + current: number | undefined; addTab(options: { id: number; url: string; showBackBtn: boolean }): void; - setFocus(id: number): void; + setFocus(id?: number): void; deleteTab(id: number): void; updateTab(tab: Tab): void; changeTagOrder(tab: Tab): void; diff --git a/@types/Renderer/webApi.d.ts b/@types/Renderer/webApi.d.ts index 2036bad1..c6c92d4f 100755 --- a/@types/Renderer/webApi.d.ts +++ b/@types/Renderer/webApi.d.ts @@ -1,5 +1,37 @@ -declare namespace WepApi { +declare namespace WebApi { interface SetPluginMenuDataProps { data: Menu.MenuItem[]; } + + interface WriteNewExtensionToDiskArgs { + dirName: string; + files: [ + { + content: string; + name: string; + }, + ]; + } + + interface SetTitleArgs { + title: string; + } + + interface ExtensionId { + id: number; + } + + interface CreateMultipleExtension { + depth: number; + options: Electron.OpenDialogOptions; + } + + interface WriteFiles { + files: [ + { + name: string; + buffer: Uint8Array; + }, + ]; + } } diff --git a/@types/enums.ts b/@types/enums.ts new file mode 100644 index 00000000..d272ee0f --- /dev/null +++ b/@types/enums.ts @@ -0,0 +1,5 @@ +export const enum LogLevel { + DEBUG, + INFO, + ERROR, +} diff --git a/@types/index.d.ts b/@types/index.d.ts index 7a5fca13..a82dcb52 100644 --- a/@types/index.d.ts +++ b/@types/index.d.ts @@ -1,87 +1,210 @@ declare namespace Electron { - interface MainInterface extends CommonInterface { + interface RemoteMainInterface { app: App; } + interface MenuItemConstructorOptions { + click?: (menuItem: Menu.PluginMenuItem, browserWindow: BrowserWindow | undefined, event: KeyboardEvent) => void; + } + interface MenuItem { click: (item: MenuItemConstructorOptions, window: BrowserWindow, event: Event) => void; } interface App extends NodeJS.EventEmitter { - on(event: "handle-command", listener: (command: string) => void): this; + on(event: "handle-command", listener: (sender: Electron.WebContents, command: string) => void): this; on(event: "handle-page-command", listener: (item: any, window: BrowserWindow) => void): this; - on(event: "update-figma-ui-scale", listener: (scale: number) => void): this; - on(event: "update-panel-scale", listener: (scale: number) => void): this; - on(event: "set-hide-main-menu", listener: (hide: boolean) => void): this; - on(event: "set-disable-main-menu", listener: (disabled: boolean) => void): this; - on(event: "set-disable-fonts", listener: (disabled: boolean) => void): this; on(event: "os-menu-invalidated", listener: (dependencies: MenuState.MenuStateParams) => void): this; on(event: "log", listener: (data: any) => void): this; on(event: "sign-out", listener: () => void): this; + on(event: "set-default-theme", listener: () => void): this; + on(event: "themes-add-repository", listener: () => void): this; + on(event: "themes-remove-repository", listener: () => void): this; + on(event: "toggle-settings-developer-tools", listener: () => void): this; + on(event: "toggle-current-tab-devtools", listener: () => void): this; + on(event: "handleUrl", listener: (senderId: number, url: string) => void): this; + on(event: "openSettingsView", listener: () => void): this; + on(event: "openThemeCreatorView", listener: () => void): this; - once(event: "handle-command", listener: (command: string) => void): this; - once(event: "handle-page-command", listener: (item: any, window: BrowserWindow) => void): this; - once(event: "update-figma-ui-scale", listener: (scale: number) => void): this; - once(event: "update-panel-scale", listener: (scale: number) => void): this; - once(event: "set-hide-main-menu", listener: (hide: boolean) => void): this; - once(event: "set-disable-main-menu", listener: (disabled: boolean) => void): this; - once(event: "set-disable-fonts", listener: (disabled: boolean) => void): this; - once(event: "os-menu-invalidated", listener: (dependencies: MenuState.MenuStateParams) => void): this; - once(event: "log", listener: (data: any) => void): this; - once(event: "sign-out", listener: () => void): this; - - addListener(event: "handle-command", listener: (command: string) => void): this; - addListener(event: "handle-page-command", listener: (item: any, window: BrowserWindow) => void): this; - addListener(event: "update-figma-ui-scale", listener: (scale: number) => void): this; - addListener(event: "update-panel-scale", listener: (scale: number) => void): this; - addListener(event: "set-hide-main-menu", listener: (hide: boolean) => void): this; - addListener(event: "set-disable-main-menu", listener: (disabled: boolean) => void): this; - addListener(event: "set-disable-fonts", listener: (disabled: boolean) => void): this; - addListener(event: "os-menu-invalidated", listener: (dependencies: MenuState.MenuStateParams) => void): this; - addListener(event: "log", listener: (data: any) => void): this; - addListener(event: "sign-out", listener: () => void): this; - - removeListener(event: "handle-command", listener: (command: string) => void): this; - removeListener(event: "handle-page-command", listener: (item: any, window: BrowserWindow) => void): this; - removeListener(event: "update-figma-ui-scale", listener: (scale: number) => void): this; - removeListener(event: "update-panel-scale", listener: (scale: number) => void): this; - removeListener(event: "set-hide-main-menu", listener: (hide: boolean) => void): this; - removeListener(event: "set-disable-main-menu", listener: (disabled: boolean) => void): this; - removeListener(event: "set-disable-fonts", listener: (disabled: boolean) => void): this; - removeListener(event: "os-menu-invalidated", listener: (dependencies: MenuState.MenuStateParams) => void): this; - removeListener(event: "log", listener: (data: any) => void): this; - removeListener(event: "sign-out", listener: () => void): this; - - emit(event: "handle-command", command: string): boolean; + emit(event: "handle-command", sender: Electron.WebContents, command: string): boolean; emit(event: "handle-page-command", item: any, window: BrowserWindow): boolean; - emit(event: "update-figma-ui-scale", scale: number): boolean; - emit(event: "update-panel-scale", scale: number): boolean; - emit(event: "set-hide-main-menu", hide: boolean): boolean; - emit(event: "set-disable-main-menu", disabled: boolean): boolean; - emit(event: "set-disable-fonts", disabled: boolean): boolean; emit(event: "os-menu-invalidated", dependencies: MenuState.MenuStateParams): boolean; emit(event: "log", data: any): boolean; emit(event: "sign-out"): boolean; + emit(event: "set-default-theme"): boolean; + emit(event: "themes-add-repository"): boolean; + emit(event: "themes-remove-repository"): boolean; + emit(event: "toggle-settings-developer-tools"): boolean; + emit(event: "toggle-current-tab-devtools"): boolean; + emit(event: "handleUrl", senderId: number, url: string): boolean; + emit(event: "openSettingsView"): boolean; + emit(event: "openThemeCreatorView"): boolean; } interface IpcMain extends NodeJS.EventEmitter { - on(channel: string, listener: (event: IpcMainEvent, args: any) => void): this; - on(channel: "setTitle", listener: (event: IpcMainEvent, title: string) => void): this; - on(channel: "setPluginMenuData", listener: (event: IpcMainEvent, pluginMenu: Menu.MenuItem[]) => void): this; + on(channel: string, listener: (event: IpcMainInvokeEvent, args: any) => void): this; + on(channel: "setTitle", listener: (event: IpcMainInvokeEvent, title: string) => void): this; + on(channel: "setPluginMenuData", listener: (event: IpcMainInvokeEvent, pluginMenu: Menu.MenuItem[]) => void): this; + on(channel: "receiveTabs", listener: (event: IpcMainInvokeEvent, tabs: Tab[]) => void): this; + on(channel: "updateActionState", listener: (event: IpcMainInvokeEvent, state: MenuState.State) => void): this; + on(channel: "updateFileKey", listener: (event: IpcMainInvokeEvent, key: string) => void): this; + on(channel: "setTabUrl", listener: (event: IpcMainInvokeEvent, url: string) => void): this; + on(channel: "closeAllTab", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "setFocusToMainTab", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "setTabFocus", listener: (event: IpcMainInvokeEvent, id: number) => void): this; + on(channel: "closeTab", listener: (event: IpcMainInvokeEvent, id: number) => void): this; + on(channel: "newTab", listener: (event: IpcMainInvokeEvent, id: number) => void): this; + on(channel: "closeSettingsView", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "closeThemeCreatorView", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "themeCreatorExportTheme", listener: (event: IpcMainInvokeEvent, theme: Themes.Theme) => void): this; + on( + channel: "enableColorSpaceSrgbWasChanged", + listener: (event: IpcMainInvokeEvent, enabled: boolean) => void, + ): this; + on(channel: "updateFigmaUiScale", listener: (event: IpcMainInvokeEvent, scale: number) => void): this; + on(channel: "updatePanelScale", listener: (event: IpcMainInvokeEvent, scale: number) => void): this; + on(channel: "startAppAuth", listener: (event: IpcMainInvokeEvent, auth: { grantPath: string }) => void): this; + on(channel: "finishAppAuth", listener: (event: IpcMainInvokeEvent, auth: { redirectURL: string }) => void): this; + on( + channel: "setFeatureFlags", + listener: (event: IpcMainInvokeEvent, auth: { featureFlags: FeatureFlags }) => void, + ): this; + on(channel: "log-debug", listener: (event: IpcMainInvokeEvent, ...args: any[]) => void): this; + on(channel: "log-info", listener: (event: IpcMainInvokeEvent, ...args: any[]) => void): this; + on(channel: "log-error", listener: (event: IpcMainInvokeEvent, ...args: any[]) => void): this; + on( + channel: "openDevTools", + listener: (event: IpcMainInvokeEvent, mode: "right" | "bottom" | "undocked" | "detach") => void, + ): this; + on(channel: "removeLocalFileExtension", listener: (event: IpcMainInvokeEvent, id: number) => void): this; + on(channel: "openExtensionDirectory", listener: (event: IpcMainInvokeEvent, id: number) => void): this; + on(channel: "openMenu", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "appExit", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "newProject", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "updateVisibleNewProjectBtn", listener: (event: IpcMainInvokeEvent, visible: boolean) => void): this; + on(channel: "themes-change", listener: (event: IpcMainInvokeEvent, theme: Themes.Theme) => void): this; + on(channel: "set-default-theme", listener: (event: IpcMainInvokeEvent) => void): this; + on(channel: "saveCreatorTheme", listener: (event: IpcMainInvokeEvent, theme: Themes.Theme) => void): this; + on(channel: "sync-themes", listener: (event: IpcMainInvokeEvent) => void): this; - once(channel: string, listener: (event: IpcMainEvent, args: any) => void): this; - once(channel: "setTitle", listener: (event: IpcMainEvent, title: string) => void): this; - once(channel: "setPluginMenuData", listener: (event: IpcMainEvent, pluginMenu: Menu.MenuItem[]) => void): this; - removeAllListeners(channel: string): this; - removeAllListeners(channel: "setTitle"): this; - removeAllListeners(channel: "setPluginMenuData"): this; + handle( + channel: "writeNewExtensionToDisk", + listener: (event: IpcMainInvokeEvent, data: WebApi.WriteNewExtensionToDiskArgs) => Promise | number, + ): void; + handle(channel: "getAllLocalFileExtensionIds", listener: (event: IpcMainInvokeEvent) => Promise | any): void; + handle( + channel: "getLocalFileExtensionManifest", + listener: ( + event: IpcMainInvokeEvent, + id: number, + ) => Promise | Extensions.ExtensionWithManifest | Extensions.ExtensionWithError, + ): void; + handle( + channel: "getLocalFileExtensionSource", + listener: ( + event: IpcMainInvokeEvent, + id: number, + ) => Promise | Extensions.ExtensionSource | Extensions.ExtensionSourceError, + ): void; + handle( + channel: "createMultipleNewLocalFileExtensions", + listener: (event: IpcMainInvokeEvent, data: WebApi.CreateMultipleExtension) => Promise | any, + ): void; + handle(channel: "isDevToolsOpened", listener: (event: IpcMainInvokeEvent) => Promise | any): void; + handle( + channel: "writeFiles", + listener: (event: IpcMainInvokeEvent, data: WebApi.WriteFiles) => Promise | void, + ): void; + } - removeListener(channel: string, listener: (event: IpcMainEvent, args: any) => void): this; - removeListener(channel: "setTitle", listener: (event: IpcMainEvent, title: string) => void): this; - removeListener( - channel: "setPluginMenuData", - listener: (event: IpcMainEvent, pluginMenu: Menu.MenuItem[]) => void, + interface IpcRenderer extends NodeJS.EventEmitter { + on(channel: "renderView", listener: (event: IpcRendererEvent, view: View) => void): this; + on(channel: "updatePanelHeight", listener: (event: IpcRendererEvent, height: number) => void): this; + on(channel: "updateVisibleNewProjectBtn", listener: (event: IpcRendererEvent, visible: boolean) => void): this; + on(channel: "updatePanelScale", listener: (event: IpcRendererEvent, scale: number) => void): this; + on(channel: "updateUiScale", listener: (event: IpcRendererEvent, scale: number) => void): this; + on( + channel: "updateFileKey", + listener: (event: IpcRendererEvent, data: { id: number; fileKey: string }) => void, ): this; + on(channel: "setTabUrl", listener: (event: IpcRendererEvent, data: { id: number; url: string }) => void): this; + on(channel: "closeAllTabs", listener: (event: IpcRendererEvent) => void): this; + on(channel: "setTitle", listener: (event: IpcRendererEvent, data: { id: number; title: string }) => void): this; + on(channel: "closeTab", listener: (event: IpcRendererEvent, data: { id: number }) => void): this; + on(channel: "didTabAdd", listener: (event: IpcRendererEvent, data: Tab) => void): this; + on(channel: "getUploadedThemes", listener: (event: IpcRendererEvent, themes: Themes.Theme[]) => void): this; + on(channel: "mainTabFocused", listener: (event: IpcRendererEvent) => void): this; + on(channel: "themes-change", listener: (event: IpcRendererEvent, theme: Themes.Theme) => void): this; + on(channel: "set-default-theme", listener: (event: IpcRendererEvent) => void): this; + on(channel: "loadCreatorTheme", listener: (event: IpcRendererEvent, theme: Themes.Theme) => void): this; + on(channel: "sync-themes-start", listener: (event: IpcRendererEvent) => void): this; + on(channel: "sync-themes-end", listener: (event: IpcRendererEvent) => void): this; + + send(channel: string, ...args: any[]): void; + send(channel: "setTitle", data: { id: number; title: string }): this; + send(channel: "setPluginMenuData", pluginMenu: Menu.MenuItem[]): this; + send(channel: "receiveTabs", tabs: Tab[]): this; + send(channel: "updateActionState", state: MenuState.State): this; + send(channel: "closeAllTab"): this; + send(channel: "setFocusToMainTab"): this; + send(channel: "updateFileKey", data: { id: number; fileKey: string }): this; + send(channel: "setTabUrl", data: { id: number; url: string }): this; + send(channel: "setTabFocus", id: number): this; + send(channel: "closeTab", id: number): this; + send(channel: "newTab"): this; + send(channel: "closeSettingsView"): this; + send(channel: "closeThemeCreatorView"): this; + send(channel: "themeCreatorExportTheme", theme: Themes.Theme): this; + send(channel: "enableColorSpaceSrgbWasChanged", enabled: boolean): this; + send(channel: "updateFigmaUiScale", scale: number): this; + send(channel: "updatePanelScale", scale: number): this; + send(channel: "log-debug", ...args: any[]): this; + send(channel: "log-info", ...args: any[]): this; + send(channel: "log-error", ...args: any[]): this; + send(channel: "removeLocalFileExtension", id: number): this; + send(channel: "openExtensionDirectory", id: number): this; + send(channel: "openMenu"): this; + send(channel: "newProject"): this; + send(channel: "appExit"): this; + send(channel: "updateVisibleNewProjectBtn", visible: boolean): this; + send(channel: "themes-change", theme: Themes.Theme): this; + send(channel: "set-default-theme"): this; + send(channel: "saveCreatorTheme", theme: Themes.Theme): this; + send(channel: "sync-themes"): this; + + invoke(channel: "writeNewExtensionToDisk", data: WebApi.WriteNewExtensionToDiskArgs): Promise; + invoke(channel: "getAllLocalFileExtensionIds"): Promise; + invoke(channel: "getLocalFileExtensionManifest", id: number): Promise; + invoke( + channel: "getLocalFileExtensionSource", + id: number, + ): Promise; + invoke(channel: "createMultipleNewLocalFileExtensions", data: WebApi.CreateMultipleExtension): Promise; + invoke(channel: "isDevToolsOpened"): Promise; + invoke(channel: "writeFiles", data: WebApi.WriteFiles): Promise; + } + + interface WebContents extends NodeJS.EventEmitter { + send(channel: "renderView", view: View): void; + send(channel: "getUploadedThemes", themes: Themes.Theme[]): void; + send(channel: "updatePanelHeight", height: number): void; + send(channel: "updateVisibleNewProjectBtn", visible: boolean): void; + send(channel: "updatePanelScale", scale: number): void; + send(channel: "updateUiScale", scale: number): void; + send(channel: "closeAllTab"): void; + send(channel: "updateFileKey", data: { id: number; fileKey: string }): this; + send(channel: "setTabUrl", data: { id: number; url: string }): this; + send(channel: "setTitle", data: { id: number; title: string }): void; + send(channel: "closeTab", data: { id: number }): this; + send(channel: "didTabAdd", data: Tab): this; + send(channel: "handleUrl", url: string): this; + send(channel: "mainTabFocused"): this; + send(channel: "themes-change", theme: Themes.Theme): this; + send(channel: "loadCreatorTheme", theme: Themes.Theme): this; + send(channel: "sync-themes-start", theme: Themes.Theme): this; + send(channel: "sync-themes-end", theme: Themes.Theme): this; + + destroy(): void; } interface RequestHeaders { diff --git a/README.md b/README.md index 574759cb..7d16305c 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,7 @@ Figma-linux is an unofficial [Electron](http://electron.atom.io)-based [Figma](

[![Codacy Badge](https://api.codacy.com/project/badge/Grade/d80ff1e7c3fe4da28e2e50a28d4ead7c)](https://www.codacy.com/manual/ChugunovRoman/figma-linux?utm_source=github.com&utm_medium=referral&utm_content=ChugunovRoman/figma-linux&utm_campaign=Badge_Grade) -[![figma-linux](https://snapcraft.io/figma-linux/badge.svg)](https://snapcraft.io/figma-linux) -[![Snap Status](https://build.snapcraft.io/badge/ChugunovRoman/figma-linux.svg)](https://build.snapcraft.io/user/ChugunovRoman/figma-linux) +[![Snap](https://snapcraft.io/figma-linux/badge.svg)](https://snapcraft.io/figma-linux)

Buy Me A Coffee donate button @@ -101,7 +100,6 @@ sudo dnf install figma-linux-*.x86_64.rpm ``` - ## Building from source 1. Clone the repository: diff --git a/config/builder.json b/config/builder.json index 91f8b001..83077c50 100755 --- a/config/builder.json +++ b/config/builder.json @@ -15,6 +15,14 @@ "output": "build/installers" }, + "fileAssociations": [ + { + "ext": "fig", + "name": "Figma File", + "role": "Editor" + } + ], + "protocols": [{ "name": "figma", "role": "Viewer", @@ -31,49 +39,19 @@ "category": "Graphics" }, - "snap": { - "plugs": [ - { - "home": { - "interface": "personal-files", - "allow-auto-connection": true, - "read": [ - "$HOME/.config", - "$HOME/.local", - "$HOME/Documents" - ], - "write": [ - "$HOME/.config", - "$HOME/.local", - "$HOME/Documents" - ] - } - }, - { - "removable-devices": { - "interface": "removable-media" - } - }, - "desktop", - "desktop-legacy", - "home", - "x11", - "unity7", - "browser-support", - "network", - "gsettings", - "pulseaudio", - "opengl", - "gsettings" - ] - }, - "linux": { "description": "Unofficial desktop application for linux", "icon": "resources/icons", "category": "Graphic", "packageCategory": "Graphic", "maintainer": "Chugunov Roman ", + "fileAssociations": [ + { + "ext": "fig", + "name": "Figma File", + "role": "Editor" + } + ], "target": [ { "target": "deb", diff --git a/config/webpack.config.main.js b/config/webpack.config.main.js index 0b0e705e..9a8017eb 100755 --- a/config/webpack.config.main.js +++ b/config/webpack.config.main.js @@ -1,50 +1,58 @@ -const CopyWebpackPlugin = require('copy-webpack-plugin'); +const CopyWebpackPlugin = require("copy-webpack-plugin"); -const path = require('path'); +const path = require("path"); const rootFolder = process.cwd(); -const main = { - module: { - rules: [ - { - test: /\.node$/, - loader: 'native-ext-loader' - } - ] +module.exports = config => { + config.entry = { + ["main"]: [path.resolve(rootFolder, "src/main/index.ts")], + }; + + config.output = { + ...config.output, + path: path.resolve(rootFolder, "dist/main"), + }; + + config.module.rules = [ + ...config.module.rules, + { + test: /\.node$/, + loader: "native-ext-loader", }, - - resolve: { - modules: ['node_modules', 'react'], - extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', 'node'], - - alias: { - // Components: path.resolve(rootFolder, 'src/renderer/components'), - Middleware: path.resolve(rootFolder, 'src/middleware'), - // Store: path.resolve(rootFolder, 'src/renderer/stores'), - Const: path.resolve(rootFolder, 'src/constants'), - Main: path.resolve(rootFolder, 'src/main'), - Utils: path.resolve(rootFolder, 'src/utils') - } - }, - - - devtool: 'source-map', - - plugins: [ - new CopyWebpackPlugin({ - patterns: [ - { - from: path.join(rootFolder, 'src/package.json'), - to: path.join(rootFolder, 'dist/') - }, - { - from: path.join(rootFolder, 'resources'), - to: path.join(rootFolder, 'dist/resources/') - } - ] - }) - ] + ]; + + config.resolve.modules = ["node_modules", "react"]; + config.resolve.extensions = [".ts", ".tsx", ".js", ".jsx", ".json", "node"]; + config.resolve.alias = { + ...config.resolve.alias, + // Components: path.resolve(rootFolder, 'src/renderer/components'), + Middleware: path.resolve(rootFolder, "src/middleware"), + // Store: path.resolve(rootFolder, 'src/renderer/stores'), + Const: path.resolve(rootFolder, "src/constants"), + Main: path.resolve(rootFolder, "src/main"), + Utils: path.resolve(rootFolder, "src/utils"), + Enums: path.resolve(rootFolder, "@types/enums.ts"), + Storage: path.resolve(rootFolder, "src/main/Storage.ts"), + }; + + config.devtool = "source-map"; + + config.plugins = [ + ...config.plugins, + new CopyWebpackPlugin({ + patterns: [ + { + from: path.join(rootFolder, "src/package.json"), + to: path.join(rootFolder, "dist/"), + }, + { + from: path.join(rootFolder, "resources"), + to: path.join(rootFolder, "dist/resources/"), + }, + ], + }), + ]; + + return config; }; - -module.exports = main; diff --git a/config/webpack.config.renderer.js b/config/webpack.config.renderer.js index 2638ba68..e928ce44 100755 --- a/config/webpack.config.renderer.js +++ b/config/webpack.config.renderer.js @@ -1,49 +1,76 @@ -const HtmlWebpackPlugin = require('html-webpack-plugin'); +const HtmlWebpackPlugin = require("html-webpack-plugin"); -const path = require('path'); +const path = require("path"); const rootFolder = process.cwd(); +const resolveExtensions = [".ts", ".tsx", ".js", ".jsx", ".json", ".scss"]; +const resolveModules = ["node_modules", "react"]; -const render = { - entry: { - '../middleware/loadMainContent': path.resolve(rootFolder, 'src/middleware/loadMainContent.ts'), - '../middleware/loadContent': path.resolve(rootFolder, 'src/middleware/loadContent.ts'), - // '../middleware/webApi': path.resolve(rootFolder, 'src/middleware/webApi.ts') - }, - - module: { - noParse: /webApi/ - }, - - resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.scss'], - modules: [ - 'node_modules', - 'react' - ], - alias: { - Components: path.resolve(rootFolder, 'src/renderer/components'), - Elements: path.resolve(rootFolder, 'src/renderer/elements'), - Middleware: path.resolve(rootFolder, 'src/middleware'), - Store: path.resolve(rootFolder, 'src/renderer/stores'), - Const: path.resolve(rootFolder, 'src/constants'), - Main: path.resolve(rootFolder, 'src/main'), - Utils: path.resolve(rootFolder, 'src/utils') +module.exports = config => { + config.entry = { + ["middleware/loadMainContent"]: path.resolve(rootFolder, "src/middleware/loadMainContent.ts"), + ["middleware/loadContent"]: path.resolve(rootFolder, "src/middleware/loadContent.ts"), + ["renderer"]: [path.resolve(rootFolder, "src/renderer/index.tsx")], + }; + + config.output = { + ...config.output, + publicPath: config.mode === "development" ? "/" : "renderer", + path: path.resolve(rootFolder, "dist/renderer"), + }; + + config.module.noParse = /webApi/; + config.module.rules = config.module.rules.map(rule => { + if (Array.isArray(rule.use)) { + rule.use = rule.use.map(r => { + if (r.loader && r.loader === "css-loader") { + return { ...r, options: { ...r.options, modules: false } }; } - }, - - devtool: 'source-map', - - plugins: [ - new HtmlWebpackPlugin({ - template: path.resolve(rootFolder, 'src', 'index.html'), - filename: path.resolve(rootFolder, 'dist', 'index.html'), - excludeChunks: [ - '../middleware/loadMainContent', - '../middleware/loadContent' - ] - }) - ] -}; -module.exports = render; + return r; + }); + } + + return rule; + }); + + config.module.rules = [...config.module.rules]; + + if (config.resolve.extensions && Array.isArray(config.resolve.extensions)) { + config.resolve.extensions = [...new Set([...config.resolve.extensions, ...resolveExtensions])]; + } else { + config.resolve.extensions = resolveExtensions; + } + + if (config.resolve.modules && Array.isArray(config.resolve.modules)) { + config.resolve.modules = [...new Set([...config.resolve.modules, ...resolveModules])]; + } else { + config.resolve.modules = resolveModules; + } + + config.resolve.alias = { + ...config.resolve.alias, + Components: path.resolve(rootFolder, "src/renderer/components"), + Elements: path.resolve(rootFolder, "src/renderer/elements"), + Middleware: path.resolve(rootFolder, "src/middleware"), + Store: path.resolve(rootFolder, "src/renderer/stores"), + Const: path.resolve(rootFolder, "src/constants"), + Main: path.resolve(rootFolder, "src/main"), + Utils: path.resolve(rootFolder, "src/utils"), + Enums: path.resolve(rootFolder, "@types/enums.ts"), + Storage: path.resolve(rootFolder, "src/main/Storage.ts"), + }; + + config.devtool = "source-map"; + + config.plugins = [ + ...config.plugins, + new HtmlWebpackPlugin({ + template: path.resolve(rootFolder, "src", "index.html"), + filename: path.resolve(rootFolder, "dist", "index.html"), + excludeChunks: ["middleware/loadMainContent", "middleware/loadContent"], + }), + ]; + + return config; +}; diff --git a/images/figma-linux.jpg b/images/figma-linux.jpg deleted file mode 100644 index bcffa72f..00000000 Binary files a/images/figma-linux.jpg and /dev/null differ diff --git a/images/screenshot1.jpg b/images/screenshot1.jpg new file mode 100644 index 00000000..d6ae02cd Binary files /dev/null and b/images/screenshot1.jpg differ diff --git a/images/screenshot1.png b/images/screenshot1.png deleted file mode 100644 index 8e8e55a8..00000000 Binary files a/images/screenshot1.png and /dev/null differ diff --git a/images/screenshot2.jpg b/images/screenshot2.jpg new file mode 100644 index 00000000..1f5abfe8 Binary files /dev/null and b/images/screenshot2.jpg differ diff --git a/images/screenshot2.png b/images/screenshot2.png deleted file mode 100644 index 257a7abb..00000000 Binary files a/images/screenshot2.png and /dev/null differ diff --git a/images/screenshot3.jpg b/images/screenshot3.jpg new file mode 100644 index 00000000..2836aec6 Binary files /dev/null and b/images/screenshot3.jpg differ diff --git a/images/screenshot4.jpg b/images/screenshot4.jpg new file mode 100644 index 00000000..b8e3002f Binary files /dev/null and b/images/screenshot4.jpg differ diff --git a/images/settings.png b/images/settings.png deleted file mode 100644 index c342e51a..00000000 Binary files a/images/settings.png and /dev/null differ diff --git a/package-lock.json b/package-lock.json index fbdacabc..e858a79e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "figma-linux", - "version": "0.6.3", + "version": "0.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { "7zip": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz", + "resolved": "https://npm.kari.com/7zip/-/7zip-0.0.6.tgz", "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA=" }, "7zip-bin": { @@ -612,7 +612,7 @@ }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { @@ -630,7 +630,7 @@ }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { @@ -648,7 +648,7 @@ }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { @@ -666,7 +666,7 @@ }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { @@ -684,7 +684,7 @@ }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { @@ -693,7 +693,7 @@ }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { @@ -702,7 +702,7 @@ }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "resolved": "https://npm.kari.com/@babel%2fplugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { @@ -1150,23 +1150,6 @@ "esutils": "^2.0.2" } }, - "@babel/runtime": { - "version": "7.7.6", - "resolved": "https://npm.kari.com/@babel%2fruntime/-/runtime-7.7.6.tgz", - "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://npm.kari.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, "@babel/template": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", @@ -1280,37 +1263,19 @@ } }, "@develar/schema-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz", - "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true } } @@ -1330,77 +1295,89 @@ "progress": "^2.0.3", "sanitize-filename": "^1.6.2", "sumchecker": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, - "@malept/cross-spawn-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz", - "integrity": "sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg==", + "@electron/universal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.4.tgz", + "integrity": "sha512-ajZoumi4XwqwmZe8YVhu4XGkZBCPyWZsVCQONPTIe9TUlleSN+dic3YpXlaWcilx/HOzTdldTKtabNTeI0gDoA==", "dev": true, "requires": { - "cross-spawn": "^7.0.1" + "@malept/cross-spawn-promise": "^1.1.0", + "asar": "^3.0.3", + "debug": "^4.3.1", + "dir-compare": "^2.4.0", + "fs-extra": "^9.0.1" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ms": "2.1.2" } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true } } }, + "@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -1444,14 +1421,11 @@ } } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -1462,12 +1436,33 @@ "defer-to-connect": "^1.0.1" } }, + "@types/adm-zip": { + "version": "0.4.33", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.33.tgz", + "integrity": "sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/anymatch": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "resolved": "https://npm.kari.com/@types%2fanymatch/-/anymatch-1.3.1.tgz", "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://npm.kari.com/@types%2fcolor-name/-/color-name-1.1.1.tgz", @@ -1482,14 +1477,14 @@ }, "@types/electron-devtools-installer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz", + "resolved": "https://npm.kari.com/@types%2felectron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz", "integrity": "sha512-HJNxpaOXuykCK4rQ6FOMxAA0NLFYsf7FiPFGmab0iQmtVBHSAfxzy3MRFpLTTDDWbV0yD2YsHOQvdu8yCqtCfw==", "dev": true }, - "@types/electron-settings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/electron-settings/-/electron-settings-3.1.1.tgz", - "integrity": "sha512-wDVj8YFBuqLXgVQqZ1Yk+Qm27LjjldssnrwzDv9JanOokw24tcuJ76X1Uo5Xg9VVRIAF6HgmiAQQ+CZrRmJgYw==", + "@types/fs-extra": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz", + "integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==", "dev": true, "requires": { "@types/node": "*" @@ -1513,26 +1508,47 @@ }, "@types/html-minifier-terser": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "resolved": "https://npm.kari.com/@types%2fhtml-minifier-terser/-/html-minifier-terser-5.1.0.tgz", "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", "dev": true }, + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", + "dev": true + }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.166", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.166.tgz", + "integrity": "sha512-A3YT/c1oTlyvvW/GQqG86EyqWNrT/tisOIh2mW3YCgcx71TNjiTZA3zYZWA5BCmtsOTXjhliy4c4yEkErw6njA==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "resolved": "https://npm.kari.com/@types%2fminimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, "@types/node": { - "version": "10.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.32.tgz", - "integrity": "sha512-EUq+cjH/3KCzQHikGnNbWAGe548IFLSm93Vl8xA7EuYEEATiyOVDyEVuGkowL7c9V69FF/RiZSAOCFPApMs/ig==", + "version": "12.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.11.tgz", + "integrity": "sha512-bwVfNTFZOrGXyiQ6t4B9sZerMSShWNsGRw8tC5DY1qImUNczS9SjT4G6PnzjCnxsu5Ubj6xjL2lgwddkxtQl5w==", "dev": true }, "@types/normalize-package-data": { @@ -1543,34 +1559,44 @@ }, "@types/parse-json": { "version": "4.0.0", - "resolved": "https://npm.kari.com/@types%2fparse-json/-/parse-json-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/plist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, "@types/prop-types": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.6.tgz", - "integrity": "sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ==", + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, "@types/react": { - "version": "16.4.16", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz", - "integrity": "sha512-lxyoipLWweAnLnSsV4Ho2NAZTKKmxeYgkTQ6PaDiPDU9JJBUY2zJVVGiK1smzYv8+ZgbqEmcm5xM74GCpunSEA==", + "version": "16.14.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.2.tgz", + "integrity": "sha512-BzzcAlyDxXl2nANlabtT4thtvbbnhee8hMmH/CcJrISDBVcJS1iOsP1f0OAgSdGE0MsY9tqcrb9YoZcOFv9dbQ==", "dev": true, "requires": { "@types/prop-types": "*", - "csstype": "^2.2.0" + "csstype": "^3.0.2" } }, "@types/react-dom": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.6.tgz", - "integrity": "sha512-M+1zmwa5KxUpkCuxA4whlDJKYTGNvNQW4pIoCLH16xGbClicD9CzPry4y94kTjCCk/bJZCZ/GVqUsP7eKcO/mQ==", + "version": "16.9.10", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.10.tgz", + "integrity": "sha512-ItatOrnXDMAYpv6G8UCk2VhbYVTjZT9aorLtA/OzDN9XJ2GKcfam68jutoAcILdRjsRUO8qb7AmyObF77Q8QFw==", "dev": true, "requires": { - "@types/node": "*", - "@types/react": "*" + "@types/react": "^16" } }, "@types/react-redux": { @@ -1606,22 +1632,31 @@ }, "@types/redux": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@types/redux/-/redux-3.6.0.tgz", + "resolved": "https://npm.kari.com/@types%2fredux/-/redux-3.6.0.tgz", "integrity": "sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=", "dev": true, "requires": { "redux": "*" } }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/source-list-map": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "resolved": "https://npm.kari.com/@types%2fsource-list-map/-/source-list-map-0.1.2.tgz", "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, "@types/tapable": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "resolved": "https://npm.kari.com/@types%2ftapable/-/tapable-1.0.6.tgz", "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", "dev": true }, @@ -1634,6 +1669,19 @@ "source-map": "^0.6.1" } }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "@types/verror": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.4.tgz", + "integrity": "sha512-OjJdqx6QlbyZw9LShPwRW+Kmiegeg3eWNI41MQQKaG3vjdU2L9SRElntM51HmHBY1cu7izxQJ1lMYioQh3XMBg==", + "dev": true, + "optional": true + }, "@types/webpack": { "version": "4.41.22", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", @@ -1650,7 +1698,7 @@ }, "@types/webpack-env": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.15.2.tgz", + "resolved": "https://npm.kari.com/@types%2fwebpack-env/-/webpack-env-1.15.2.tgz", "integrity": "sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ==", "dev": true }, @@ -1673,6 +1721,21 @@ } } }, + "@types/yargs": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.1.1.tgz", @@ -2116,13 +2179,13 @@ }, "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "resolved": "https://npm.kari.com/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "resolved": "https://npm.kari.com/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { @@ -2159,6 +2222,11 @@ "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, + "adm-zip": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.1.tgz", + "integrity": "sha512-a5ABmIFUJ9OxHV5zrXM9Q41JzpRIflFtdgpL4UQM9DsTHHxQzPRaeyAdnMW7kxL0NRWm/NHafJdj6pO+ty7L2g==" + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2203,7 +2271,7 @@ }, "amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "resolved": "https://npm.kari.com/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, @@ -2252,7 +2320,7 @@ }, "ansi-colors": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "resolved": "https://npm.kari.com/ansi-colors/-/ansi-colors-3.2.4.tgz", "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, @@ -2272,13 +2340,13 @@ } }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-html": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "resolved": "https://npm.kari.com/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "dev": true }, @@ -2290,18 +2358,12 @@ }, "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "anymatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", @@ -2319,115 +2381,112 @@ } }, "app-builder-bin": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.4.tgz", - "integrity": "sha512-Xib+wgdK+8zZhbZr5pma3pNB23Y4JRY5Yt6h8peou6MTFSQzXdIkqalh/ezy9SMLuS43S4b0s7jTVAmUs8WVmA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.12.tgz", + "integrity": "sha512-lQARM2AielmFoBeIo6LZigAe+58Wwe07ZWkt+wVeDxzyieNmeWjlvz/V5dKzinydwdHd+CNswN86sww46yijjA==", "dev": true }, "app-builder-lib": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.1.0.tgz", - "integrity": "sha512-jDTfWsVS/MePO4FexqiSQcsWM9Yfr81ETIYbmVbKmW05o0dn9k1DvMOMoLb0kTLQpW+pWBVvGMAOPfk68HnBrg==", + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.10.4.tgz", + "integrity": "sha512-q7B1cr8Ry4a7o08EKShLfwsnIVf5By7YhVwcoqgEwPKxtoj1qF0kB4wyBP79rJylYi0Zj2cSkJJ/gD/ef9xhoQ==", "dev": true, "requires": { "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.1.0", + "@develar/schema-utils": "~2.6.5", + "@electron/universal": "1.0.4", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "22.1.0", - "builder-util-runtime": "8.4.0", + "builder-util": "22.10.4", + "builder-util-runtime": "8.7.3", "chromium-pickle-js": "^0.2.0", - "debug": "^4.1.1", - "ejs": "^2.7.1", - "electron-publish": "22.1.0", - "fs-extra": "^8.1.0", - "hosted-git-info": "^3.0.0", + "debug": "^4.3.1", + "ejs": "^3.1.5", + "electron-publish": "22.10.4", + "fs-extra": "^9.0.1", + "hosted-git-info": "^3.0.7", "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.2", - "js-yaml": "^3.13.1", + "isbinaryfile": "^4.0.6", + "js-yaml": "^3.14.1", "lazy-val": "^1.0.4", "minimatch": "^3.0.4", - "normalize-package-data": "^2.5.0", - "read-config-file": "5.0.0", + "normalize-package-data": "^3.0.0", + "read-config-file": "6.0.0", "sanitize-filename": "^1.6.3", - "semver": "^6.3.0", - "temp-file": "^3.3.4" + "semver": "^7.3.4", + "temp-file": "^3.3.7" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "hosted-git-info": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.2.tgz", - "integrity": "sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { - "lru-cache": "^5.1.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "isbinaryfile": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz", - "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "lru-cache": "^6.0.0" } }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "ms": { @@ -2437,29 +2496,15 @@ "dev": true }, "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "path-parse": { @@ -2469,51 +2514,60 @@ "dev": true }, "read-config-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", - "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.0.0.tgz", + "integrity": "sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA==", "dev": true, "requires": { - "dotenv": "^8.0.0", + "dotenv": "^8.2.0", "dotenv-expand": "^5.1.0", - "fs-extra": "^8.1.0", "js-yaml": "^3.13.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lazy-val": "^1.0.4" } }, "resolve": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", - "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "resolved": "https://npm.kari.com/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "resolved": "https://npm.kari.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { @@ -2555,7 +2609,7 @@ }, "argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "resolved": "https://npm.kari.com/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { @@ -2564,19 +2618,19 @@ }, "arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "resolved": "https://npm.kari.com/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "arr-flatten": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "resolved": "https://npm.kari.com/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "resolved": "https://npm.kari.com/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, @@ -2590,13 +2644,13 @@ }, "array-find-index": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "resolved": "https://npm.kari.com/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, "array-flatten": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "resolved": "https://npm.kari.com/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, @@ -2650,7 +2704,7 @@ }, "array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "resolved": "https://npm.kari.com/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { @@ -2659,19 +2713,54 @@ }, "array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "resolved": "https://npm.kari.com/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "resolved": "https://npm.kari.com/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "asar": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", + "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "asn1": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "resolved": "https://npm.kari.com/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { @@ -2727,13 +2816,13 @@ }, "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": "https://npm.kari.com/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "resolved": "https://npm.kari.com/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, @@ -2743,6 +2832,12 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -2751,31 +2846,31 @@ }, "async-exit-hook": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "resolved": "https://npm.kari.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true }, "async-foreach": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "resolved": "https://npm.kari.com/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, "async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "resolved": "https://npm.kari.com/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "resolved": "https://npm.kari.com/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "resolved": "https://npm.kari.com/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, @@ -2785,15 +2880,91 @@ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, + "awesome-typescript-loader": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-3.5.0.tgz", + "integrity": "sha512-qzgm9SEvodVkSi9QY7Me1/rujg+YBNMjayNSAyzNghwTEez++gXoPCwMvpbHRG7wrOkDCiF6dquvv9ESmUBAuw==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "enhanced-resolve": "3.3.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.4", + "micromatch": "^3.0.3", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3" + } + }, "aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "resolved": "https://npm.kari.com/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, "babel-loader": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "resolved": "https://npm.kari.com/babel-loader/-/babel-loader-8.1.0.tgz", "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dev": true, "requires": { @@ -2830,7 +3001,7 @@ }, "find-cache-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "resolved": "https://npm.kari.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { @@ -2841,7 +3012,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": "https://npm.kari.com/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -2870,7 +3041,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": "https://npm.kari.com/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -2880,7 +3051,7 @@ }, "make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "resolved": "https://npm.kari.com/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { @@ -2890,7 +3061,7 @@ }, "p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "resolved": "https://npm.kari.com/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { @@ -2899,7 +3070,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": "https://npm.kari.com/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -2908,7 +3079,7 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": "https://npm.kari.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, @@ -2920,13 +3091,13 @@ }, "pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "resolved": "https://npm.kari.com/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "resolved": "https://npm.kari.com/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { @@ -2952,9 +3123,18 @@ } } }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, "babel-plugin-component": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz", + "resolved": "https://npm.kari.com/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz", "integrity": "sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag==", "dev": true, "requires": { @@ -2963,7 +3143,7 @@ "dependencies": { "@babel/helper-module-imports": { "version": "7.0.0-beta.35", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz", + "resolved": "https://npm.kari.com/@babel%2fhelper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz", "integrity": "sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg==", "dev": true, "requires": { @@ -2973,7 +3153,7 @@ }, "@babel/types": { "version": "7.0.0-beta.35", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz", + "resolved": "https://npm.kari.com/@babel%2ftypes/-/types-7.0.0-beta.35.tgz", "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==", "dev": true, "requires": { @@ -2984,7 +3164,7 @@ }, "to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "resolved": "https://npm.kari.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true } @@ -2992,21 +3172,133 @@ }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "resolved": "https://npm.kari.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { "object.assign": "^4.1.0" } }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": "https://npm.kari.com/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "resolved": "https://npm.kari.com/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { @@ -3021,7 +3313,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -3030,7 +3322,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { @@ -3039,7 +3331,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { @@ -3048,7 +3340,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "resolved": "https://npm.kari.com/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { @@ -3067,13 +3359,13 @@ }, "batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "resolved": "https://npm.kari.com/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "resolved": "https://npm.kari.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { @@ -3092,15 +3384,66 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "block-stream": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "resolved": "https://npm.kari.com/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { "inherits": "~2.0.0" } }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "bluebird-lst": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", @@ -3108,14 +3451,6 @@ "dev": true, "requires": { "bluebird": "^3.5.5" - }, - "dependencies": { - "bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", - "dev": true - } } }, "bn.js": { @@ -3126,7 +3461,7 @@ }, "body-parser": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "resolved": "https://npm.kari.com/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { @@ -3144,13 +3479,13 @@ "dependencies": { "bytes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "resolved": "https://npm.kari.com/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -3170,7 +3505,7 @@ }, "bonjour": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "resolved": "https://npm.kari.com/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { @@ -3184,102 +3519,119 @@ }, "boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "resolved": "https://npm.kari.com/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, "boolean": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", + "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", "dev": true, "optional": true }, "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-convert": "^2.0.1" } }, - "has-flag": { + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": "https://npm.kari.com/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", @@ -3436,20 +3788,50 @@ "pako": "~1.0.5" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + }, + "dependencies": { + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + } + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "resolved": "https://npm.kari.com/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "resolved": "https://npm.kari.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, @@ -3460,66 +3842,104 @@ "dev": true }, "builder-util": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.1.0.tgz", - "integrity": "sha512-BPvpWvxQ5XOzm2WepIgmOAyo2IyaM/Bd1LJmeTYy5CtknNAtxgmAPQJfCHCikMKKQA4Obz/KYecXQiGpGJ2ThA==", + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.10.4.tgz", + "integrity": "sha512-XdcbFG3otEkNRKxW2wS1npNviCb/IrzusEQ55lMB+6YEHxBOfTbf8vnPt0pDumfwmxls9xczABU+mfqN/W4uDw==", "dev": true, "requires": { "7zip-bin": "~5.0.3", "@types/debug": "^4.1.5", - "app-builder-bin": "3.4.4", + "@types/fs-extra": "^9.0.5", + "app-builder-bin": "3.5.12", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.4.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^8.1.0", + "builder-util-runtime": "8.7.3", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "fs-extra": "^9.0.1", "is-ci": "^2.0.0", - "js-yaml": "^3.13.1", - "source-map-support": "^0.5.13", - "stat-mode": "^0.3.0", - "temp-file": "^3.3.4" + "js-yaml": "^3.14.1", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.3.7" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-name": "~1.1.4" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "ms": { @@ -3529,9 +3949,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3539,33 +3959,39 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true } } }, "builder-util-runtime": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.4.0.tgz", - "integrity": "sha512-CJB/eKfPf2vHrkmirF5eicVnbDCkMBbwd5tRYlTlgud16zFeqD7QmrVUAOEXdnsrcNkiLg9dbuUsQKtl/AwsYQ==", + "version": "8.7.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.3.tgz", + "integrity": "sha512-1Q2ReBqFblimF5g/TLg2+0M5Xzv0Ih5LxJ/BMWXvEy/e6pQKeeEpbkPMGsN6OiQgkygaZo5VXCXIjOkOQG5EoQ==", "dev": true, "requires": { - "debug": "^4.1.1", + "debug": "^4.3.2", "sax": "^1.2.4" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -3595,7 +4021,7 @@ }, "bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "resolved": "https://npm.kari.com/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, @@ -3686,7 +4112,7 @@ }, "cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "resolved": "https://npm.kari.com/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { @@ -3701,6 +4127,60 @@ "unset-value": "^1.0.0" } }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://npm.kari.com/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -3735,7 +4215,7 @@ }, "camel-case": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "resolved": "https://npm.kari.com/camel-case/-/camel-case-4.1.1.tgz", "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", "dev": true, "requires": { @@ -3751,9 +4231,15 @@ } } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://npm.kari.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -3763,7 +4249,7 @@ "dependencies": { "camelcase": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "resolved": "https://npm.kari.com/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", "dev": true } @@ -3777,7 +4263,7 @@ }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "resolved": "https://npm.kari.com/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, @@ -3785,7 +4271,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3795,14 +4280,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -3931,7 +4414,7 @@ }, "ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "resolved": "https://npm.kari.com/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, @@ -3947,7 +4430,7 @@ }, "class-utils": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "resolved": "https://npm.kari.com/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { @@ -3959,7 +4442,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -3970,7 +4453,7 @@ }, "clean-css": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "resolved": "https://npm.kari.com/clean-css/-/clean-css-4.2.3.tgz", "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { @@ -3979,14 +4462,24 @@ }, "clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "resolved": "https://npm.kari.com/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, "cli-cursor": { @@ -3998,47 +4491,87 @@ } }, "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", "dev": true }, "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://npm.kari.com/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { @@ -4091,13 +4624,13 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": "https://npm.kari.com/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "resolved": "https://npm.kari.com/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { @@ -4119,14 +4652,14 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, "combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "resolved": "https://npm.kari.com/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { @@ -4169,7 +4702,7 @@ }, "commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "resolved": "https://npm.kari.com/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, @@ -4181,7 +4714,7 @@ }, "compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "resolved": "https://npm.kari.com/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { @@ -4198,7 +4731,7 @@ }, "compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "resolved": "https://npm.kari.com/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { @@ -4213,7 +4746,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -4224,12 +4757,12 @@ }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://npm.kari.com/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "resolved": "https://npm.kari.com/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { @@ -4283,22 +4816,22 @@ } }, "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" } }, "connect-history-api-fallback": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "resolved": "https://npm.kari.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, @@ -4310,7 +4843,7 @@ }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": "https://npm.kari.com/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, @@ -4322,7 +4855,7 @@ }, "content-disposition": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "resolved": "https://npm.kari.com/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, "requires": { @@ -4331,19 +4864,19 @@ }, "content-type": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "resolved": "https://npm.kari.com/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "resolved": "https://npm.kari.com/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, "copy-concurrently": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "resolved": "https://npm.kari.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { @@ -4357,7 +4890,7 @@ }, "copy-descriptor": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "resolved": "https://npm.kari.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, @@ -4424,9 +4957,16 @@ } } }, + "core-js": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz", + "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==", + "dev": true, + "optional": true + }, "core-js-compat": { "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "resolved": "https://npm.kari.com/core-js-compat/-/core-js-compat-3.6.5.tgz", "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "dev": true, "requires": { @@ -4454,7 +4994,7 @@ }, "semver": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "resolved": "https://npm.kari.com/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true } @@ -4462,43 +5002,53 @@ }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": "https://npm.kari.com/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://npm.kari.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "dependencies": { "parse-json": { - "version": "5.0.0", - "resolved": "https://npm.kari.com/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "path-type": { "version": "4.0.0", - "resolved": "https://npm.kari.com/path-type/-/path-type-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.1.0" + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -4546,7 +5096,7 @@ }, "crocket": { "version": "0.9.11", - "resolved": "https://registry.npmjs.org/crocket/-/crocket-0.9.11.tgz", + "resolved": "https://npm.kari.com/crocket/-/crocket-0.9.11.tgz", "integrity": "sha1-KI/KEe8NPdI5tixIgmXzDI7fsMU=", "dev": true, "requires": { @@ -4554,19 +5104,51 @@ } }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "cross-unzip": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/cross-unzip/-/cross-unzip-0.0.2.tgz", + "resolved": "https://npm.kari.com/cross-unzip/-/cross-unzip-0.0.2.tgz", "integrity": "sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8=" }, "crypto-browserify": { @@ -4589,14 +5171,14 @@ } }, "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, "css-hot-loader": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/css-hot-loader/-/css-hot-loader-1.4.4.tgz", + "resolved": "https://npm.kari.com/css-hot-loader/-/css-hot-loader-1.4.4.tgz", "integrity": "sha512-J/qXHz+r7FOT92qMIJfxUk0LC9fecQNZVr0MswQ4FOpKLyOCBjofVMfc6R268bh/5ktkTShrweMr0wWqerC92g==", "dev": true, "requires": { @@ -4702,7 +5284,7 @@ }, "css-select": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "resolved": "https://npm.kari.com/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { @@ -4732,13 +5314,13 @@ }, "domelementtype": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "resolved": "https://npm.kari.com/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domutils": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "resolved": "https://npm.kari.com/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { @@ -4748,27 +5330,32 @@ } } }, + "css-vars": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/css-vars/-/css-vars-2.3.0.tgz", + "integrity": "sha512-AGvTsGrZJqyxQ15YuifOb1Bp3pjjYeawdljPxfqQpoUful+xJ4RYDlbuaAnTVoB98DLLWJ65/hIf84Ys7NbxQw==" + }, "css-what": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "resolved": "https://npm.kari.com/css-what/-/css-what-2.1.3.tgz", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, "cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "resolved": "https://npm.kari.com/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, "csstype": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz", - "integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==", "dev": true }, "currently-unhandled": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "resolved": "https://npm.kari.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { @@ -4783,19 +5370,13 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "resolved": "https://npm.kari.com/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -4815,14 +5396,15 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "resolved": "https://npm.kari.com/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decode-uri-component": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "resolved": "https://npm.kari.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress-response": { "version": "3.3.0", @@ -4835,13 +5417,13 @@ }, "dedent": { "version": "0.7.0", - "resolved": "https://npm.kari.com/dedent/-/dedent-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, "deep-equal": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "resolved": "https://npm.kari.com/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, "requires": { @@ -4866,7 +5448,7 @@ }, "default-gateway": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "resolved": "https://npm.kari.com/default-gateway/-/default-gateway-4.2.0.tgz", "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { @@ -4933,14 +5515,14 @@ } }, "defer-to-connect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.0.tgz", - "integrity": "sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, "define-properties": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "resolved": "https://npm.kari.com/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { @@ -4957,7 +5539,7 @@ }, "define-property": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { @@ -4967,7 +5549,7 @@ "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { @@ -4976,7 +5558,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { @@ -4985,7 +5567,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "resolved": "https://npm.kari.com/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { @@ -4998,7 +5580,7 @@ }, "del": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "resolved": "https://npm.kari.com/del/-/del-4.1.1.tgz", "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { @@ -5013,7 +5595,7 @@ "dependencies": { "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "resolved": "https://npm.kari.com/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { @@ -5026,7 +5608,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://npm.kari.com/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -5040,7 +5622,7 @@ }, "pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "resolved": "https://npm.kari.com/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, @@ -5073,19 +5655,19 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "https://npm.kari.com/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": "https://npm.kari.com/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "resolved": "https://npm.kari.com/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, @@ -5101,13 +5683,13 @@ }, "destroy": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "resolved": "https://npm.kari.com/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, "detect-file": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "resolved": "https://npm.kari.com/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, @@ -5119,7 +5701,7 @@ }, "detect-node": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "resolved": "https://npm.kari.com/detect-node/-/detect-node-2.0.4.tgz", "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, @@ -5142,6 +5724,29 @@ } } }, + "dir-compare": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", + "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", + "dev": true, + "requires": { + "buffer-equal": "1.0.0", + "colors": "1.0.3", + "commander": "2.9.0", + "minimatch": "3.0.4" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5160,283 +5765,109 @@ } }, "dmg-builder": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz", - "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==", + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.10.4.tgz", + "integrity": "sha512-+28HZgKAuyCQnQwLSAwkHUqtMB/egHF5ACUABCB4Nev02/ZfjFPUTF/WloTaEbue34zLLUGxPXh+BJF8Xw26ow==", "dev": true, "requires": { - "app-builder-lib": "~21.2.0", - "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "fs-extra": "^8.1.0", - "iconv-lite": "^0.5.0", - "js-yaml": "^3.13.1", - "sanitize-filename": "^1.6.2" + "app-builder-lib": "22.10.4", + "builder-util": "22.10.4", + "dmg-license": "^1.0.8", + "fs-extra": "^9.0.1", + "iconv-lite": "^0.6.2", + "js-yaml": "^3.14.1", + "sanitize-filename": "^1.6.3" }, "dependencies": { - "app-builder-bin": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz", - "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==", - "dev": true - }, - "app-builder-lib": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz", - "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.1.0", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "21.2.0", - "builder-util-runtime": "8.3.0", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.1.1", - "ejs": "^2.6.2", - "electron-publish": "21.2.0", - "fs-extra": "^8.1.0", - "hosted-git-info": "^2.7.1", - "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.2", - "js-yaml": "^3.13.1", - "lazy-val": "^1.0.4", - "minimatch": "^3.0.4", - "normalize-package-data": "^2.5.0", - "read-config-file": "5.0.0", - "sanitize-filename": "^1.6.2", - "semver": "^6.3.0", - "temp-file": "^3.3.4" - } - }, - "builder-util": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz", - "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@types/debug": "^4.1.4", - "app-builder-bin": "3.4.3", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.3.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^8.1.0", - "is-ci": "^2.0.0", - "js-yaml": "^3.13.1", - "source-map-support": "^0.5.13", - "stat-mode": "^0.3.0", - "temp-file": "^3.3.4" - } - }, - "builder-util-runtime": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", - "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "sax": "^1.2.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron-publish": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz", - "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { - "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "builder-util-runtime": "8.3.0", - "chalk": "^2.4.2", - "fs-extra": "^8.1.0", - "lazy-val": "^1.0.4", - "mime": "^2.4.4" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "isbinaryfile": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz", - "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true - }, - "read-config-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", - "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", - "dev": true, - "requires": { - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0", - "fs-extra": "^8.1.0", - "js-yaml": "^3.13.1", - "json5": "^2.1.0", - "lazy-val": "^1.0.4" - } - }, - "resolve": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", - "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + } + } + }, + "dmg-license": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.8.tgz", + "integrity": "sha512-47GOb6b4yVzpovXC34heXElpH++ICg9GuWBeOTaokUNLAoAdWpE4VehudYEEtu96j2jXsgQWYf78nW7r+0Y3eg==", + "dev": true, + "optional": true, + "requires": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "cli-truncate": "^1.1.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.5", + "plist": "^3.0.1", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "dependencies": { + "cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "optional": true } } }, "dns-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "resolved": "https://npm.kari.com/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", "dev": true }, "dns-packet": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "resolved": "https://npm.kari.com/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { @@ -5446,7 +5877,7 @@ }, "dns-txt": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "resolved": "https://npm.kari.com/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { @@ -5464,7 +5895,7 @@ }, "dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "resolved": "https://npm.kari.com/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { @@ -5516,7 +5947,7 @@ }, "dot-case": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "resolved": "https://npm.kari.com/dot-case/-/dot-case-3.0.3.tgz", "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", "dev": true, "requires": { @@ -5533,23 +5964,23 @@ } }, "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" } }, "dotenv": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "resolved": "https://npm.kari.com/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "dev": true }, "dotenv-expand": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "resolved": "https://npm.kari.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, @@ -5605,7 +6036,7 @@ }, "ecc-jsbn": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "resolved": "https://npm.kari.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { @@ -5615,14 +6046,23 @@ }, "ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "resolved": "https://npm.kari.com/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, "electron": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-7.3.3.tgz", - "integrity": "sha512-PrJEsuRiaAhTDHtbH3EM+RIne+nZ6ifGChUadmtmPqHUQ+rIhf4jSi2ZN768IgBDw4SidMJiCrvQRiuDha9+Ew==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-11.1.1.tgz", + "integrity": "sha512-tlbex3xosJgfileN6BAQRotevPRXB/wQIq48QeQ08tUJJrXwE72c8smsM/hbHx5eDgnbfJ2G3a60PmRjHU2NhA==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -5630,17 +6070,32 @@ "extract-zip": "^1.0.3" }, "dependencies": { - "@types/node": { - "version": "12.12.58", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.58.tgz", - "integrity": "sha512-Be46CNIHWAagEfINOjmriSxuv7IVcqbGe+sDSg2SYCEz/0CRBy7LRASGfRbD8KZkqoePU73Wsx3UvOSFcq/9hA==", - "dev": true + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } } } }, "electron-build-env": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/electron-build-env/-/electron-build-env-0.2.0.tgz", + "resolved": "https://npm.kari.com/electron-build-env/-/electron-build-env-0.2.0.tgz", "integrity": "sha1-VknuPl/QBuJnCGyqlFt3ofoiC5I=", "requires": { "commander": "^2.9.0", @@ -5648,258 +6103,215 @@ } }, "electron-builder": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.1.0.tgz", - "integrity": "sha512-uu2W9BLG38D0i2PG6dHupmOYc+q/TRL+Ztf8xitqK+2Quq33PFbeN0ipfySuVEDg4I6whDRBOgxBEWwnUYqZZQ==", + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.10.4.tgz", + "integrity": "sha512-V+JtiizJd3kt24TT+0OHG7+oPAzjhhjmQVn9G6OC2WE7VBJxrDuD6lMVRgo6WlU8uvDCh7fTRUsdh0Tnu0GeQA==", "dev": true, "requires": { - "app-builder-lib": "22.1.0", + "@types/yargs": "^15.0.12", + "app-builder-lib": "22.10.4", "bluebird-lst": "^1.0.9", - "builder-util": "22.1.0", - "builder-util-runtime": "8.4.0", - "chalk": "^2.4.2", - "dmg-builder": "21.2.0", - "fs-extra": "^8.1.0", + "builder-util": "22.10.4", + "builder-util-runtime": "8.7.3", + "chalk": "^4.1.0", + "dmg-builder": "22.10.4", + "fs-extra": "^9.0.1", "is-ci": "^2.0.0", "lazy-val": "^1.0.4", - "read-config-file": "5.0.0", + "read-config-file": "6.0.0", "sanitize-filename": "^1.6.3", - "update-notifier": "^3.0.1", - "yargs": "^14.0.0" + "update-notifier": "^5.0.1", + "yargs": "^16.2.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "color-name": "~1.1.4" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "locate-path": { + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "p-try": "^2.0.0" + "minimist": "^1.2.5" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "read-config-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", - "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.0.0.tgz", + "integrity": "sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA==", "dev": true, "requires": { - "dotenv": "^8.0.0", + "dotenv": "^8.2.0", "dotenv-expand": "^5.1.0", - "fs-extra": "^8.1.0", "js-yaml": "^3.13.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lazy-val": "^1.0.4" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true }, "yargs": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", - "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.0" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "electron-devtools-installer": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz", + "resolved": "https://npm.kari.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz", "integrity": "sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA==", "requires": { "7zip": "0.0.6", @@ -5909,64 +6321,118 @@ } }, "electron-publish": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.1.0.tgz", - "integrity": "sha512-jHjMCaL2dFU+iOq8wW568F59+DW1jFJGT3vc2xqm9iXyZ8gWlQ+NVve4bq9HZG7m4iNqWbGw9StmZcOzmIBxMQ==", + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.10.4.tgz", + "integrity": "sha512-cjVM0+9DQoV4TWfH8lVWoelJ89O2i5yDARVp5GCMHrB43XEU0Nr5eKYysgsbOSnZk5W8z1vfGpFWHj+AeAEDYg==", "dev": true, "requires": { + "@types/fs-extra": "^9.0.5", "bluebird-lst": "^1.0.9", - "builder-util": "~22.1.0", - "builder-util-runtime": "8.4.0", - "chalk": "^2.4.2", - "fs-extra": "^8.1.0", + "builder-util": "22.10.4", + "builder-util-runtime": "8.7.3", + "chalk": "^4.1.0", + "fs-extra": "^9.0.1", "lazy-val": "^1.0.4", - "mime": "^2.4.4" + "mime": "^2.4.7" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true } } }, "electron-rebuild": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-2.0.3.tgz", - "integrity": "sha512-I8Oeey9afU+trFLd8/qRRiHC083CCoBnmw3q0qQaRFsg0OzMaeJQn7Nl6EYKPpntuQ/3yOqZQ7b3ObNuETN/Ig==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-2.3.4.tgz", + "integrity": "sha512-EHr1bkqXTN/jQJuh2/IunF9QGa9yOgpE9KdQ9A7VHshd7ycWvoXjWzaXaimfa1nu1l7vKqLLu7N2COe3Jn9NuA==", "dev": true, "requires": { "@malept/cross-spawn-promise": "^1.1.0", @@ -5974,22 +6440,55 @@ "debug": "^4.1.1", "detect-libc": "^1.0.3", "fs-extra": "^9.0.1", - "node-abi": "^2.19.1", + "got": "^11.7.0", + "lzma-native": "^6.0.1", + "node-abi": "^2.19.2", "node-gyp": "^7.1.0", "ora": "^5.1.0", + "tar": "^6.0.5", "yargs": "^16.0.0" }, "dependencies": { + "@sindresorhus/is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "cliui": { + "cacheable-request": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", - "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -5997,12 +6496,39 @@ "wrap-ansi": "^7.0.0" } }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", @@ -6029,6 +6555,25 @@ "path-is-absolute": "^1.0.0" } }, + "got": { + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.1.tgz", + "integrity": "sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -6041,16 +6586,60 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" } }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6058,47 +6647,70 @@ "dev": true }, "node-gyp": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.0.tgz", - "integrity": "sha512-rjlHQlnl1dqiDZxZYiKqQdrjias7V+81OVR5PTzZioCBtWkNdrKy06M05HLKxy/pcKikKRCabeDRoZaEc6nIjw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.3", - "nopt": "^4.0.3", + "nopt": "^5.0.0", "npmlog": "^4.1.2", "request": "^2.88.2", - "rimraf": "^2.6.3", + "rimraf": "^3.0.2", "semver": "^7.3.2", - "tar": "^6.0.1", + "tar": "^6.0.2", "which": "^2.0.2" } }, "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" + } + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" } }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "string-width": { "version": "4.2.0", @@ -6150,9 +6762,9 @@ } }, "y18n": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz", - "integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yallist": { @@ -6162,40 +6774,45 @@ "dev": true }, "yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^7.0.0", - "escalade": "^3.0.2", + "cliui": "^7.0.2", + "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", - "y18n": "^5.0.1", - "yargs-parser": "^20.0.0" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "electron-settings": { - "version": "github:ChugunovRoman/electron-settings#6c21cf88e927607d8e5d2f3840980a4cc57cd426", - "from": "github:ChugunovRoman/electron-settings#figma-linux", - "requires": { - "clone": "^2.1.1", - "jsonfile": "^4.0.0" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-4.0.2.tgz", + "integrity": "sha512-WnUlrnBsO784oXcag0ym+A3ySoIwonz5GhYFsWroMHVzslzmsP+81f/Fof41T9UrRUxuPPKiZPZMwGO+yvWChg==", + "requires": { + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.set": "^4.3.2", + "lodash.unset": "^4.5.2", + "mkdirp": "^1.0.4", + "write-file-atomic": "^3.0.3" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" } } }, "electron-webpack": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/electron-webpack/-/electron-webpack-2.8.2.tgz", + "resolved": "https://npm.kari.com/electron-webpack/-/electron-webpack-2.8.2.tgz", "integrity": "sha512-rR7hxoOlZIcJf6R08mVl/4TBtFY+HW6sv4Z28TdMWETvcM4ZBIBdGNGylxF0gNwB8gkTgo8UkkDbXGX48K4Vow==", "dev": true, "requires": { @@ -6244,13 +6861,13 @@ }, "ansi-regex": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "resolved": "https://npm.kari.com/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { @@ -6272,13 +6889,13 @@ }, "camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "resolved": "https://npm.kari.com/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "resolved": "https://npm.kari.com/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { @@ -6288,7 +6905,7 @@ }, "cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "resolved": "https://npm.kari.com/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { @@ -6299,7 +6916,7 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://npm.kari.com/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -6308,7 +6925,7 @@ }, "color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, @@ -6335,7 +6952,7 @@ }, "css-loader": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "resolved": "https://npm.kari.com/css-loader/-/css-loader-3.6.0.tgz", "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "dev": true, "requires": { @@ -6356,7 +6973,7 @@ "dependencies": { "semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "resolved": "https://npm.kari.com/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } @@ -6370,7 +6987,7 @@ }, "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -6405,7 +7022,7 @@ }, "fs-extra": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "resolved": "https://npm.kari.com/fs-extra/-/fs-extra-9.0.1.tgz", "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { @@ -6449,13 +7066,13 @@ }, "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://npm.kari.com/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "icss-utils": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "resolved": "https://npm.kari.com/icss-utils/-/icss-utils-4.1.1.tgz", "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { @@ -6474,7 +7091,7 @@ }, "interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "resolved": "https://npm.kari.com/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, @@ -6501,7 +7118,7 @@ }, "jsonfile": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "resolved": "https://npm.kari.com/jsonfile/-/jsonfile-6.0.1.tgz", "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { @@ -6532,7 +7149,7 @@ }, "memory-fs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "resolved": "https://npm.kari.com/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { @@ -6542,7 +7159,7 @@ }, "mini-css-extract-plugin": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "resolved": "https://npm.kari.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "dev": true, "requires": { @@ -6554,7 +7171,7 @@ "dependencies": { "schema-utils": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "resolved": "https://npm.kari.com/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { @@ -6567,7 +7184,7 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, @@ -6585,7 +7202,7 @@ }, "p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "resolved": "https://npm.kari.com/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { @@ -6603,7 +7220,7 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": "https://npm.kari.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, @@ -6624,7 +7241,7 @@ }, "postcss": { "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "resolved": "https://npm.kari.com/postcss/-/postcss-7.0.32.tgz", "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { @@ -6635,7 +7252,7 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -6644,7 +7261,7 @@ }, "chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://npm.kari.com/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { @@ -6655,7 +7272,7 @@ "dependencies": { "supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "resolved": "https://npm.kari.com/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { @@ -6666,7 +7283,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "https://npm.kari.com/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -6675,19 +7292,19 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://npm.kari.com/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "resolved": "https://npm.kari.com/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { @@ -6698,7 +7315,7 @@ }, "postcss-modules-extract-imports": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "resolved": "https://npm.kari.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dev": true, "requires": { @@ -6719,7 +7336,7 @@ }, "postcss-modules-scope": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "resolved": "https://npm.kari.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { @@ -6729,7 +7346,7 @@ }, "postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "resolved": "https://npm.kari.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { @@ -6739,7 +7356,7 @@ }, "postcss-selector-parser": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "resolved": "https://npm.kari.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { @@ -6750,7 +7367,7 @@ }, "postcss-value-parser": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "resolved": "https://npm.kari.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, @@ -6788,7 +7405,7 @@ }, "semver": { "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "resolved": "https://npm.kari.com/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, @@ -6804,7 +7421,7 @@ }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": "https://npm.kari.com/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -6824,7 +7441,7 @@ }, "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -6833,7 +7450,7 @@ }, "style-loader": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "resolved": "https://npm.kari.com/style-loader/-/style-loader-1.2.1.tgz", "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", "dev": true, "requires": { @@ -6852,7 +7469,7 @@ }, "loader-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "resolved": "https://npm.kari.com/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { @@ -6874,25 +7491,25 @@ }, "tapable": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "resolved": "https://npm.kari.com/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, "universalify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "resolved": "https://npm.kari.com/universalify/-/universalify-1.0.0.tgz", "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "v8-compile-cache": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "resolved": "https://npm.kari.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "webpack-cli": { "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "resolved": "https://npm.kari.com/webpack-cli/-/webpack-cli-3.3.12.tgz", "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { @@ -6911,7 +7528,7 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -6920,7 +7537,7 @@ }, "chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://npm.kari.com/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { @@ -6931,7 +7548,7 @@ "dependencies": { "supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "resolved": "https://npm.kari.com/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { @@ -6942,7 +7559,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "https://npm.kari.com/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -6951,19 +7568,19 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://npm.kari.com/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "resolved": "https://npm.kari.com/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { @@ -6972,7 +7589,7 @@ }, "yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "resolved": "https://npm.kari.com/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { @@ -6992,7 +7609,7 @@ }, "wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "resolved": "https://npm.kari.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { @@ -7003,7 +7620,7 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -7012,7 +7629,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "https://npm.kari.com/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -7021,7 +7638,7 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true } @@ -7029,7 +7646,7 @@ }, "yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "resolved": "https://npm.kari.com/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { @@ -7041,7 +7658,7 @@ }, "electron-webpack-js": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/electron-webpack-js/-/electron-webpack-js-2.4.1.tgz", + "resolved": "https://npm.kari.com/electron-webpack-js/-/electron-webpack-js-2.4.1.tgz", "integrity": "sha512-NPbcI4nnuclkLEKmwRI8sui2GNe37NKm0pCQR6KZA7YSV3KQdH4I7wOgIZ2AkeCpyeUHrBSMGQY+VqhPD7OtMA==", "dev": true, "requires": { @@ -7052,12 +7669,6 @@ "babel-plugin-component": "^1.1.1" } }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "elliptic": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", @@ -7083,7 +7694,7 @@ }, "emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "resolved": "https://npm.kari.com/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, @@ -7095,7 +7706,7 @@ }, "encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "resolved": "https://npm.kari.com/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, @@ -7108,6 +7719,35 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.5" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, "entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -7122,7 +7762,7 @@ }, "errno": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "resolved": "https://npm.kari.com/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { @@ -7131,7 +7771,7 @@ }, "error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "resolved": "https://npm.kari.com/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { @@ -7182,7 +7822,7 @@ }, "es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "resolved": "https://npm.kari.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { @@ -7204,15 +7844,21 @@ "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", "dev": true }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://npm.kari.com/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": "https://npm.kari.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { @@ -7797,6 +8443,12 @@ } } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "esquery": { "version": "1.0.1", "resolved": "https://npm.kari.com/esquery/-/esquery-1.0.1.tgz", @@ -7808,7 +8460,7 @@ }, "esrecurse": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "resolved": "https://npm.kari.com/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { @@ -7829,7 +8481,7 @@ }, "etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "resolved": "https://npm.kari.com/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, @@ -7847,7 +8499,7 @@ }, "eventsource": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "resolved": "https://npm.kari.com/eventsource/-/eventsource-1.0.7.tgz", "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { @@ -7865,23 +8517,63 @@ } }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + } } }, "expand-brackets": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "resolved": "https://npm.kari.com/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { @@ -7896,7 +8588,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -7905,7 +8597,7 @@ }, "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -7914,7 +8606,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://npm.kari.com/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -7925,7 +8617,7 @@ }, "expand-tilde": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "resolved": "https://npm.kari.com/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { @@ -7934,7 +8626,7 @@ }, "express": { "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "resolved": "https://npm.kari.com/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { @@ -7972,19 +8664,19 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "https://npm.kari.com/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, "cookie": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "resolved": "https://npm.kari.com/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -7995,13 +8687,13 @@ }, "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "resolved": "https://npm.kari.com/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "resolved": "https://npm.kari.com/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { @@ -8011,7 +8703,7 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "resolved": "https://npm.kari.com/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { @@ -8032,7 +8724,7 @@ }, "extglob": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "resolved": "https://npm.kari.com/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { @@ -8048,7 +8740,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -8057,7 +8749,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://npm.kari.com/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -8066,7 +8758,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { @@ -8075,7 +8767,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { @@ -8084,7 +8776,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "resolved": "https://npm.kari.com/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { @@ -8095,32 +8787,9 @@ } } }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "resolved": "https://npm.kari.com/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, @@ -8242,7 +8911,7 @@ }, "faye-websocket": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "resolved": "https://npm.kari.com/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { @@ -8260,7 +8929,7 @@ }, "figgy-pudding": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "resolved": "https://npm.kari.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, @@ -8356,6 +9025,15 @@ } } }, + "filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -8381,7 +9059,7 @@ }, "finalhandler": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "resolved": "https://npm.kari.com/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { @@ -8396,7 +9074,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -8464,7 +9142,7 @@ }, "findup-sync": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "resolved": "https://npm.kari.com/findup-sync/-/findup-sync-3.0.0.tgz", "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { @@ -8566,19 +9244,19 @@ }, "for-in": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "resolved": "https://npm.kari.com/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "resolved": "https://npm.kari.com/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "resolved": "https://npm.kari.com/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { @@ -8589,13 +9267,13 @@ }, "forwarded": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "resolved": "https://npm.kari.com/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, "fragment-cache": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "resolved": "https://npm.kari.com/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { @@ -8604,13 +9282,13 @@ }, "fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "resolved": "https://npm.kari.com/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, "from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "resolved": "https://npm.kari.com/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { @@ -8652,7 +9330,7 @@ }, "fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "resolved": "https://npm.kari.com/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { @@ -8680,7 +9358,7 @@ }, "fs-write-stream-atomic": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "resolved": "https://npm.kari.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { @@ -8692,12 +9370,12 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "https://npm.kari.com/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "resolved": "https://npm.kari.com/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dev": true, "requires": { @@ -8709,7 +9387,7 @@ }, "function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "resolved": "https://npm.kari.com/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, @@ -8721,7 +9399,7 @@ }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": "https://npm.kari.com/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { @@ -8737,7 +9415,7 @@ }, "gaze": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "resolved": "https://npm.kari.com/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { @@ -8746,7 +9424,7 @@ }, "gensync": { "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "resolved": "https://npm.kari.com/gensync/-/gensync-1.0.0-beta.1.tgz", "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, @@ -8758,7 +9436,7 @@ }, "get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://npm.kari.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, @@ -8769,20 +9447,35 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } }, "get-value": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "resolved": "https://npm.kari.com/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "resolved": "https://npm.kari.com/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { @@ -8812,7 +9505,7 @@ }, "glob-parent": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "resolved": "https://npm.kari.com/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { @@ -8846,29 +9539,50 @@ "serialize-error": "^7.0.1" }, "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "yallist": "^4.0.0" + } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "optional": true } } }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "dev": true, "requires": { - "ini": "^1.3.4" + "ini": "1.3.7" + }, + "dependencies": { + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + } } }, "global-modules": { @@ -8884,7 +9598,7 @@ }, "global-prefix": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "resolved": "https://npm.kari.com/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { @@ -8908,6 +9622,12 @@ "tunnel": "^0.0.6" } }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, "globalthis": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", @@ -8970,44 +9690,6 @@ "url-parse-lax": "^3.0.0" }, "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -9017,30 +9699,6 @@ "pump": "^3.0.0" } }, - "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -9050,26 +9708,24 @@ "end-of-stream": "^1.1.0", "once": "^1.3.1" } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } } } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true }, "handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "resolved": "https://npm.kari.com/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, @@ -9085,11 +9741,6 @@ "wordwrap": "^1.0.0" }, "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -9099,7 +9750,7 @@ }, "har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "resolved": "https://npm.kari.com/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, @@ -9115,7 +9766,7 @@ }, "has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "resolved": "https://npm.kari.com/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { @@ -9124,7 +9775,7 @@ }, "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "resolved": "https://npm.kari.com/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { @@ -9145,13 +9796,13 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "resolved": "https://npm.kari.com/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "resolved": "https://npm.kari.com/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { @@ -9162,7 +9813,7 @@ }, "has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "resolved": "https://npm.kari.com/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { @@ -9172,7 +9823,7 @@ "dependencies": { "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { @@ -9244,32 +9895,10 @@ }, "he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "resolved": "https://npm.kari.com/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", - "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -9281,11 +9910,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -9303,7 +9927,7 @@ }, "hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "resolved": "https://npm.kari.com/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { @@ -9347,7 +9971,7 @@ }, "html-entities": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "resolved": "https://npm.kari.com/html-entities/-/html-entities-1.3.1.tgz", "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", "dev": true }, @@ -9512,15 +10136,21 @@ "entities": "^2.0.0" } }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, "http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "resolved": "https://npm.kari.com/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, "http-errors": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "resolved": "https://npm.kari.com/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { @@ -9533,7 +10163,7 @@ }, "http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "resolved": "https://npm.kari.com/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { @@ -9544,7 +10174,7 @@ }, "http-proxy-middleware": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "resolved": "https://npm.kari.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { @@ -9556,7 +10186,7 @@ }, "http-signature": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "resolved": "https://npm.kari.com/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { @@ -9565,6 +10195,16 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -9573,7 +10213,7 @@ }, "human-signals": { "version": "1.1.1", - "resolved": "https://npm.kari.com/human-signals/-/human-signals-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, @@ -9848,10 +10488,20 @@ } } }, + "iconv-corefoundation": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.5.tgz", + "integrity": "sha512-hI4m7udfV04OcjleOmDaR4gwXnH4xumxN+ZmywHDiKf2CmAzsT9SVYe7Y4pdnQbyZfXwAQyrElykbE5PrPRfmQ==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^1.6.3" + } + }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -9873,7 +10523,7 @@ }, "iferr": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "resolved": "https://npm.kari.com/iferr/-/iferr-0.1.5.tgz", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, @@ -9883,6 +10533,15 @@ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "import-fresh": { "version": "3.2.1", "resolved": "https://npm.kari.com/import-fresh/-/import-fresh-3.2.1.tgz", @@ -9909,7 +10568,7 @@ }, "import-local": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "resolved": "https://npm.kari.com/import-local/-/import-local-2.0.0.tgz", "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { @@ -9919,7 +10578,7 @@ "dependencies": { "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": "https://npm.kari.com/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -9928,7 +10587,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": "https://npm.kari.com/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -9947,7 +10606,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": "https://npm.kari.com/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -9956,7 +10615,7 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": "https://npm.kari.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, @@ -9968,7 +10627,7 @@ }, "pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "resolved": "https://npm.kari.com/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { @@ -9979,13 +10638,12 @@ }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "resolved": "https://npm.kari.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "resolved": "https://npm.kari.com/in-publish/-/in-publish-2.0.1.tgz", "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", "dev": true }, @@ -10000,19 +10658,19 @@ }, "indexes-of": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "resolved": "https://npm.kari.com/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, "infer-owner": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "resolved": "https://npm.kari.com/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": "https://npm.kari.com/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -10026,7 +10684,7 @@ }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "resolved": "https://npm.kari.com/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, @@ -10035,51 +10693,102 @@ "resolved": "https://registry.npmjs.org/iniparser/-/iniparser-1.0.5.tgz", "integrity": "sha1-g21r7+bfv87gvM8c+fKsxwJ/eD0=" }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invariant": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://npm.kari.com/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "resolved": "https://npm.kari.com/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { "loose-envify": "^1.0.0" } }, "ip": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "resolved": "https://npm.kari.com/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, "ip-regex": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "resolved": "https://npm.kari.com/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, "ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "resolved": "https://npm.kari.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://npm.kari.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -10088,7 +10797,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -10099,13 +10808,13 @@ }, "is-arguments": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "resolved": "https://npm.kari.com/is-arguments/-/is-arguments-1.0.4.tgz", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, "is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "resolved": "https://npm.kari.com/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, @@ -10120,7 +10829,7 @@ }, "is-buffer": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "resolved": "https://npm.kari.com/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, @@ -10148,9 +10857,18 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://npm.kari.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -10159,7 +10877,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -10176,7 +10894,7 @@ }, "is-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "resolved": "https://npm.kari.com/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { @@ -10187,7 +10905,7 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } @@ -10201,13 +10919,13 @@ }, "is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "resolved": "https://npm.kari.com/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://npm.kari.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { @@ -10238,13 +10956,13 @@ } }, "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "dev": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, "is-interactive": { @@ -10254,9 +10972,9 @@ "dev": true }, "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { @@ -10280,29 +10998,20 @@ } }, "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - } - }, "is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "resolved": "https://npm.kari.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, "is-path-in-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "resolved": "https://npm.kari.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { @@ -10311,7 +11020,7 @@ "dependencies": { "is-path-inside": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "resolved": "https://npm.kari.com/is-path-inside/-/is-path-inside-2.1.0.tgz", "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { @@ -10321,23 +11030,20 @@ } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true }, "is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "resolved": "https://npm.kari.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, "is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "resolved": "https://npm.kari.com/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { @@ -10346,7 +11052,7 @@ }, "is-promise": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "resolved": "https://npm.kari.com/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-regex": { @@ -10360,13 +11066,13 @@ }, "is-regexp": { "version": "1.0.0", - "resolved": "https://npm.kari.com/is-regexp/-/is-regexp-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": "https://npm.kari.com/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, @@ -10381,25 +11087,24 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "resolved": "https://npm.kari.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "resolved": "https://npm.kari.com/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "resolved": "https://npm.kari.com/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "resolved": "https://npm.kari.com/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, @@ -10412,29 +11117,76 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://npm.kari.com/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "resolved": "https://npm.kari.com/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "resolved": "https://npm.kari.com/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-worker": { "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "resolved": "https://npm.kari.com/jest-worker/-/jest-worker-25.5.0.tgz", "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { @@ -10444,7 +11196,7 @@ "dependencies": { "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://npm.kari.com/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, @@ -10467,18 +11219,28 @@ }, "js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "resolved": "https://npm.kari.com/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "resolved": "https://npm.kari.com/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://npm.kari.com/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, @@ -10490,19 +11252,25 @@ }, "json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "resolved": "https://npm.kari.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "resolved": "https://npm.kari.com/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://npm.kari.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, @@ -10514,13 +11282,13 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": "https://npm.kari.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "json3": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "resolved": "https://npm.kari.com/json3/-/json3-3.3.3.tgz", "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", "dev": true }, @@ -10532,15 +11300,16 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "resolved": "https://npm.kari.com/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, "jsprim": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "resolved": "https://npm.kari.com/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { @@ -10561,9 +11330,9 @@ } }, "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { "json-buffer": "3.0.0" @@ -10571,13 +11340,13 @@ }, "killable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "resolved": "https://npm.kari.com/killable/-/killable-1.0.1.tgz", "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, "kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, @@ -10598,19 +11367,19 @@ }, "lazy-val": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", + "resolved": "https://npm.kari.com/lazy-val/-/lazy-val-1.0.4.tgz", "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", "dev": true }, "leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "resolved": "https://npm.kari.com/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levenary": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "resolved": "https://npm.kari.com/levenary/-/levenary-1.1.1.tgz", "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "dev": true, "requires": { @@ -10634,44 +11403,40 @@ "dev": true }, "lint-staged": { - "version": "10.0.0-beta.7", - "resolved": "https://npm.kari.com/lint-staged/-/lint-staged-10.0.0-beta.7.tgz", - "integrity": "sha512-YfuR1+uOt56hPAZ1gIPglzzP6zUV5A94LsFKbq4C9nFdTsNGetNFdET1opUYhWsBY/aYUfcmf1YEYH/+1R9bIA==", + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz", + "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==", "dev": true, "requires": { - "chalk": "^3.0.0", - "commander": "^4.0.1", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", "dedent": "^0.7.0", - "execa": "^3.4.0", - "listr": "^0.14.3", - "log-symbols": "^3.0.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", "stringify-object": "^3.3.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { - "version": "4.2.0", - "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-4.2.0.tgz", - "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "braces": { "version": "3.0.2", - "resolved": "https://npm.kari.com/braces/-/braces-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { @@ -10679,9 +11444,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10690,7 +11455,7 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://npm.kari.com/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -10699,337 +11464,43 @@ }, "color-name": { "version": "1.1.4", - "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "commander": { - "version": "4.0.1", - "resolved": "https://npm.kari.com/commander/-/commander-4.0.1.tgz", - "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://npm.kari.com/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "debug": { - "version": "4.1.1", - "resolved": "https://npm.kari.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://npm.kari.com/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://npm.kari.com/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "ms": "2.1.2" } }, "fill-range": { "version": "7.0.1", - "resolved": "https://npm.kari.com/fill-range/-/fill-range-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://npm.kari.com/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://npm.kari.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://npm.kari.com/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://npm.kari.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, "is-number": { "version": "7.0.0", - "resolved": "https://npm.kari.com/is-number/-/is-number-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://npm.kari.com/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "listr": { - "version": "0.14.3", - "resolved": "https://npm.kari.com/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://npm.kari.com/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - } - } - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://npm.kari.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://npm.kari.com/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://npm.kari.com/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://npm.kari.com/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://npm.kari.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://npm.kari.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://npm.kari.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://npm.kari.com/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://npm.kari.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://npm.kari.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://npm.kari.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://npm.kari.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://npm.kari.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://npm.kari.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://npm.kari.com/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - } - }, "micromatch": { "version": "4.0.2", - "resolved": "https://npm.kari.com/micromatch/-/micromatch-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { @@ -11037,174 +11508,111 @@ "picomatch": "^2.0.5" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://npm.kari.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "ms": { "version": "2.1.2", - "resolved": "https://npm.kari.com/ms/-/ms-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.0", - "resolved": "https://npm.kari.com/npm-run-path/-/npm-run-path-4.0.0.tgz", - "integrity": "sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "path-key": "^3.0.0" + "has-flag": "^4.0.0" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://npm.kari.com/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "is-number": "^7.0.0" } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://npm.kari.com/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://npm.kari.com/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://npm.kari.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + } + } + }, + "listr2": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz", + "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.3", + "through": "^2.3.8" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "color-convert": "^2.0.1" } }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://npm.kari.com/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "tslib": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://npm.kari.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "color-name": "~1.1.4" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://npm.kari.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://npm.kari.com/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://npm.kari.com/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://npm.kari.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "is-number": "^7.0.0" + "escape-string-regexp": "^1.0.5" } }, - "which": { - "version": "2.0.2", - "resolved": "https://npm.kari.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://npm.kari.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "has-flag": "^4.0.0" } } } }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://npm.kari.com/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -11252,11 +11660,31 @@ "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" + }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.unset": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz", + "integrity": "sha1-Nw0dPoW3Kn4bDN8tJyEhMG8j5O0=" + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -11267,12 +11695,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -11300,6 +11727,168 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, @@ -11311,7 +11900,7 @@ }, "loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "resolved": "https://npm.kari.com/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -11319,7 +11908,7 @@ }, "loud-rejection": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "resolved": "https://npm.kari.com/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { @@ -11329,7 +11918,7 @@ }, "lower-case": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "resolved": "https://npm.kari.com/lower-case/-/lower-case-2.0.1.tgz", "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", "dev": true, "requires": { @@ -11360,38 +11949,105 @@ "yallist": "^2.1.2" } }, + "lzma-native": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-6.0.1.tgz", + "integrity": "sha512-O6oWF0xe1AFvOCjU8uOZBZ/lhjaMNwHfVNaqVMqmoQXlRwBcFWpCAToiZOdXcKVMdo/5s/D0a2QgA5laMErxHQ==", + "dev": true, + "requires": { + "node-addon-api": "^1.6.0", + "node-pre-gyp": "^0.11.0", + "readable-stream": "^2.3.5", + "rimraf": "^2.7.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^3.0.0" + "semver": "^6.0.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "map-cache": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "resolved": "https://npm.kari.com/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "resolved": "https://npm.kari.com/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, "map-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "resolved": "https://npm.kari.com/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { @@ -11430,13 +12086,13 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://npm.kari.com/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "memory-fs": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "resolved": "https://npm.kari.com/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { @@ -11478,7 +12134,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://npm.kari.com/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -11496,7 +12152,7 @@ }, "merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "resolved": "https://npm.kari.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, @@ -11514,13 +12170,13 @@ }, "methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "resolved": "https://npm.kari.com/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "resolved": "https://npm.kari.com/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { @@ -11591,7 +12247,7 @@ }, "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "resolved": "https://npm.kari.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, @@ -11603,7 +12259,7 @@ }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": "https://npm.kari.com/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -11633,7 +12289,7 @@ }, "minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "resolved": "https://npm.kari.com/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { @@ -11642,7 +12298,7 @@ }, "minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "resolved": "https://npm.kari.com/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "requires": { @@ -11678,7 +12334,7 @@ }, "mixin-deep": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "resolved": "https://npm.kari.com/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { @@ -11688,7 +12344,7 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "resolved": "https://npm.kari.com/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { @@ -11729,35 +12385,9 @@ } } }, - "mobx-state-router": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mobx-state-router/-/mobx-state-router-4.0.3.tgz", - "integrity": "sha512-rZWjUQjEz2t8kGuxhzt4AnX5OnHLCgjOQiBf4GYwPKuQ9plflZy9H2/MNlOFOFE29LrhlZWn+YiMKr0kuzLNMQ==", - "requires": { - "path-to-regexp": "^2.4.0", - "query-string": "^5.1.1" - }, - "dependencies": { - "path-to-regexp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", - "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - } - } - }, "move-concurrently": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "resolved": "https://npm.kari.com/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { @@ -11771,13 +12401,13 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "multicast-dns": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "resolved": "https://npm.kari.com/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { @@ -11787,7 +12417,7 @@ }, "multicast-dns-service-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "resolved": "https://npm.kari.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, @@ -11798,7 +12428,7 @@ }, "nanomatch": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "resolved": "https://npm.kari.com/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { @@ -11817,7 +12447,7 @@ }, "native-ext-loader": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/native-ext-loader/-/native-ext-loader-2.3.0.tgz", + "resolved": "https://npm.kari.com/native-ext-loader/-/native-ext-loader-2.3.0.tgz", "integrity": "sha512-awBQEfD25+YLi1voefLbjHiUt0yfm3Z4mBOLqbzFVR8ZOVv0MebeN9fhNiY0fxVEFiyBYtr/hF2VWfuMSCfFlw==", "dev": true }, @@ -11827,9 +12457,37 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "negotiator": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "resolved": "https://npm.kari.com/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, @@ -11862,11 +12520,6 @@ "validate-npm-package-name": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", @@ -11882,49 +12535,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -11943,7 +12553,7 @@ }, "no-case": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "resolved": "https://npm.kari.com/no-case/-/no-case-3.0.3.tgz", "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "dev": true, "requires": { @@ -11960,14 +12570,20 @@ } }, "node-abi": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", - "integrity": "sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==", + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz", + "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==", "dev": true, "requires": { "semver": "^5.4.1" } }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -12096,15 +12712,21 @@ } }, "node-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-1.0.1.tgz", - "integrity": "sha512-0So+BicZSQaY4sLqeutdkXWiTsmr+QrlGtm5dn4OPJBcnZRmjupFbWnZbDLec95KQTZHAwt8+vk+nEIXzPHxGw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-1.0.2.tgz", + "integrity": "sha512-myxAxpyMR7knjA4Uzwf3gjxaMtxSWj2vpm9o6AYWWxQ1S3XMBNeG2vzYcp/5eW03cBGfgSxyP+wntP8qhBJNhQ==", "dev": true, "requires": { "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" + "schema-utils": "^3.0.0" }, "dependencies": { + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -12136,6 +12758,102 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -12236,13 +12954,13 @@ }, "normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "resolved": "https://npm.kari.com/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "normalize-url": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "resolved": "https://npm.kari.com/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { @@ -12252,6 +12970,15 @@ "sort-keys": "^1.0.0" } }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -12272,9 +12999,26 @@ } } }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "resolved": "https://npm.kari.com/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { @@ -12283,7 +13027,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "resolved": "https://npm.kari.com/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { @@ -12295,7 +13039,7 @@ }, "nth-check": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "resolved": "https://npm.kari.com/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { @@ -12304,18 +13048,18 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": "https://npm.kari.com/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": "https://npm.kari.com/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "resolved": "https://npm.kari.com/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { @@ -12326,7 +13070,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -12335,7 +13079,7 @@ }, "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -12352,7 +13096,7 @@ }, "object-is": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "resolved": "https://npm.kari.com/object-is/-/object-is-1.1.2.tgz", "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", "dev": true, "requires": { @@ -12362,13 +13106,13 @@ }, "object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "resolved": "https://npm.kari.com/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "resolved": "https://npm.kari.com/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { @@ -12489,7 +13233,7 @@ }, "object.getownpropertydescriptors": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "resolved": "https://npm.kari.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { @@ -12499,7 +13243,7 @@ }, "object.pick": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "resolved": "https://npm.kari.com/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { @@ -12508,13 +13252,13 @@ }, "obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "resolved": "https://npm.kari.com/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, "on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "resolved": "https://npm.kari.com/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { @@ -12523,13 +13267,13 @@ }, "on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "resolved": "https://npm.kari.com/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": "https://npm.kari.com/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -12551,7 +13295,7 @@ }, "opn": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "resolved": "https://npm.kari.com/opn/-/opn-5.5.0.tgz", "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { @@ -12573,17 +13317,17 @@ } }, "ora": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", - "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.2.0.tgz", + "integrity": "sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ==", "dev": true, "requires": { + "bl": "^4.0.3", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", + "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, @@ -12595,12 +13339,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -12644,12 +13387,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -12677,12 +13414,21 @@ "requires": { "ansi-regex": "^5.0.0" } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "original": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "resolved": "https://npm.kari.com/original/-/original-1.0.2.tgz", "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { @@ -12697,18 +13443,18 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://npm.kari.com/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://npm.kari.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "resolved": "https://npm.kari.com/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { @@ -12716,9 +13462,15 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, "p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "resolved": "https://npm.kari.com/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, @@ -12762,7 +13514,7 @@ }, "p-retry": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "resolved": "https://npm.kari.com/p-retry/-/p-retry-3.0.1.tgz", "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "requires": { @@ -12846,7 +13598,7 @@ }, "param-case": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "resolved": "https://npm.kari.com/param-case/-/param-case-3.0.3.tgz", "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", "dev": true, "requires": { @@ -12895,19 +13647,19 @@ }, "parse-passwd": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "resolved": "https://npm.kari.com/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, "parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "resolved": "https://npm.kari.com/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascal-case": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "resolved": "https://npm.kari.com/pascal-case/-/pascal-case-3.1.1.tgz", "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", "dev": true, "requires": { @@ -12925,7 +13677,7 @@ }, "pascalcase": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "resolved": "https://npm.kari.com/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, @@ -12937,7 +13689,7 @@ }, "path-dirname": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "resolved": "https://npm.kari.com/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, @@ -12952,18 +13704,18 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://npm.kari.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "resolved": "https://npm.kari.com/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "resolved": "https://npm.kari.com/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, @@ -13011,7 +13763,7 @@ }, "performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "resolved": "https://npm.kari.com/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, @@ -13028,13 +13780,13 @@ }, "pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "resolved": "https://npm.kari.com/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "resolved": "https://npm.kari.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { @@ -13077,6 +13829,27 @@ "semver-compare": "^1.0.0" } }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "optional": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true, + "optional": true + } + } + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -13116,7 +13889,7 @@ }, "posix-character-classes": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "resolved": "https://npm.kari.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, @@ -13238,7 +14011,7 @@ }, "prepend-http": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "resolved": "https://npm.kari.com/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, @@ -13259,7 +14032,7 @@ }, "pretty-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "resolved": "https://npm.kari.com/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { @@ -13287,17 +14060,25 @@ }, "promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "resolved": "https://npm.kari.com/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "proto-list": { @@ -13309,7 +14090,7 @@ }, "proxy-addr": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "resolved": "https://npm.kari.com/proxy-addr/-/proxy-addr-2.0.6.tgz", "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "requires": { @@ -13319,19 +14100,19 @@ }, "prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "resolved": "https://npm.kari.com/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "resolved": "https://npm.kari.com/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "psl": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "resolved": "https://npm.kari.com/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, @@ -13359,7 +14140,7 @@ }, "pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "resolved": "https://npm.kari.com/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { @@ -13369,7 +14150,7 @@ }, "pumpify": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "resolved": "https://npm.kari.com/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { @@ -13384,6 +14165,15 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -13402,7 +14192,7 @@ }, "querystring": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "resolved": "https://npm.kari.com/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, @@ -13418,6 +14208,12 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, "quickly-copy-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/quickly-copy-file/-/quickly-copy-file-1.0.0.tgz", @@ -13428,7 +14224,7 @@ }, "randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "resolved": "https://npm.kari.com/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { @@ -13447,13 +14243,13 @@ }, "range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "resolved": "https://npm.kari.com/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "resolved": "https://npm.kari.com/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { @@ -13465,7 +14261,7 @@ "dependencies": { "bytes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "resolved": "https://npm.kari.com/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, @@ -13493,25 +14289,24 @@ } }, "react": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", - "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "schedule": "^0.5.0" + "prop-types": "^15.6.2" } }, "react-dom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.2.tgz", - "integrity": "sha512-RC8LDw8feuZOHVgzEf7f+cxBr/DnKdqp56VU0lAs1f4UfKc4cU8wU4fTq/mgnvynLQo8OtlPC19NUFh/zjZPuA==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "schedule": "^0.5.0" + "scheduler": "^0.19.1" } }, "react-is": { @@ -13521,46 +14316,9 @@ }, "react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "resolved": "https://npm.kari.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "requires": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - } - }, "read-config-file": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-4.0.1.tgz", @@ -13623,7 +14381,7 @@ }, "read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "resolved": "https://npm.kari.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { @@ -13645,7 +14403,7 @@ }, "redent": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "resolved": "https://npm.kari.com/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { @@ -13660,7 +14418,7 @@ }, "redux": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "resolved": "https://npm.kari.com/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "dev": true, "requires": { @@ -13672,19 +14430,25 @@ }, "regenerate": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "resolved": "https://npm.kari.com/regenerate/-/regenerate-1.4.0.tgz", "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerate-unicode-properties": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "resolved": "https://npm.kari.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" } }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", @@ -13713,7 +14477,7 @@ }, "regex-not": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "resolved": "https://npm.kari.com/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { @@ -13723,7 +14487,7 @@ }, "regexp.prototype.flags": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "resolved": "https://npm.kari.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { @@ -13738,13 +14502,12 @@ "dev": true }, "registry-auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", - "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { - "rc": "^1.2.8", - "safe-buffer": "^5.0.1" + "rc": "^1.2.8" } }, "registry-url": { @@ -13758,19 +14521,19 @@ }, "relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "resolved": "https://npm.kari.com/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, "remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "resolved": "https://npm.kari.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "renderkid": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "resolved": "https://npm.kari.com/renderkid/-/renderkid-2.0.3.tgz", "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { @@ -13807,13 +14570,13 @@ }, "domelementtype": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "resolved": "https://npm.kari.com/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "resolved": "https://npm.kari.com/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { @@ -13822,7 +14585,7 @@ }, "domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "resolved": "https://npm.kari.com/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { @@ -13832,13 +14595,13 @@ }, "entities": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "resolved": "https://npm.kari.com/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "htmlparser2": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "resolved": "https://npm.kari.com/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { @@ -13852,7 +14615,7 @@ }, "readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "resolved": "https://npm.kari.com/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { @@ -13886,13 +14649,13 @@ }, "repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "resolved": "https://npm.kari.com/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "resolved": "https://npm.kari.com/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { @@ -13901,7 +14664,7 @@ }, "request": { "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "resolved": "https://npm.kari.com/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { @@ -13971,13 +14734,13 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "resolved": "https://npm.kari.com/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "resolved": "https://npm.kari.com/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, @@ -13990,9 +14753,15 @@ "path-parse": "^1.0.5" } }, + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", + "dev": true + }, "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "resolved": "https://npm.kari.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { @@ -14001,7 +14770,7 @@ }, "resolve-dir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "resolved": "https://npm.kari.com/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { @@ -14011,18 +14780,13 @@ }, "resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "resolved": "https://npm.kari.com/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, "resolve-url": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "resolved": "https://npm.kari.com/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, @@ -14046,13 +14810,13 @@ }, "ret": { "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "resolved": "https://npm.kari.com/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "resolved": "https://npm.kari.com/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, @@ -14131,7 +14895,7 @@ }, "run-queue": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "resolved": "https://npm.kari.com/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { @@ -14151,15 +14915,24 @@ "rx-lite": "*" } }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": "https://npm.kari.com/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://npm.kari.com/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14168,7 +14941,7 @@ }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": "https://npm.kari.com/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-filename": { @@ -14431,11 +15204,12 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "schedule": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", - "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { + "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, @@ -14466,7 +15240,7 @@ }, "scss-tokenizer": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "resolved": "https://npm.kari.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { @@ -14476,7 +15250,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://npm.kari.com/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -14487,7 +15261,7 @@ }, "select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "resolved": "https://npm.kari.com/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, @@ -14507,22 +15281,30 @@ }, "semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "resolved": "https://npm.kari.com/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "dev": true, "requires": { - "semver": "^5.0.3" + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "send": { "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "resolved": "https://npm.kari.com/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { @@ -14543,7 +15325,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -14552,7 +15334,7 @@ "dependencies": { "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } @@ -14560,7 +15342,7 @@ }, "ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } @@ -14596,7 +15378,7 @@ }, "serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "resolved": "https://npm.kari.com/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { @@ -14611,7 +15393,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -14620,7 +15402,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://npm.kari.com/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -14632,7 +15414,7 @@ }, "setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "resolved": "https://npm.kari.com/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true } @@ -14640,7 +15422,7 @@ }, "serve-static": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "resolved": "https://npm.kari.com/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { @@ -14652,13 +15434,13 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": "https://npm.kari.com/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "resolved": "https://npm.kari.com/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { @@ -14670,7 +15452,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://npm.kari.com/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -14687,7 +15469,7 @@ }, "setprototypeof": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "resolved": "https://npm.kari.com/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, @@ -14703,7 +15485,7 @@ }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "resolved": "https://npm.kari.com/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { @@ -14712,7 +15494,7 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "resolved": "https://npm.kari.com/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, @@ -14727,15 +15509,65 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true, + "optional": true }, "snapdragon": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "resolved": "https://npm.kari.com/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { @@ -14751,7 +15583,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -14760,7 +15592,7 @@ }, "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -14769,7 +15601,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://npm.kari.com/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -14778,7 +15610,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "resolved": "https://npm.kari.com/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } @@ -14786,7 +15618,7 @@ }, "snapdragon-node": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "resolved": "https://npm.kari.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { @@ -14797,7 +15629,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -14806,7 +15638,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { @@ -14815,7 +15647,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "resolved": "https://npm.kari.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { @@ -14824,7 +15656,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "resolved": "https://npm.kari.com/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { @@ -14837,7 +15669,7 @@ }, "snapdragon-util": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "resolved": "https://npm.kari.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { @@ -14846,7 +15678,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -14857,7 +15689,7 @@ }, "sockjs": { "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "resolved": "https://npm.kari.com/sockjs/-/sockjs-0.3.20.tgz", "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { @@ -14868,7 +15700,7 @@ "dependencies": { "uuid": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "resolved": "https://npm.kari.com/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true } @@ -14876,7 +15708,7 @@ }, "sockjs-client": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "resolved": "https://npm.kari.com/sockjs-client/-/sockjs-client-1.4.0.tgz", "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { @@ -14899,7 +15731,7 @@ }, "faye-websocket": { "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "resolved": "https://npm.kari.com/faye-websocket/-/faye-websocket-0.11.3.tgz", "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { @@ -14916,7 +15748,7 @@ }, "sort-keys": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "resolved": "https://npm.kari.com/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { @@ -14931,7 +15763,7 @@ }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://npm.kari.com/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { @@ -14958,7 +15790,7 @@ }, "source-map-url": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "resolved": "https://npm.kari.com/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, @@ -14978,7 +15810,7 @@ }, "spdx-expression-parse": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "resolved": "https://npm.kari.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { "spdx-exceptions": "^2.1.0", @@ -14992,7 +15824,7 @@ }, "spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "resolved": "https://npm.kari.com/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { @@ -15005,7 +15837,7 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -15014,7 +15846,7 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } @@ -15022,7 +15854,7 @@ }, "spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "resolved": "https://npm.kari.com/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { @@ -15036,7 +15868,7 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -15045,13 +15877,13 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "resolved": "https://npm.kari.com/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { @@ -15079,7 +15911,7 @@ }, "split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "resolved": "https://npm.kari.com/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { @@ -15088,13 +15920,13 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://npm.kari.com/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "resolved": "https://npm.kari.com/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { @@ -15119,14 +15951,14 @@ } }, "stat-mode": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", - "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true }, "static-extend": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "resolved": "https://npm.kari.com/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { @@ -15136,7 +15968,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://npm.kari.com/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -15147,13 +15979,13 @@ }, "statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "resolved": "https://npm.kari.com/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stdout-stream": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "resolved": "https://npm.kari.com/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { @@ -15236,7 +16068,7 @@ }, "stream-each": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "resolved": "https://npm.kari.com/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { @@ -15297,8 +16129,15 @@ }, "strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "resolved": "https://npm.kari.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true }, "string-width": { "version": "1.0.2", @@ -15359,13 +16198,21 @@ }, "stringify-object": { "version": "3.3.0", - "resolved": "https://npm.kari.com/stringify-object/-/stringify-object-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } } }, "strip-ansi": { @@ -15379,7 +16226,7 @@ }, "strip-bom": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "resolved": "https://npm.kari.com/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { @@ -15388,19 +16235,19 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://npm.kari.com/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-final-newline": { "version": "2.0.0", - "resolved": "https://npm.kari.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "resolved": "https://npm.kari.com/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { @@ -15464,37 +16311,17 @@ "dev": true, "requires": { "debug": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "symbol-observable": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "resolved": "https://npm.kari.com/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, @@ -15597,6 +16424,12 @@ "wordwrapjs": "^3.0.0" } }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, "tar": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", @@ -15609,9 +16442,9 @@ } }, "temp-file": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", - "integrity": "sha512-qSZ5W5q54iyGnP8cNl49RE0jTJc5CrzNocux5APD5yIxcgonoMuMSbsZfaZy8rTGCYo0Xz6ySVv3adagZ8gffg==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.7.tgz", + "integrity": "sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g==", "dev": true, "requires": { "async-exit-hook": "^2.0.1", @@ -15619,13 +16452,10 @@ } }, "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true }, "terser": { "version": "4.8.0", @@ -15926,18 +16756,18 @@ }, "text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "resolved": "https://npm.kari.com/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://npm.kari.com/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "resolved": "https://npm.kari.com/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { @@ -15979,7 +16809,7 @@ }, "thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "resolved": "https://npm.kari.com/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, @@ -15994,7 +16824,7 @@ }, "tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "resolved": "https://npm.kari.com/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { "os-tmpdir": "~1.0.2" @@ -16006,9 +16836,15 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "to-object-path": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "resolved": "https://npm.kari.com/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { @@ -16017,7 +16853,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://npm.kari.com/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -16034,7 +16870,7 @@ }, "to-regex": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "resolved": "https://npm.kari.com/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { @@ -16056,7 +16892,7 @@ }, "toidentifier": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "resolved": "https://npm.kari.com/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, @@ -16067,13 +16903,13 @@ }, "trim-newlines": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "resolved": "https://npm.kari.com/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, "true-case-path": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "resolved": "https://npm.kari.com/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { @@ -16255,7 +17091,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": "https://npm.kari.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { @@ -16264,7 +17100,7 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": "https://npm.kari.com/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, @@ -16278,14 +17114,14 @@ } }, "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "resolved": "https://npm.kari.com/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { @@ -16312,14 +17148,22 @@ }, "typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "resolved": "https://npm.kari.com/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.7.2", - "resolved": "https://npm.kari.com/typescript/-/typescript-3.7.2.tgz", - "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "typical": { @@ -16328,20 +17172,20 @@ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" }, "uglify-js": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.3.tgz", - "integrity": "sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g==", + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.3.tgz", + "integrity": "sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw==", "optional": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "resolved": "https://npm.kari.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "resolved": "https://npm.kari.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { @@ -16351,19 +17195,19 @@ }, "unicode-match-property-value-ecmascript": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "resolved": "https://npm.kari.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "resolved": "https://npm.kari.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "resolved": "https://npm.kari.com/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { @@ -16375,13 +17219,13 @@ }, "uniq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "resolved": "https://npm.kari.com/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, "unique-filename": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "resolved": "https://npm.kari.com/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { @@ -16398,29 +17242,29 @@ } }, "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "^2.0.0" } }, "universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "resolved": "https://npm.kari.com/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "resolved": "https://npm.kari.com/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "unset-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "resolved": "https://npm.kari.com/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { @@ -16430,7 +17274,7 @@ "dependencies": { "has-value": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "resolved": "https://npm.kari.com/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { @@ -16441,7 +17285,7 @@ "dependencies": { "isobject": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "resolved": "https://npm.kari.com/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { @@ -16452,13 +17296,13 @@ }, "has-values": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "resolved": "https://npm.kari.com/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": "https://npm.kari.com/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true } @@ -16466,33 +17310,104 @@ }, "upath": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "resolved": "https://npm.kari.com/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.1.tgz", + "integrity": "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg==", "dev": true, "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", + "boxen": "^4.2.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", + "is-installed-globally": "^0.3.2", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "uri-js": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "resolved": "https://npm.kari.com/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { @@ -16509,13 +17424,13 @@ }, "urix": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "resolved": "https://npm.kari.com/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "url": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "resolved": "https://npm.kari.com/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { @@ -16525,7 +17440,7 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "resolved": "https://npm.kari.com/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true } @@ -16533,7 +17448,7 @@ }, "url-loader": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.0.tgz", + "resolved": "https://npm.kari.com/url-loader/-/url-loader-4.1.0.tgz", "integrity": "sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw==", "dev": true, "requires": { @@ -16568,7 +17483,7 @@ }, "json5": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "resolved": "https://npm.kari.com/json5/-/json5-2.1.3.tgz", "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { @@ -16577,7 +17492,7 @@ }, "loader-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "resolved": "https://npm.kari.com/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { @@ -16616,7 +17531,7 @@ }, "url-parse": { "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "resolved": "https://npm.kari.com/url-parse/-/url-parse-1.4.7.tgz", "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { @@ -16624,9 +17539,26 @@ "requires-port": "^1.0.0" } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, "use": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "resolved": "https://npm.kari.com/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, @@ -16647,13 +17579,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "https://npm.kari.com/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "util.promisify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "resolved": "https://npm.kari.com/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { @@ -16663,16 +17595,21 @@ }, "utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "resolved": "https://npm.kari.com/utila/-/utila-0.4.0.tgz", "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", "dev": true }, "utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "resolved": "https://npm.kari.com/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "v8-compile-cache": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", @@ -16696,20 +17633,15 @@ "builtins": "^1.0.3" } }, - "value-equal": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" - }, "vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "resolved": "https://npm.kari.com/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, "verror": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "resolved": "https://npm.kari.com/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { @@ -16724,14 +17656,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "warning": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", - "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "watchpack": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", @@ -17021,7 +17945,7 @@ }, "wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "resolved": "https://npm.kari.com/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { @@ -17747,7 +18671,7 @@ }, "webpack-dev-middleware": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "resolved": "https://npm.kari.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { @@ -17768,7 +18692,7 @@ }, "webpack-dev-server": { "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "resolved": "https://npm.kari.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { @@ -17815,7 +18739,7 @@ }, "anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "resolved": "https://npm.kari.com/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { @@ -17825,7 +18749,7 @@ "dependencies": { "normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "resolved": "https://npm.kari.com/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { @@ -17836,13 +18760,13 @@ }, "camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "resolved": "https://npm.kari.com/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chokidar": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "resolved": "https://npm.kari.com/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { @@ -17862,7 +18786,7 @@ }, "cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "resolved": "https://npm.kari.com/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { @@ -17873,7 +18797,7 @@ "dependencies": { "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -17884,7 +18808,7 @@ }, "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": "https://npm.kari.com/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -17893,7 +18817,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": "https://npm.kari.com/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -17915,7 +18839,7 @@ }, "glob-parent": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "resolved": "https://npm.kari.com/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { @@ -17925,7 +18849,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "resolved": "https://npm.kari.com/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { @@ -17936,7 +18860,7 @@ }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://npm.kari.com/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, @@ -17952,7 +18876,7 @@ }, "is-absolute-url": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "resolved": "https://npm.kari.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, @@ -17970,7 +18894,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": "https://npm.kari.com/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -17980,7 +18904,7 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "https://npm.kari.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, @@ -17992,7 +18916,7 @@ }, "p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "resolved": "https://npm.kari.com/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { @@ -18001,7 +18925,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": "https://npm.kari.com/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -18010,7 +18934,7 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": "https://npm.kari.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, @@ -18046,7 +18970,7 @@ }, "readdirp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "resolved": "https://npm.kari.com/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { @@ -18063,7 +18987,7 @@ }, "schema-utils": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "resolved": "https://npm.kari.com/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { @@ -18074,13 +18998,13 @@ }, "semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "resolved": "https://npm.kari.com/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": "https://npm.kari.com/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -18091,7 +19015,7 @@ "dependencies": { "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -18111,7 +19035,7 @@ }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "resolved": "https://npm.kari.com/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { @@ -18120,7 +19044,7 @@ }, "wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "resolved": "https://npm.kari.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { @@ -18131,7 +19055,7 @@ "dependencies": { "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "resolved": "https://npm.kari.com/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -18142,7 +19066,7 @@ }, "yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "resolved": "https://npm.kari.com/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { @@ -18160,7 +19084,7 @@ }, "yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "resolved": "https://npm.kari.com/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { @@ -18172,7 +19096,7 @@ }, "webpack-log": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "resolved": "https://npm.kari.com/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { @@ -18190,7 +19114,7 @@ }, "webpack-merge": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "resolved": "https://npm.kari.com/webpack-merge/-/webpack-merge-4.2.2.tgz", "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "requires": { @@ -18209,7 +19133,7 @@ }, "websocket-driver": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "resolved": "https://npm.kari.com/websocket-driver/-/websocket-driver-0.6.5.tgz", "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { @@ -18218,13 +19142,13 @@ }, "websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "resolved": "https://npm.kari.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "resolved": "https://npm.kari.com/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { @@ -18233,13 +19157,13 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "resolved": "https://npm.kari.com/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "resolved": "https://npm.kari.com/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { @@ -18247,43 +19171,50 @@ } }, "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "requires": { - "string-width": "^2.1.1" + "string-width": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } @@ -18335,12 +19266,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -18395,7 +19325,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": "https://npm.kari.com/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { @@ -18408,19 +19338,19 @@ } }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "resolved": "https://npm.kari.com/ws/-/ws-6.2.1.tgz", "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { @@ -18428,43 +19358,54 @@ } }, "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "optional": true + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true, + "optional": true + }, "xpipe": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", + "resolved": "https://npm.kari.com/xpipe/-/xpipe-1.0.5.tgz", "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=", "dev": true }, "xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "resolved": "https://npm.kari.com/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "resolved": "https://npm.kari.com/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "resolved": "https://npm.kari.com/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yaml": { - "version": "1.7.2", - "resolved": "https://npm.kari.com/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true }, "yargs": { "version": "15.4.1", @@ -18650,9 +19591,9 @@ } }, "yargs-parser": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", - "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==", + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true }, "yauzl": { diff --git a/package.json b/package.json index bc5e5027..daba7f90 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "figma-linux", - "version": "0.6.4", + "version": "0.7.0", "description": "Figma is the first interface design tool based in the browser, making it easier for teams to create software. Join as in Telegram: https://t.me/figma_linux", "main": "src/main/index.js", "repository": "git@github.com:ChugunovRoman/figma-linux.git", @@ -34,50 +34,58 @@ } }, "dependencies": { + "adm-zip": "^0.5.1", "chokidar": "^3.0.2", + "css-vars": "^2.2.0", + "electron-build-env": "^0.2", "electron-devtools-installer": "^2.2.4", - "electron-settings": "github:ChugunovRoman/electron-settings#figma-linux", + "electron-settings": "^4.0.2", "figma-linux-rust-binding": "=0.1.4", - "electron-build-env": "^0.2", + "lodash": "^4.17.20", "mobx": "^5.6.0", "mobx-react": "^5.4.2", - "mobx-state-router": "^4.0.3", - "react": "^16.5.2", - "react-dom": "^16.5.2", - "react-router-dom": "^4.3.1", - "source-map-support": "^0.5.6" + "react": "^16.14.0", + "react-dom": "^16.14.0", + "source-map-support": "^0.5.6", + "uuid": "^8.3.2" }, "devDependencies": { + "@types/adm-zip": "^0.4.33", "@types/electron-devtools-installer": "^2.0.3", - "@types/electron-settings": "^3.1.1", - "@types/node": "^10.17.32", - "@types/react": "^16.4.16", - "@types/react-dom": "^16.0.6", + "@types/lodash": "^4.14.166", + "@types/node": "^12.12.13", + "@types/react": "^16.14.2", + "@types/react-dom": "^16.0.10", "@types/react-redux": "^5.0.15", "@types/react-router-dom": "^4.3.1", "@types/redux": "^3.6.0", + "@types/uuid": "^8.3.0", "@typescript-eslint/eslint-plugin": "^4.1.1", "@typescript-eslint/parser": "^4.1.1", + "awesome-typescript-loader": "^3.4.1", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators-legacy": "^1.3.5", + "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^6.1.0", "css-loader": "^4.3.0", - "electron": "^7.3.3", - "electron-builder": "^22.1.0", - "electron-rebuild": "^2.0.3", + "electron": "^11.1.1", + "electron-builder": "^22.10.4", + "electron-rebuild": "^2.3.4", "electron-webpack": "^2.8.2", "eslint": "^6.7.2", "eslint-config-prettier": "^6.7.0", "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-react": "^7.17.0", "husky": "^3.1.0", - "lint-staged": "^10.0.0-beta.7", + "lint-staged": "^10.5.3", "native-ext-loader": "^2.3.0", - "node-loader": "^1.0.1", + "node-loader": "^1.0.2", "node-sass": "^4.14.1", "prettier": "^1.19.1", "sass-loader": "^10.0.2", "style-loader": "^1.2.1", "ts-loader": "^8.0.3", - "typescript": "^3.7.2", + "typescript": "^3.7.5", "webpack": "^4.44.1", "webpack-cli": "3.3.12" }, diff --git a/resources/figma-linux-appimage.desktop b/resources/figma-linux-appimage.desktop index fbf628a8..d3e10579 100644 --- a/resources/figma-linux-appimage.desktop +++ b/resources/figma-linux-appimage.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Name=figma-linux Comment=Unofficial desktop application for linux -Exec=figma-linux %U --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization +Exec=figma-linux --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization %U Terminal=false Type=Application Icon=figma-linux diff --git a/resources/figma-linux-snap.desktop b/resources/figma-linux-snap.desktop index cdc0880d..0894e2fe 100644 --- a/resources/figma-linux-snap.desktop +++ b/resources/figma-linux-snap.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Name=figma-linux Comment=Unofficial desktop application for linux -Exec=figma-linux %U --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization +Exec=figma-linux --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization %U Terminal=false Type=Application Icon=${SNAP}/meta/gui/icon.png diff --git a/resources/figma-linux.desktop b/resources/figma-linux.desktop index 7908a201..4078fdb1 100644 --- a/resources/figma-linux.desktop +++ b/resources/figma-linux.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Name=figma-linux Comment=Unofficial desktop application for linux -Exec=/opt/figma-linux/figma-linux %U --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization +Exec=/opt/figma-linux/figma-linux --no-sandbox --enable-oop-rasterization --ignore-gpu-blacklist -enable-experimental-canvas-features --enable-accelerated-2d-canvas --force-gpu-rasterization --enable-fast-unload --enable-accelerated-vpx-decode=3 --enable-tcp-fastopen --javascript-harmony --enable-checker-imaging --v8-cache-options=code --v8-cache-strategies-for-cache-storage=aggressive --enable-zero-copy --ui-enable-zero-copy --enable-native-gpu-memory-buffers --enable-webgl-image-chromium --enable-accelerated-video --enable-gpu-rasterization %U Terminal=false Type=Application Icon=figma-linux diff --git a/resources/incorrect_fonts/Portico Light Rough.otf b/resources/incorrect_fonts/Portico Light Rough.otf deleted file mode 100644 index 127e04cd..00000000 Binary files a/resources/incorrect_fonts/Portico Light Rough.otf and /dev/null differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 8c2ecaa2..a7b99cc2 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: figma-linux -version: '0.6.4' +version: '0.7.0' summary: Unofficial Figma desktop app for Linux platform description: | Figma is the first interface design tool based in the browser, diff --git a/src/constants/_app.ts b/src/constants/_app.ts index c1392faf..802cd1e7 100644 --- a/src/constants/_app.ts +++ b/src/constants/_app.ts @@ -156,3 +156,204 @@ export const INITACTIONINITSTATE = { "distribute-vertical-center": false, "distribute-bottom": false, }; + +export const PROPS_WITH_COLOR = [ + "color", + "backgroundColor", + "fill", + "stroke", + "borderBottomColor", + "borderRightColor", + "borderLeftColor", + "borderTopColor", + "boxShadow", +]; + +export const AVAILABLE_THEME_COLOR_VALUE = /^#[a-fA-F0-9]{6,6}$/; +export const AVAILABLE_THEME_FIELDS_COUNT = 43; +export const AVAILABLE_THEME_FIELDS = [ + "text", + "textActive", + "textDisabled", + "borders", + "bgPanel", + "bgPanelHover", + "bgToolbar", + "bgToolbarHover", + "bgToolbarActive", + "fgToolbar", + "fgToolbarHover", + "fgToolbarActive", + "fgToolbarDisabled", + "fgToolbarFilename", + "fgToolbarFoldername", + "fgToolbarChevron", + "fgToolbarUnsavedicon", + "fgToolbarLoginButton", + "fgToolbarLoginButtonBorder", + "fgToolbarLoginButtonActive", + "bgOverlay", + "fgOverlay", + "bgOverlayOutline", + "bgOverlayInnerOutline", + "bgTab", + "bgTabHover", + "bgTabActive", + "fgTab", + "fgTabHover", + "fgTabActive", + "bgHeader", + "fgHeader", + "bgHeaderControl", + "bgHeaderControlHover", + "bgHeaderControlActive", + "fgHeaderControl", + "fgHeaderControlHover", + "fgHeaderControlActive", + "fgComponent", + "fgComponentDisabled", + "fgComponentDisabledRowActive", + "bgWindowClose", + "bgBetaLabel", +]; + +export const DEFAULT_PALETTE: Themes.Palette = { + text: "#333333", + "text-active": "#050505", + "text-disabled": "#b3b3b3", + borders: "#e2e2e2", + "bg-panel": "#ffffff", + "bg-panel-hover": "#daebf7", + "bg-toolbar": "#2c2c2c", + "bg-toolbar-hover": "#000000", + "bg-toolbar-active": "#18a0fb", + "fg-toolbar": "#ffffff", + "fg-toolbar-hover": "#ffffff", + "fg-toolbar-active": "#ffffff", + "fg-toolbar-disabled": "#b3b3b3", + "fg-toolbar-filename": "#ffffff", + "fg-toolbar-foldername": "#aaaaaa", + "fg-toolbar-chevron": "#ffffff", + "fg-toolbar-unsavedicon": "#a1a1a1", + "fg-toolbar-login-button": "#ffffff", + "fg-toolbar-login-button-border": "#d3d3d3", + "fg-toolbar-login-button-active": "#808080", + "bg-overlay": "#222222", + "fg-overlay": "#ffffff", + "bg-overlay-outline": "#292828", + "bg-overlay-inner-outline": "#000000", + "bg-tab": "#222222", + "bg-tab-hover": "#2c2c2c", + "bg-tab-active": "#2c2c2c", + "fg-tab": "#7A7A7A", + "fg-tab-hover": "#ffffff", + "fg-tab-active": "#ffffff", + "bg-header": "#222222", + "fg-header": "#ffffff", + "bg-header-control": "#222222", + "bg-header-control-hover": "#2c2c2c", + "bg-header-control-active": "#2c2c2c", + "fg-header-control": "#ffffff", + "fg-header-control-hover": "#ffffff", + "fg-header-control-active": "#ffffff", + "fg-component": "#7b61ff", + "fg-component-disabled": "#4e428a", + "fg-component-disabled-row-active": "#bfbafc", + "bg-window-close": "#e81123", + "bg-beta-label": "#1bc47d", +}; + +export const PALETTE_TEXT: Types.Dic = { + text: "Text", + "text-active": "Active text", + "text-disabled": "Disabled text", + borders: "Borders and divider lines", + "bg-panel": "Panels bg color", + "bg-panel-hover": "Panel selected item bg color", + "bg-toolbar": "Toolbar bg color", + "bg-toolbar-hover": "Toolbar item hover bg color", + "bg-toolbar-active": "Toolbar active item bg color", + "fg-toolbar": "Toolbar icons color", + "fg-toolbar-hover": "Toolbar hover icons color", + "fg-toolbar-active": "Toolbar active icon color", + "fg-toolbar-disabled": "Toolbar disabled icons color", + "fg-toolbar-filename": "Toolbar file name color", + "fg-toolbar-foldername": "Toolbar dir name color", + "fg-toolbar-chevron": "Toolbar chevron color", + "fg-toolbar-unsavedicon": "Toolbar unsaved icon color", + "fg-toolbar-login-button": "Toolbar login button color", + "fg-toolbar-login-button-border": "Toolbar login button border color", + "fg-toolbar-login-button-active": "Toolbar active login button color", + "bg-overlay": "Dropdown menu bg color", + "fg-overlay": "Dropdown menu text color", + "bg-overlay-outline": "Dropdown menu outline color", + "bg-overlay-inner-outline": "Dropdown menu inner outline color", + "bg-tab": "Tab bg color", + "bg-tab-hover": "Tab hover bg color", + "bg-tab-active": "Tab active bg color", + "fg-tab": "Tab text color", + "fg-tab-hover": "Tab hover text color", + "fg-tab-active": "Tab active text color", + "bg-header": "Header bg color", + "fg-header": "Header text color", + "bg-header-control": "Header control buttons bg color", + "bg-header-control-hover": "Header hover control buttons bg color", + "bg-header-control-active": "Header active control buttons bg color", + "fg-header-control": "Header control buttons text color", + "fg-header-control-hover": "Header hover control buttons text color", + "fg-header-control-active": "Header active control buttons text color", + "fg-component": "Component color", + "fg-component-disabled": "Component disabled color", + "fg-component-disabled-row-active": "Component disabled row active color", + "bg-window-close": "Window close bg color", + "bg-beta-label": "Beta button bg color", +}; + +export const DEFAULT_THEME = { + name: "Default Theme", + author: "Figma", + id: "0", + palette: DEFAULT_PALETTE, +}; + +export const SELECTORS_TO_IGNORE = [ + ".action--unfaded", + ".action--enabled", + ".action_option", + ".avatar--root--2kH_E", + ".basic_form--greenBtn", + ".dropdown--dropdown", + ".dropdown_menu", + ".draggable_modal--backgroundOverlay--CPf6e", + ".emoji-mart-anchor-selected", + ".flyout_view--flyout", + ".folder_view--folderTeamName", + ".folder_view--pathSeparator", + ".filename_view--title", + ".filename_view--pathSeparator", + ".filename_view--dropdownOption", + ".fullscreen_menu--searchInput", + ".header_modal--modalBackground", + ".header--header--", + ".header--settings", + ".header--dropdownCaret", + ".prototype--background", + ".multilevel_dropdown--", + ".library_item_tile--descriptionPopout", + ".pointing_dropdown", + ".scaling_menu--", + ".transition_preview_pane--", + ".top_bar--", + ".tooltip--", + ".toolbar_styles--activeButton", + ".toolbar_styles--enabledButton", + ".user_view--name", + ".text--_whiteText", + ".team_link--icon", + ".zoom_menu--zoomMenu", + ".help_widget--helpWidget", + ".help_widget--tooltip", + ".raw_components--iconButtonSelected", + ".visual_bell", + ".zoom_menu", +]; diff --git a/src/constants/_defaultSettings.ts b/src/constants/_defaultSettings.ts index 313cf0c4..04197740 100644 --- a/src/constants/_defaultSettings.ts +++ b/src/constants/_defaultSettings.ts @@ -1,14 +1,22 @@ -export const DEFAULT_SETTINGS: ISettings = { +import { v4 } from "uuid"; +import { LogLevel } from "Enums"; + +export const DEFAULT_SETTINGS: SettingsInterface = { + clientId: v4(), app: { - panelHeight: 28, - showMainMenu: false, - disabledMainMenu: false, + logLevel: LogLevel.INFO, + enableColorSpaceSrgb: false, + visibleNewProjectBtn: true, + panelHeight: 40, saveLastOpenedTabs: true, - windowFrame: false, - disabledFonts: false, exportDir: `${process.env.HOME}/Pictures/Figma`, - fontDirs: ["/usr/share/fonts", "/usr/local/share/fonts",`${process.env.HOME}/.local/share/fonts`], + fontDirs: ["/usr/share/fonts", "/usr/local/share/fonts", `${process.env.HOME}/.local/share/fonts`], lastOpenedTabs: [], + featureFlags: {}, + savedExtensions: [], + }, + theme: { + currentTheme: "0", }, ui: { scalePanel: 1, diff --git a/src/constants/_ipcChannels.ts b/src/constants/_ipcChannels.ts deleted file mode 100644 index d22ab1ef..00000000 --- a/src/constants/_ipcChannels.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const NEWTAB = "newtab"; -export const TABADDED = "tabadded"; -export const FOCUSTAB = "focustab"; -export const CLOSETAB = "closetab"; -export const CLOSEALLTAB = "closealltab"; -export const MAINTAB = "maintab"; -export const CLEARVIEW = "clearView"; -export const UPDATEUISCALE = "updateuiscale"; -export const UPDATEPANELSCALE = "updatepanelscale"; -export const UPDATEPANELHEIGHT = "updatepanelheight"; -export const UPDATEMAINMENUVIS = "updatemainmenuvis"; -export const RECIVETABS = "recivetabs"; - -export const SETTITLE = "setTitle"; -export const SETTABURL = "setTabUrl"; -export const UPDATEFILEKEY = "updateFileKey"; -export const UPDATEACTIONSTATE = "updateActionState"; -export const EXPORTIMAGE = "exportimage"; - -export const TOHOME = "toHome"; diff --git a/src/constants/_other.ts b/src/constants/_other.ts index da42a0e4..4e5b06de 100644 --- a/src/constants/_other.ts +++ b/src/constants/_other.ts @@ -1,18 +1,39 @@ import { parse } from "url"; +export const LOGLEVEL = process.env.FIGMA_LOGLEVEL as string | undefined; + export const HOMEPAGE = "https://www.figma.com"; export const RECENT_FILES = "https://www.figma.com/files/recent"; export const PARSED_HOMEPAGE = parse("https://www.figma.com"); -export const TOPPANELHEIGHT = 28; +export const DOWNLOAD_ZIP_URI = "https://github.com/Figma-Linux/figma-linux-themes/archive/master.zip"; +export const DOWNLOAD_ZIP_PATH = "/tmp/master.zip"; + +export const TOPPANELHEIGHT = 40; +export const MENU_WIDTH = 330; export const PROTOCOL = "figma"; +export const TEST_THEME_ID = "test-creator-theme"; + export const MANIFEST_FILE_NAME = "manifest.json"; export const CONFIGDIR = `${process.env.HOME}/.config/figma-linux`; export const RESOURCESDIR = `${process.env.HOME}/.config/figma-linux/resources`; export const REGEXP_APP_AUTH_GRANT = /^\/{0,2}app_auth\/[^\/]+\/grant/; -export const REGEXP_APP_AUTH_REDEEM = /^\/{0,2}app_auth\/redeem/; export const FIGMA_SESSION_COOKIE_NAME = "figma.st"; + +export const FILE_EXTENSION_WHITE_LIST = [".css", ".html", ".js", ".json", ".jsx", ".md", ".ts", ".tsx"]; + +export const LINKS = { + HELP_PAGE: "https://help.figma.com", + PLUGINS_DOCS: "https://www.figma.com/plugin-docs/intro", + FIGMA_COMMUNITY_FORUM: "https://spectrum.chat/figma", + FIGMA_LINUX_COMMUNITY_FORUM: "https://spectrum.chat/figma-linux", + FIGMA_LINUX_TELEGRAM: "https://t.me/figma_linux", + VIDEO_TUTORIALS: "https://www.youtube.com/figmadesign", + RELEASE_NOTES: "https://github.com/Figma-Linux/figma-linux/releases/latest", + LEGAL_SUMMARY: "https://www.figma.com/summary-of-policy", + THEMES_REPO: "https://github.com/Figma-Linux/figma-linux-themes", +}; diff --git a/src/constants/index.ts b/src/constants/index.ts index f07a767e..f3fdc38d 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,4 +1,3 @@ export * from "./_defaultSettings"; -export * from "./_ipcChannels"; export * from "./_other"; export * from "./_app"; diff --git a/src/main/App.ts b/src/main/App.ts index 3e253674..274fac40 100755 --- a/src/main/App.ts +++ b/src/main/App.ts @@ -1,10 +1,11 @@ -import * as Settings from "electron-settings"; import * as E from "electron"; import * as Const from "Const"; -import { cmd } from "Utils/Main"; import { isAppAuthLink, isValidProjectLink } from "Utils/Common"; +import { mkdirIfNotExists, themesDirectory } from "Utils/Main"; import Args from "./Args"; +import { logger } from "./Logger"; +import { storage } from "./Storage"; import WindowManager from "./window/WindowManager"; import { Session } from "./Session"; import "./events/app"; @@ -16,33 +17,19 @@ class App { constructor() { const isSingleInstance = E.app.requestSingleInstanceLock(); - if (Settings.get("app.fontDirs")) { - cmd(`find ${(Settings.get("app.fontDirs") as string[]).join(" ")} -type f | wc -l`) - .then(output => { - console.info(`You've got a ${output.replace(/[\s\t\r]/, "")} fonts in your os.`); - - if (parseInt(output) > 3000) { - console.warn(`You've too many fonts. It'll may call problem with run the app.`); - } - }) - .catch(err => console.error(`exec command "find" error: `, err)); - } - if (!isSingleInstance) { E.app.quit(); return; } else { E.app.on("second-instance", (event, argv) => { let projectLink = ""; - console.log("second-instance, argv: ", argv); + logger.debug("second-instance, argv: ", argv); const paramIndex = argv.findIndex(i => isValidProjectLink(i)); const hasAppAuthorization = argv.find(i => isAppAuthLink(i)); - if (hasAppAuthorization) { - setTimeout(() => { - this.windowManager.loadRecentFilesMainTab(); - }, 2000); + if (this.windowManager.tryHandleAppAuthRedeemUrl(hasAppAuthorization)) { + return; } if (paramIndex !== -1) { @@ -64,15 +51,24 @@ class App { this.session = new Session(); } - this.appEvent(); + const colorSpace = storage.get().app.enableColorSpaceSrgb; - if (Object.keys(Settings.getAll()).length === 0) { - Settings.setAll(Const.DEFAULT_SETTINGS); + if (colorSpace) { + E.app.commandLine.appendSwitch("force-color-profile", "srgb"); + } else { + E.app.commandLine.appendSwitch("disable-color-correct-rendering"); } + + mkdirIfNotExists(themesDirectory).catch(error => { + logger.error("mkdirIfNotExists error: ", error); + }); + + this.appEvent(); } private appEvent = (): void => { E.app.setAsDefaultProtocolClient(Const.PROTOCOL); + E.app.allowRendererProcessReuse = false; E.app.on("ready", this.ready); E.app.on("browser-window-created", (e, window) => window.setMenu(null)); @@ -89,24 +85,22 @@ class App { figmaUrl !== "" && this.windowManager.openUrl(figmaUrl); }, 1500); - E.protocol.registerHttpProtocol( - Const.PROTOCOL, - (req, cb) => { - this.windowManager.addTab("loadMainContent.js", req.url); - - cb({ - url: req.url, - method: req.method, - }); - }, - err => err && console.log("failed to register http protocol, err: ", err), - ); + E.protocol.registerHttpProtocol(Const.PROTOCOL, (req: E.ProtocolRequest, cb: (req: E.ProtocolResponse) => void) => { + if (this.windowManager.tryHandleAppAuthRedeemUrl(req.url)) { + return; + } + + this.windowManager.addTab("loadMainContent.js", req.url); + + cb({ + url: req.url, + method: req.method, + }); + }); }; private onWindowAllClosed = (): void => { - if (process.platform !== "darwin") { - E.app.quit(); - } + E.app.quit(); }; } diff --git a/src/main/Commander.ts b/src/main/Commander.ts deleted file mode 100644 index 6ee586b8..00000000 --- a/src/main/Commander.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { commands } from "Utils/Main"; - -export default class Commander { - private constructor() {} - - public static exec(id: string, ...args: any[]): void { - commands().get(id)(...args); - } -} diff --git a/src/main/ExtensionManager.ts b/src/main/ExtensionManager.ts index acb529b4..3175188b 100644 --- a/src/main/ExtensionManager.ts +++ b/src/main/ExtensionManager.ts @@ -1,11 +1,12 @@ -import * as Chokidar from "chokidar"; import { promises } from "fs"; import { dirname, join } from "path"; -import * as Settings from "electron-settings"; +import * as Chokidar from "chokidar"; +import { storage } from "Storage"; +import { logger } from "./Logger"; class ExtensionManager { private extensionMap: Map; - private manifestObservers: Function[]; + private manifestObservers: Array; constructor() { this.extensionMap = new Map(); @@ -13,7 +14,7 @@ class ExtensionManager { this.reload(); } - public addPath(path: string): { id: number; existed: boolean } { + public addPath(path: string): Extensions.AddPathReturnValue { for (const [id, entry] of this.extensionMap.entries()) { if (entry.path === path) { return { id, existed: true }; @@ -94,7 +95,7 @@ class ExtensionManager { return Array.from(this.extensionMap.keys()); } - public addObserver(callback: Function): void { + public addObserver(callback: () => void): void { this.manifestObservers.push(callback); if (this.manifestObservers.length === 1) { @@ -106,7 +107,7 @@ class ExtensionManager { }); } } - public removeObserver(callback: Function): void { + public removeObserver(callback: () => void): void { const index = this.manifestObservers.indexOf(callback); if (index !== -1) { @@ -124,11 +125,13 @@ class ExtensionManager { } save() { - Settings.set("app.savedExtensions", this.saveToJson() as any); + storage.saveExtension(this.saveToJson()); } reload() { - this.loadFromJson(Settings.get("app.savedExtensions") as any); + const extensions = storage.get().app.savedExtensions; + + this.loadFromJson(extensions); } public saveToJson(): Extensions.ExtensionJson[] { @@ -171,7 +174,7 @@ class ExtensionManager { public async getLocalFileExtensionSource( id: number, - ): Promise<{ source: string; html: string } | { buildErrCode: boolean; stderr: string; path: string }> { + ): Promise { const extensionPath = this.getPath(id); const manifest = await promises.readFile(extensionPath, { encoding: "utf8" }); @@ -191,7 +194,7 @@ class ExtensionManager { try { callback(args); } catch (ex) { - console.error(ex); + logger.error(ex); } }); } diff --git a/src/main/Fonts.ts b/src/main/Fonts.ts index 99a1da83..fcc73bdf 100644 --- a/src/main/Fonts.ts +++ b/src/main/Fonts.ts @@ -1,25 +1,13 @@ -import * as Settings from "electron-settings"; -import { Fonts } from "figma-linux-rust-binding"; - -let fonts: any = null; -if (!Boolean(Settings.get("app.disabledFonts"))) { - fonts = require("figma-linux-rust-binding").getFonts; -} +import { Fonts, getFonts } from "figma-linux-rust-binding"; class Fonts { public static getFonts = (dirs: Array): Promise => new Promise((resolve, reject) => { - if (fonts) { - console.info("local fonts support is enabled"); - fonts(dirs, (err: Error, fonts: Fonts.IFonts) => { - if (err) reject(err); + getFonts(dirs, (err: Error, fonts: Fonts.IFonts) => { + if (err) reject(err); - resolve(fonts); - }); - } else { - console.info("local fonts support is disabled"); - reject(new Error("The Native module is disabled in the app settings")); - } + resolve(fonts); + }); }); } diff --git a/src/main/Logger.ts b/src/main/Logger.ts new file mode 100755 index 00000000..d551d849 --- /dev/null +++ b/src/main/Logger.ts @@ -0,0 +1,53 @@ +import * as E from "electron"; + +import { LOGLEVEL } from "Const"; +import { LogLevel } from "Enums"; +import { storage } from "./Storage"; + +export class Logger { + private levels = ["DEBUG", "INFO", "ERROR"]; + private logLevel = 1; + constructor() { + if (LOGLEVEL) { + this.logLevel = this.levels.indexOf(LOGLEVEL); + } else { + this.logLevel = storage.getLogLevel(); + } + + this.initLoggerEvent(); + } + + private initLoggerEvent = (): void => { + E.ipcMain.on("log-debug", (sender, ...msg) => this.debug(`[From web content: ${sender.sender.id}]`, ...msg)); + E.ipcMain.on("log-info", (sender, ...msg) => this.info(`[From web content: ${sender.sender.id}]`, ...msg)); + E.ipcMain.on("log-error", (sender, ...msg) => this.error(`[From web content: ${sender.sender.id}]`, ...msg)); + }; + + private getDateTime = (): string => { + const currentDate = new Date(); + + return currentDate.toLocaleString(); + }; + + private print = (level: number, ...argv: any[]) => { + if (level < this.logLevel) { + return; + } + + const dateTime = this.getDateTime(); + + console.log(`[${dateTime}]:[${this.levels[level]}] -`, ...argv); + }; + + public debug = (...argv: any[]): void => { + this.print(LogLevel.DEBUG, ...argv); + }; + public info = (...argv: any[]): void => { + this.print(LogLevel.INFO, ...argv); + }; + public error = (...argv: any[]): void => { + this.print(LogLevel.ERROR, ...argv); + }; +} + +export const logger = new Logger(); diff --git a/src/main/MenuState.ts b/src/main/MenuState.ts index 77cb8e7f..9e9a0f78 100644 --- a/src/main/MenuState.ts +++ b/src/main/MenuState.ts @@ -8,7 +8,7 @@ import { INITACTIONINITSTATE, ACTIONTABSTATE, ACTIONFILEBROWSERSTATE } from "Con */ class MenuState { public static actionState: MenuState.State = INITACTIONINITSTATE; - public static pluginMenuData: any[] = []; + public static pluginMenuData: Menu.MenuItem[] = []; private static update = (state: MenuState.MenuStateParams) => { const app = E.remote ? E.remote.app : E.app; @@ -20,7 +20,7 @@ class MenuState { }; } - if (state.pluginMenuData && state.pluginMenuData.length > 0) { + if (Array.isArray(state.pluginMenuData)) { MenuState.pluginMenuData = state.pluginMenuData; } @@ -41,11 +41,38 @@ class MenuState { }; public static updateInProjectActionState = () => { - MenuState.update({ actionState: ACTIONTABSTATE }); + const newPluginMenuData = MenuState.pluginMenuData.map(item => { + if (item.visible === false) { + return { + ...item, + disabled: item.disabled || false, + visible: true, + }; + } + + return item; + }); + + MenuState.update({ actionState: ACTIONTABSTATE, pluginMenuData: newPluginMenuData }); }; public static updateInFileBrowserActionState = () => { - MenuState.update({ actionState: ACTIONFILEBROWSERSTATE }); + const newPluginMenuData = MenuState.pluginMenuData.map(item => { + if (item.type === "run-menu-action" && item.name.key === "plugins-menu-manage") { + return { + ...item, + visible: true, + disabled: false, + }; + } + + return { + ...item, + visible: false, + }; + }); + + MenuState.update({ actionState: ACTIONFILEBROWSERSTATE, pluginMenuData: newPluginMenuData }); }; } diff --git a/src/main/Session.ts b/src/main/Session.ts index 9b95c85b..0f7f1704 100644 --- a/src/main/Session.ts +++ b/src/main/Session.ts @@ -1,6 +1,7 @@ import * as E from "electron"; import * as Const from "Const"; +import { logger } from "./Logger"; import { isSameCookieDomain } from "Utils/Main"; export class Session { @@ -17,6 +18,15 @@ export class Session { }; public handleAppReady = () => { + E.session.defaultSession.setPermissionRequestHandler((webContents, permission, callback) => { + const whitelist = ["fullscreen", "pointerLock"]; + callback(whitelist.includes(permission)); + }); + + const defaultUserAgent = E.session.defaultSession.getUserAgent(); + const userAgent = defaultUserAgent.replace(/Figma([^\/]+)\/([^\s]+)/, "Figma$1/$2 Figma/$2"); + + E.session.defaultSession.setUserAgent(userAgent); E.session.defaultSession.cookies .get({ url: Const.HOMEPAGE, @@ -28,17 +38,17 @@ export class Session { return cookie.name === Const.FIGMA_SESSION_COOKIE_NAME; }); - console.log("[wm] already signed in?", this._hasFigmaSession); + logger.info("[wm] already signed in?", this._hasFigmaSession); }) .catch((error: Error) => - console.error("[wm] failed to get cookies during handleAppReady:", Const.HOMEPAGE, error), + logger.error("[wm] failed to get cookies during handleAppReady:", Const.HOMEPAGE, error), ); }; private handleCookiesChanged = (event: E.Event, cookie: E.Cookie, cause: string, removed: boolean) => { if (isSameCookieDomain(cookie.domain || "", Const.PARSED_HOMEPAGE.hostname || "")) { if (cookie.name === Const.FIGMA_SESSION_COOKIE_NAME) { - console.log(`${cookie.name} cookie changed:`, cause, cookie.name, cookie.domain, removed ? "removed" : ""); + logger.debug(`${cookie.name} cookie changed:`, cause, cookie.name, cookie.domain, removed ? "removed" : ""); } } }; diff --git a/src/main/Storage.ts b/src/main/Storage.ts new file mode 100755 index 00000000..b8b5c0d2 --- /dev/null +++ b/src/main/Storage.ts @@ -0,0 +1,75 @@ +import * as Settings from "electron-settings"; +import * as _ from "lodash"; + +import * as Const from "Const"; + +export class Storage { + private settings: SettingsInterface; + + constructor() { + this.settings = Settings.getSync() as SettingsInterface; + + const mergedSettings = _.merge(Const.DEFAULT_SETTINGS, this.settings); + + this.settings = mergedSettings; + Settings.setSync(mergedSettings); + } + + public get = () => { + return Settings.getSync() as SettingsInterface; + }; + + public set = (settings: SettingsInterface): void => { + Settings.setSync(settings); + }; + + public getLogLevel = (): number => { + return this.settings.app.logLevel; + }; + public setOpenedTabs = (tabs: SavedTab[]): void => { + if (tabs.length === 0) { + return; + } + + this.settings.app.lastOpenedTabs = tabs; + + this.set(this.settings); + }; + public setFeatureFlags = (flags: FeatureFlags): void => { + this.settings.app.featureFlags = _.merge(this.settings.app.featureFlags, flags); + + this.set(this.settings); + }; + public setPanelHeight = (height: number): void => { + this.settings.app.panelHeight = height; + + this.set(this.settings); + }; + public saveExtension = (extensions: Extensions.ExtensionJson[]): void => { + this.settings.app.savedExtensions = extensions; + + this.set(this.settings); + }; + public clearLastOpenedTabs = (): void => { + this.settings.app.lastOpenedTabs = []; + + this.set(this.settings); + }; + public setLastPluginDirectory = (path: string): void => { + this.settings.app.lastSavedPluginDir = path; + + this.set(this.settings); + }; + public setExportDirectory = (path: string): void => { + this.settings.app.lastExportDir = path; + + this.set(this.settings); + }; + public setTheme = (id: string): void => { + this.settings.theme.currentTheme = id; + + this.set(this.settings); + }; +} + +export const storage = new Storage(); diff --git a/src/main/events/ipcMain.ts b/src/main/events/ipcMain.ts index 3c2ba98d..4a1f8ea5 100644 --- a/src/main/events/ipcMain.ts +++ b/src/main/events/ipcMain.ts @@ -1,85 +1,183 @@ import * as E from "electron"; import * as path from "path"; -import { promises } from "fs"; +import * as fs from "fs"; -import { MANIFEST_FILE_NAME } from "Const"; -import { listenToWebBindingPromise, listenToWebRegisterCallback } from "Utils/Main"; +import { MANIFEST_FILE_NAME, FILE_EXTENSION_WHITE_LIST } from "Const"; +import { + listenToWebBindingPromise, + listenToWebRegisterCallback, + showSaveDialog, + access, + mkPath, + showOpenDialog, + showMessageBox, +} from "Utils/Main"; +import { sanitizeFileName, wait } from "Utils/Common"; +import WindowManager from "Main/window/WindowManager"; +import { logger } from "Main/Logger"; +import { storage } from "Main/Storage"; import Ext from "Main/ExtensionManager"; export const registerIpcMainHandlers = () => { - listenToWebBindingPromise( - "createMultipleNewLocalFileExtensions", - async (webContents: E.WebContents, options: any, depth: number) => { - const added: any[] = []; - const existed: any[] = []; + E.ipcMain.handle("createMultipleNewLocalFileExtensions", async (sender, data) => { + const added: any[] = []; + const existed: any[] = []; - const dialogResult = await E.dialog.showOpenDialog(options); + const windowManager = WindowManager.instance; + const dialogResult = await E.dialog.showOpenDialog(windowManager.mainWindow, data.options); - if (!dialogResult || dialogResult.canceled) { - return { added, existed }; - } + if (!dialogResult || dialogResult.canceled) { + return { added, existed }; + } - const pickedPaths = dialogResult.filePaths; + const pickedPaths = dialogResult.filePaths; - async function processEntry(entryPath: string, depth: number, topLevel: any) { - const stats = await promises.stat(entryPath); + async function processEntry(entryPath: string, depth: number, topLevel: any) { + const stats = await fs.promises.stat(entryPath); - if (stats.isDirectory() && depth > 0) { - let fileNames = await promises.readdir(entryPath); - fileNames = fileNames.filter(name => name[0] !== "."); + if (stats.isDirectory() && depth > 0) { + let fileNames = await fs.promises.readdir(entryPath); + fileNames = fileNames.filter(name => name[0] !== "."); - await Promise.all(fileNames.map(name => processEntry(path.resolve(entryPath, name), depth - 1, false))); - } else if (path.basename(entryPath) === MANIFEST_FILE_NAME) { - const res = Ext.addPath(entryPath); + await Promise.all(fileNames.map(name => processEntry(path.resolve(entryPath, name), depth - 1, false))); + } else if (path.basename(entryPath) === MANIFEST_FILE_NAME) { + const res = Ext.addPath(entryPath); - if (res.existed) { - existed.push(res.id); - } else { - added.push(res.id); - } - } else if (topLevel) { - throw new Error("Manifest must be named 'manifest.json'"); + if (res.existed) { + existed.push(res.id); + } else { + added.push(res.id); } + } else if (topLevel) { + throw new Error("Manifest must be named 'manifest.json'"); } + } - await Promise.all(pickedPaths.map(name => processEntry(name, depth, true))); + await Promise.all(pickedPaths.map(name => processEntry(name, data.depth, true))); - return { added, existed }; - }, - ); + return { added, existed }; + }); - listenToWebBindingPromise("getAllLocalFileExtensionIds", (webContents: E.WebContents) => { + E.ipcMain.handle("getAllLocalFileExtensionIds", async () => { return Ext.getAllIds(); }); - listenToWebBindingPromise("getLocalFileExtensionManifest", (webContents: E.WebContents, id: number) => { + E.ipcMain.handle("getLocalFileExtensionManifest", async (sender, id) => { return Ext.loadExtensionManifest(id); }); - listenToWebBindingPromise("getLocalFileExtensionSource", (webContents: E.WebContents, id: number) => { + E.ipcMain.on("removeLocalFileExtension", async (sender, id) => { + Ext.removePath(id); + }); + + E.ipcMain.on("openExtensionDirectory", async (sender, id) => { + const extensionDirectory = path.parse(Ext.getPath(id)).dir; + + E.shell.openPath(extensionDirectory); + }); + + E.ipcMain.handle("getLocalFileExtensionSource", async (sender, id) => { return Ext.getLocalFileExtensionSource(id); }); - listenToWebBindingPromise("removeLocalFileExtension", async (webContents: E.WebContents, id: number) => { - Ext.removePath(id); + E.ipcMain.handle("isDevToolsOpened", async view => { + return view.sender.isDevToolsOpened(); }); listenToWebBindingPromise("openExtensionDirectory", async (webContents: E.WebContents, id: number) => { console.error("TODO"); }); - type NewExtension = { - dirName: string; - files: Array<{ name: string; content: string }>; - }; - listenToWebBindingPromise("writeNewExtensionToDisk", async (webContents: E.WebContents, data: NewExtension) => { - console.error("TODO"); - return /*extId*/; + E.ipcMain.handle("writeNewExtensionToDisk", async (sender, data) => { + let manifest: Extensions.ManifestFile | null = null; + let manifestFile = null; + + for (const file of data.files) { + if ( + !FILE_EXTENSION_WHITE_LIST.includes(path.extname(file.name)) || + !/^\w+(?:\.\w+)*\.\w+/.test(file.name) || + file.name !== sanitizeFileName(file.name) + ) { + throw new Error(`Filename "${file.name}" not allowed`); + } + if (file.name === MANIFEST_FILE_NAME) { + if (typeof file.content !== "string") { + throw new Error("Manifest must be a string"); + } + + manifest = JSON.parse(file.content); + manifestFile = file; + + if (typeof manifest !== "object" || manifest === null) { + throw new Error("Manifest must be a JSON object"); + } + if (manifest.build) { + throw new Error(`Manifest 'build' value "${manifest.build}" not allowed`); + } + } + } + + if (manifest == null || manifestFile == null) { + throw new Error("No manifest found"); + } + + const dirName = sanitizeFileName(data.dirName); + const windowManager = WindowManager.instance; + const lastDir = storage.get().app.lastSavedPluginDir; + const dir = lastDir ? `${lastDir}/${dirName}` : dirName; + + const saveDir = await showSaveDialog(windowManager.mainWindow, { + title: manifest.name ? "Choose plugin directory location" : "Choose plugin name and directory location", + defaultPath: dir, + }); + + if (!saveDir) { + return undefined; + } + + const basename = path.basename(saveDir); + + storage.setLastPluginDirectory(path.parse(saveDir).dir); + + if (!basename) { + throw new Error("Invalid directory name"); + } + if (!manifest.name) { + manifest.name = basename; + manifestFile.content = JSON.stringify(manifest, undefined, 2); + } + const accessDir = await access(saveDir); + + if (accessDir) { + throw new Error("Overwriting existing files or directories not supported"); + } + + await mkPath(saveDir); + + const saveFilesPromises = []; + for (const file of data.files) { + const filePath = path.join(saveDir, file.name); + const promise = fs.promises.writeFile(filePath, file.content, { encoding: "utf8" }).catch(error => { + logger.error(`Cannot save file: ${filePath} for extension: "${manifest.name}", error:\n`, error); + }); + saveFilesPromises.push(promise); + } + + await Promise.all(saveFilesPromises); + + const res = Ext.addPath(path.join(saveDir, MANIFEST_FILE_NAME)); + + if (res.existed) { + throw new Error("Extension unexpectedly already added"); + } + + return res.id; }); + listenToWebRegisterCallback( "registerManifestChangeObserver", - (webContents: E.WebContents, args: any, callback: Function) => { + (webContents: E.WebContents, args: any, callback: () => void) => { Ext.addObserver(callback); return () => { @@ -87,4 +185,111 @@ export const registerIpcMainHandlers = () => { }; }, ); + + E.ipcMain.handle("writeFiles", async (sender, data) => { + const files = data.files; + + if (!files.length) { + return; + } + + const view = WindowManager.instance.mainWindow; + let skipReplaceConfirmation = false; + let directoryPath = null; + const lastDir = storage.get().app.lastExportDir || storage.get().app.exportDir; + + if (files.length === 1 && !files[0].name.includes(path.sep)) { + const originalFileName = files[0].name; + const savePath = await showSaveDialog(view, { + defaultPath: `${lastDir}/${path.basename(originalFileName)}`, + showsTagField: false, + }); + + if (savePath) { + directoryPath = path.dirname(savePath); + files[0].name = path.basename(savePath); + if (path.extname(files[0].name) === "") { + files[0].name += path.extname(originalFileName); + } else { + skipReplaceConfirmation = true; + } + + storage.setExportDirectory(path.parse(savePath).dir); + } + } else { + const directories = await showOpenDialog(view, { + properties: ["openDirectory", "createDirectory"], + buttonLabel: "Save", + defaultPath: lastDir, + }); + await wait(1); + if (!directories || directories.length !== 1) { + return; + } + directoryPath = directories[0]; + storage.setExportDirectory(directoryPath); + } + if (!directoryPath) { + return; + } + directoryPath = path.resolve(directoryPath); + let filesToBeReplaced = 0; + for (const file of files) { + const outputPath = path.join(directoryPath, file.name); + const validExtensions = [".fig", ".jpg", ".pdf", ".png", ".svg"]; + if ( + path.relative(directoryPath, outputPath).startsWith("..") || + !validExtensions.includes(path.extname(outputPath)) + ) { + await showMessageBox(view, { + type: "error", + title: "Export Failed", + message: "Export failed", + detail: `"${outputPath}" is not a valid path. No files were saved.`, + buttons: ["OK"], + defaultId: 0, + }); + return; + } + try { + fs.accessSync(outputPath, fs.constants.R_OK); + ++filesToBeReplaced; + } catch (ex) {} + } + if (filesToBeReplaced > 0 && !skipReplaceConfirmation) { + const single = filesToBeReplaced === 1; + const selectedID = await showMessageBox(view, { + type: "warning", + title: "Replace Existing Files", + message: `Replace existing file${single ? "" : `s`}?`, + detail: `${ + single + ? `"${files[0].name}" already exists` + : `${filesToBeReplaced} files including "${files[0].name}" already exist` + }. Replacing ${single ? "it" : "them"} will overwrite ${single ? "its" : "their"} existing contents.`, + buttons: ["Replace", "Cancel"], + defaultId: 0, + }); + if (selectedID !== 0) { + return; + } + } + for (const file of files) { + const outputPath = path.join(directoryPath, file.name); + mkPath(path.dirname(outputPath)); + + try { + fs.writeFileSync(outputPath, Buffer.from(file.buffer), { encoding: "binary" }); + } catch (ex) { + await showMessageBox(view, { + type: "error", + title: "Export Failed", + message: "Saving file failed", + detail: `"${file.name}" could not be saved. Remaining files will not be saved.`, + buttons: ["OK"], + defaultId: 0, + }); + } + } + }); }; diff --git a/src/main/window/Tabs.ts b/src/main/window/Tabs.ts index cf8fced1..a161922d 100755 --- a/src/main/window/Tabs.ts +++ b/src/main/window/Tabs.ts @@ -1,32 +1,33 @@ -import * as Settings from "electron-settings"; import * as E from "electron"; import * as path from "path"; import { DEFAULT_SETTINGS } from "Const"; import { isDev } from "Utils/Common"; import Fonts from "../Fonts"; +import { storage } from "../Storage"; +import { logger } from "../Logger"; +import WindowManager from "./WindowManager"; export default class Tabs { - public static registeredCancelCallbackMap: Map = new Map(); + public static registeredCancelCallbackMap: Map void> = new Map(); private static tabs: Array = []; - public static newTab = (url: string, rect: E.Rectangle, preloadScript?: string): E.BrowserView => { + public static newTab = (url: string, rect: E.Rectangle, preloadScript?: string, save = true): E.BrowserView => { const options: E.BrowserViewConstructorOptions = { webPreferences: { nodeIntegration: false, - contextIsolation: true, - webSecurity: true, webgl: true, - experimentalFeatures: false, - zoomFactor: Settings.get("ui.scaleFigmaUI") as number, + contextIsolation: false, + worldSafeExecuteJavaScript: true, + zoomFactor: 1, }, }; if (preloadScript !== "") { options.webPreferences.preload = path.resolve( isDev ? `${process.cwd()}/dist/` : `${__dirname}/../`, - "middleware", + "renderer/middleware", preloadScript || "", ); } @@ -42,13 +43,23 @@ export default class Tabs { tab.setBounds(rect); tab.webContents.loadURL(url); tab.webContents.on("dom-ready", () => { - let dirs = Settings.get("app.fontDirs") as string[]; + let dirs = storage.get().app.fontDirs; + + const currentThemeId = storage.get().theme.currentTheme; + if (currentThemeId !== "0") { + const wm = WindowManager.instance; + const foundTheme = wm.themes.find(theme => theme.id === currentThemeId); + + if (foundTheme) { + tab.webContents.send("themes-change", foundTheme); + } + } if (!dirs) { dirs = DEFAULT_SETTINGS.app.fontDirs; } Fonts.getFonts(dirs) - .catch(err => console.error(`Failed to load local fonts, error: ${err}`)) + .catch(err => logger.error(`Failed to load local fonts, error: ${err}`)) .then(fonts => { tab.webContents.send("updateFonts", fonts); }); @@ -56,15 +67,16 @@ export default class Tabs { isDev && tab.webContents.toggleDevTools(); - Tabs.tabs.push(tab); + if (save) { + Tabs.tabs.push(tab); + } return tab; }; public static closeAll = () => { Tabs.tabs = Tabs.tabs.filter(t => { - if (t.id != 1) { - t.destroy(); + if (t.webContents.id != 1) { return false; } else { return true; @@ -74,19 +86,35 @@ export default class Tabs { public static close = (id: number) => { Tabs.tabs = Tabs.tabs.filter(t => { - if (t.id != id) { + if (t.webContents.id != id) { return true; } else { - t.destroy(); + // FIXME: https://github.com/electron/electron/pull/23578#issuecomment-703736447 + t.webContents.loadURL("about:blank"); + if (t.webContents && !t.webContents.isDestroyed()) { + t.webContents.destroy(); + } return false; } }); }; - public static reloadAll = () => Tabs.tabs.forEach(t => (!t.isDestroyed() ? t.webContents.reload() : "")); + public static reloadAll = () => Tabs.tabs.forEach(t => (!t.webContents.isDestroyed() ? t.webContents.reload() : "")); + + public static getTabByIndex = (index: number): E.BrowserView | undefined => { + return Tabs.tabs[index]; + }; + + public static getTabIndex = (webContentsId: number): number | undefined => { + let index: number | undefined; + + Tabs.tabs.forEach((t, i) => { + if (t.webContents.id === webContentsId) { + index = i; + } + }); - public static focus = (id: number): E.BrowserView => { - return Tabs.tabs.find(t => t.id === id) as E.BrowserView; + return index; }; public static getAll = (): Array => Tabs.tabs; diff --git a/src/main/window/WindowManager.ts b/src/main/window/WindowManager.ts index 2b069e2c..9290ff30 100755 --- a/src/main/window/WindowManager.ts +++ b/src/main/window/WindowManager.ts @@ -1,58 +1,92 @@ import installExtension, { REACT_DEVELOPER_TOOLS } from "electron-devtools-installer"; -import * as Settings from "electron-settings"; import * as E from "electron"; -import { exec } from "child_process"; import * as url from "url"; import Tabs from "./Tabs"; -import initMainMenu from "./menu"; -import Commander from "../Commander"; +import { storage } from "../Storage"; +import { logger } from "../Logger"; import MenuState from "../MenuState"; import * as Const from "Const"; import { isDev, - isComponentUrl, - isRedeemAuthUrl, - isProtoLink, normalizeUrl, - getComponentTitle, - app, + isValidProjectLink, + isPrototypeUrl, + isAppAuthGrandLink, + isAppAuthRedeem, + parseURL, + isFigmaDocLink, + isCommunityUrl, } from "Utils/Common"; -import { winUrlDev, winUrlProd, isFileBrowser } from "Utils/Main"; +import { + winUrlDev, + winUrlProd, + toggleDetachedDevTools, + getThemesFromDirectory, + setMenuFromTemplate, + buildActionToMenuItemMap, + resetMenu, + showMessageBoxSync, + loadCreatorTheme, + saveCreatorTheme, + exportCreatorTheme, + updateThemesFromRepository, + getThemesCount, +} from "Utils/Main"; import { registerIpcMainHandlers } from "Main/events"; class WindowManager { home: string; mainWindow: E.BrowserWindow; + settingsView: E.BrowserView | null = null; + themeCreatorView: E.BrowserView | null = null; mainTab: E.BrowserView; figmaUiScale: number; panelScale: number; closedTabsHistory: Array = []; + themes: Themes.Theme[] = []; + creatorTheme: Themes.Theme; + private lastFocusedTab: E.WebContents; private tabs: Tab[]; + private menu: E.Menu; private static _instance: WindowManager; - private panelHeight = Settings.get("app.panelHeight") as number; + private panelHeight = storage.get().app.panelHeight; + private enableColorSpaceSrgbWasChanged = false; + + private constructor() { + this.home = Const.HOMEPAGE; + this.figmaUiScale = storage.get().ui.scaleFigmaUI; + this.panelScale = storage.get().ui.scalePanel; - private constructor(options: E.BrowserWindowConstructorOptions, home: string) { - this.home = home; - this.figmaUiScale = Settings.get("ui.scaleFigmaUI") as number; - this.panelScale = Settings.get("ui.scalePanel") as number; + const options: E.BrowserWindowConstructorOptions = { + width: 1200, + height: 900, + frame: false, + webPreferences: { + sandbox: false, + zoomFactor: 1, + nodeIntegration: true, + nodeIntegrationInWorker: false, + webviewTag: false, + webSecurity: false, + webgl: true, + experimentalFeatures: true, + enableRemoteModule: true, + contextIsolation: false, + }, + }; this.mainWindow = new E.BrowserWindow(options); this.mainWindow.loadURL(isDev ? winUrlDev : winUrlProd); - if (!Settings.get("app.disabledMainMenu")) { - initMainMenu(); - } else { - E.Menu.setApplicationMenu(null); - this.mainWindow.setMenuBarVisibility(false); - } + this.initMenu(); - this.mainTab = this.addTab("loadMainContent.js"); + this.mainTab = this.addMainTab(); this.mainWindow.on("resize", this.updateBounds); - this.mainWindow.on("maximize", (e: Event) => setTimeout(() => this.updateBounds(e), 100)); - this.mainWindow.on("unmaximize", (e: Event) => setTimeout(() => this.updateBounds(e), 100)); - this.mainWindow.on("move", (e: Event) => setTimeout(() => this.updateBounds(e), 100)); + this.mainWindow.on("maximize", () => setTimeout(() => this.updateBounds(), 100)); + this.mainWindow.on("unmaximize", () => setTimeout(() => this.updateBounds(), 100)); + this.mainWindow.on("move", () => setTimeout(() => this.updateBounds(), 100)); isDev && this.installReactDevTools(); isDev && this.mainWindow.webContents.openDevTools({ mode: "detach" }); @@ -62,9 +96,12 @@ class WindowManager { E.app.on("will-quit", this.onWillQuit); - if (Settings.get("app.saveLastOpenedTabs")) { - setTimeout(() => this.resoreTabs(), 1000); + if (storage.get().app.saveLastOpenedTabs) { + setTimeout(() => this.restoreTabs(), 1000); } + + this.updateThemes(); + this.updatePanelScale(this.panelScale); } static get instance(): WindowManager { @@ -72,32 +109,13 @@ class WindowManager { return WindowManager._instance; } - const options: E.BrowserWindowConstructorOptions = { - width: 1200, - height: 900, - frame: !(Settings.get("app.disabledMainMenu") as boolean), - autoHideMenuBar: Settings.get("app.showMainMenu") as boolean, - webPreferences: { - sandbox: false, - zoomFactor: 1, - nodeIntegration: true, - nodeIntegrationInWorker: false, - webviewTag: false, - webSecurity: false, - webgl: true, - experimentalFeatures: true, - }, - }; - - const home = Const.HOMEPAGE; - - WindowManager._instance = new WindowManager(options, home); + WindowManager._instance = new WindowManager(); return WindowManager._instance; } openUrl = (url: string) => { - if (isRedeemAuthUrl(url)) { + if (isAppAuthRedeem(url)) { const normalizedUrl = normalizeUrl(url); const tab = Tabs.getAll()[0]; @@ -113,23 +131,56 @@ class WindowManager { this.mainTab.webContents.loadURL(Const.RECENT_FILES); }; - private resoreTabs = () => { - const tabs = Settings.get("app.lastOpenedTabs") as SavedTab[]; + private restoreTabs = () => { + const tabs = storage.get().app.lastOpenedTabs; - if (Array.isArray(tabs)) { + if (Array.isArray(tabs) && tabs.length) { tabs.forEach((tab, i) => { setTimeout(() => { - if (isFileBrowser(tab.url)) { - this.addTab("loadMainContent.js", tab.url, tab.title); - } else { - this.addTab("loadContent.js", tab.url, tab.title); - } - }, 1500 * i); + this.addTab("loadContent.js", tab.url, tab.title, false); + }, 500 * i); }); + + storage.clearLastOpenedTabs(); + + MenuState.updateInFileBrowserActionState(); } }; - private onWillQuit = () => { + private initMenu = (template?: E.MenuItemConstructorOptions[]) => { + let pluginMenuData: Menu.MenuItem[] = []; + this.menu = setMenuFromTemplate(pluginMenuData, template); + const menuItemMap = buildActionToMenuItemMap(this.menu); + + this.menu = resetMenu(pluginMenuData, template); + + E.app.on("os-menu-invalidated", state => { + if (Array.isArray(state.pluginMenuData)) { + pluginMenuData = state.pluginMenuData; + + this.menu = resetMenu(pluginMenuData, template); + } + + if (!state.actionState) return; + + for (const action of Object.keys(menuItemMap)) { + const menuItem: E.MenuItem = menuItemMap[action]; + menuItem.enabled = state.actionState ? !!state.actionState[action] : false; + } + }); + }; + + private newProject = (): void => { + const currentView = this.addTab(); + const onDidFinishLoad = (): void => { + currentView.webContents.send("newFile"); + currentView.webContents.removeListener("did-finish-load", onDidFinishLoad); + }; + + currentView.webContents.on("did-finish-load", onDidFinishLoad); + }; + + private onWillQuit = (): void => { const lastOpenedTabs: SavedTab[] = []; this.tabs.forEach(tab => { @@ -141,14 +192,16 @@ class WindowManager { } }); - Settings.set("app.lastOpenedTabs", lastOpenedTabs as any); + storage.setOpenedTabs(lastOpenedTabs); }; - private addIpc = () => { - E.ipcMain.on(Const.NEWTAB, async () => this.addTab()); - - E.ipcMain.on("app-exit", () => { - app.quit(); + private addIpc = (): void => { + E.ipcMain.on("newTab", () => this.addTab()); + E.ipcMain.on("newProject", () => { + this.newProject(); + }); + E.ipcMain.on("appExit", () => { + E.app.quit(); }); E.ipcMain.on("window-minimize", () => { this.mainWindow.minimize(); @@ -160,39 +213,19 @@ class WindowManager { this.mainWindow.maximize(); } }); - - E.ipcMain.on(Const.CLOSETAB, (event: Event, id: number) => { + E.ipcMain.on("closeTab", (event, id) => { this.closeTab(id); }); + E.ipcMain.on("setTabFocus", (event, id) => { + this.focusTab(id); - E.ipcMain.on(Const.FOCUSTAB, (event: Event, id: number) => { - const view = Tabs.focus(id); - this.mainWindow.setBrowserView(view); - - if (isFileBrowser(view.webContents.getURL())) { - MenuState.updateInFileBrowserActionState(); - } else { - MenuState.updateInProjectActionState(); - } + MenuState.updateInProjectActionState(); }); - - E.ipcMain.on(Const.CLEARVIEW, (event: Event) => { - this.mainWindow.setBrowserView(null); + E.ipcMain.on("setFocusToMainTab", () => { + this.focusMainTab(); }); - - E.ipcMain.on(Const.MAINTAB, (event: Event) => { - const view = Tabs.focus(1); - this.mainWindow.setBrowserView(view); - - if (isFileBrowser(view.webContents.getURL())) { - MenuState.updateInFileBrowserActionState(); - } else { - MenuState.updateInProjectActionState(); - } - }); - - E.ipcMain.on(Const.CLOSEALLTAB, () => { - console.log("Close all tab"); + E.ipcMain.on("closeAllTab", () => { + logger.debug("Close all tab"); }); E.ipcMain.on("setTitle", (event, title) => { const tab = Tabs.getByWebContentId(event.sender.id); @@ -201,208 +234,493 @@ class WindowManager { return; } - this.mainWindow.webContents.send(Const.SETTITLE, { id: tab.id, title }); + this.mainWindow.webContents.send("setTitle", { id: tab.webContents.id, title }); + }); + E.ipcMain.on("openMenu", () => { + const windowWidth = this.mainWindow.getBounds().width; + + this.menu.popup({ + window: this.mainWindow, + x: windowWidth - Const.MENU_WIDTH, + y: this.panelHeight, + }); }); E.ipcMain.on("setPluginMenuData", (event, pluginMenu) => { - MenuState.updatePluginState(pluginMenu); + const view = Tabs.getByWebContentId(event.sender.id); + + if (!view) { + return; + } + + if (view.webContents.id !== this.mainTab.webContents.id) { + MenuState.updatePluginState(pluginMenu); + } else { + MenuState.updateInFileBrowserActionState(); + } }); E.ipcMain.on("registerManifestChangeObserver", (event: any, callbackId: any) => { - console.log("registerManifestChangeObserver, callbackId: ", callbackId); + logger.debug("registerManifestChangeObserver, callbackId: ", callbackId); const tab = Tabs.getByWebContentId(event.sender.id); if (!tab) { return; } + }); + E.ipcMain.on("setTabUrl", (event, url: string) => { + const view = Tabs.getByWebContentId(event.sender.id); + + if (!view) { + return; + } - // exports.extensionRegistry.addObserver(callback); - // return () => { - // exports.extensionRegistry.removeObserver(callback); - // }; + this.mainWindow.webContents.send("setTabUrl", { id: view.webContents.id, url }); }); - E.ipcMain.on(Const.SETTABURL, (event: Event, url: string) => { - const view = this.mainWindow.getBrowserView(); + E.ipcMain.on("updateFileKey", (event, key) => { + const view = Tabs.getByWebContentId(event.sender.id); - if (!view) return; + if (!view) { + return; + } - this.mainWindow.webContents.send(Const.SETTABURL, { id: view.id, url }); + this.mainWindow.webContents.send("updateFileKey", { id: view.webContents.id, fileKey: key }); }); + E.ipcMain.on("updateActionState", (event, state) => { + MenuState.updateActionState(state); + }); + E.ipcMain.on("openFile", (event, ...args) => { + let url = `${this.home}${args[0]}`; - E.ipcMain.on(Const.UPDATEFILEKEY, (event: Event, key: string) => { - const view = this.mainWindow.getBrowserView(); + if (args[2]) { + url = `${url}${args[2]}`; + } - if (!view) return; + this.addTab("loadContent.js", url, undefined, false); + }); + E.ipcMain.on("setFeatureFlags", (event, args) => { + storage.setFeatureFlags(args.featureFlags); + }); + E.ipcMain.on("openDevTools", (event, mode) => { + if (event.sender) { + event.sender.openDevTools({ mode }); + } + }); + E.ipcMain.on("startAppAuth", (event, args) => { + if (isAppAuthGrandLink(args.grantPath)) { + const url = `${this.home}${args.grantPath}?desktop_protocol=figma`; - this.mainWindow.webContents.send(Const.UPDATEFILEKEY, { id: view.id, fileKey: key }); + E.shell.openExternal(url); + } }); + E.ipcMain.on("finishAppAuth", (event, args) => { + const url = `${this.home}${args.redirectURL}`; - E.ipcMain.on(Const.UPDATEACTIONSTATE, (event: Event, state: MenuState.State) => { - MenuState.updateActionState(state); + this.mainTab.webContents.loadURL(url); }); + E.ipcMain.on("receiveTabs", (event, tabs) => { + this.tabs = tabs; + }); + E.ipcMain.on("enableColorSpaceSrgbWasChanged", (event, enabled) => { + const previousValue = storage.get().app.enableColorSpaceSrgb; + + if (enabled === previousValue) { + return; + } - E.ipcMain.on(Const.TOHOME, (event: Event, title: string) => { - this.openFileBrowser(); + this.enableColorSpaceSrgbWasChanged = true; }); + E.ipcMain.on("closeSettingsView", () => { + if (!this.settingsView) { + return; + } - E.ipcMain.on(Const.RECIVETABS, (event: Event, tabs: Tab[]) => { - this.tabs = tabs; + if (this.settingsView.webContents.isDevToolsOpened()) { + this.settingsView.webContents.closeDevTools(); + } + + this.mainWindow.removeBrowserView(this.settingsView); + + if (this.enableColorSpaceSrgbWasChanged) { + const id = showMessageBoxSync(this.mainWindow, { + type: "none", + title: "Figma", + message: "Restart to Change Color Space?", + detail: `Figma needs to be restarted to change the color space.`, + buttons: ["Cancel", "Restart"], + defaultId: 1, + }); + + if (id) { + E.app.relaunch(); + E.app.quit(); + } + } + + this.destroyView(this.settingsView); }); + E.ipcMain.on("closeThemeCreatorView", () => { + if (!this.themeCreatorView) { + return; + } - E.app.on("update-figma-ui-scale", scale => { + if (this.themeCreatorView.webContents.isDevToolsOpened()) { + this.themeCreatorView.webContents.closeDevTools(); + } + + this.mainWindow.removeBrowserView(this.themeCreatorView); + + this.destroyView(this.themeCreatorView); + }); + E.ipcMain.on("updateFigmaUiScale", (event, scale) => { this.updateFigmaUiScale(scale); }); - E.app.on("update-panel-scale", scale => { + E.ipcMain.on("updatePanelScale", (event, scale) => { this.updatePanelScale(scale); }); - E.app.on("set-hide-main-menu", hide => { - this.mainWindow.setAutoHideMenuBar(hide); + E.ipcMain.on("updateVisibleNewProjectBtn", (event, visible) => { + this.mainWindow.webContents.send("updateVisibleNewProjectBtn", visible); + }); + E.ipcMain.on("themes-change", (event, theme) => { + if (theme.id === Const.TEST_THEME_ID) { + const testTheme = this.themes.find(t => t.id === theme.id); - if (!hide) { - this.mainWindow.setMenuBarVisibility(true); + if (testTheme) { + testTheme.palette = theme.palette; + } } + + this.changeTheme(theme); + }); + E.ipcMain.on("set-default-theme", event => { + this.changeTheme(Const.DEFAULT_THEME); + }); + E.ipcMain.on("saveCreatorTheme", (event, theme) => { + saveCreatorTheme(theme); + if (theme.id === Const.TEST_THEME_ID) { + const testTheme = this.themes.find(t => t.id === theme.id); + + if (testTheme) { + testTheme.palette = theme.palette; + } + } + + this.creatorTheme = theme; }); - E.app.on("set-disable-main-menu", hide => { - setTimeout(() => { - exec(process.argv.join(" ")); - E.app.quit(); - }, 1000); + E.ipcMain.on("themeCreatorExportTheme", (event, theme) => { + exportCreatorTheme(theme); + }); + E.ipcMain.on("sync-themes", async () => { + logger.debug("Sync themes start"); + if (this.isActive(this.settingsView)) { + this.settingsView.webContents.send("sync-themes-start"); + } + + await updateThemesFromRepository(); + await this.updateThemes(); + + if (this.isActive(this.settingsView)) { + this.settingsView.webContents.send("sync-themes-end"); + } + logger.debug("Sync themes end"); + }); + + E.app.on("toggle-current-tab-devtools", () => { + toggleDetachedDevTools(this.lastFocusedTab); + }); + E.app.on("openSettingsView", () => { + this.enableColorSpaceSrgbWasChanged = false; + this.initSettingsView(); + }); + E.app.on("openThemeCreatorView", () => { + this.initThemeCreatorView(); }); E.app.on("sign-out", () => { this.logoutAndRestart(); }); - E.app.on("handle-command", (id: string) => { + E.app.on("toggle-settings-developer-tools", () => { + if (this.settingsView && this.isActive(this.settingsView)) { + toggleDetachedDevTools(this.settingsView.webContents); + } else if (this.themeCreatorView && this.isActive(this.themeCreatorView)) { + toggleDetachedDevTools(this.themeCreatorView.webContents); + } + }); + E.app.on("handleUrl", (senderId, path) => { + if (senderId !== this.mainTab.webContents.id) { + this.focusMainTab(); + } + + this.mainTab.webContents.send("handleUrl", path); + }); + E.app.on("handle-command", (sender, id) => { switch (id) { - case "scale-normal": - { - this.updateAllScale(); - } + case "scale-normal": { + this.updateAllScale(); break; - case "scale-inc0.1": - { - this.updateAllScale(0.1); - } + } + case "scale-inc0.1": { + this.updateAllScale(0.1); break; - case "scale-dic0.1": - { - this.updateAllScale(-0.1); - } + } + case "scale-dic0.1": { + this.updateAllScale(-0.1); break; - case "scale-inc0.05": - { - this.updateAllScale(0.05); - } + } + case "scale-inc0.05": { + this.updateAllScale(0.05); break; - case "scale-dic0.05": - { - this.updateAllScale(-0.05); - } + } + case "scale-dic0.05": { + this.updateAllScale(-0.05); break; - case "openFileBrowser": - { - this.openFileBrowser(); - } + } + case "openFileBrowser": { + this.focusMainTab(); break; - case "reopenClosedTab": - { - if (this.closedTabsHistory.length <= 0) return; + } + case "reopenClosedTab": { + if (this.closedTabsHistory.length <= 0) return; - const url = this.closedTabsHistory.pop(); - const script = /files\/recent$/.test(url) ? "loadMainContent.js" : "loadContent.js"; + const url = this.closedTabsHistory.pop(); + const script = isValidProjectLink(url) ? "loadContent.js" : "loadMainContent.js"; - this.addTab(script, url); - } + this.addTab(script, url); break; - case "closeTab": - { - const currentView = this.mainWindow.getBrowserView(); - - if (currentView.id === 1) return; + } + case "closeTab": { + const view = Tabs.getByWebContentId(sender.id); - this.mainWindow.webContents.send(Const.CLOSETAB, { id: currentView.id }); - this.closeTab(currentView.id); + if (!view) { + return; } + + this.mainWindow.webContents.send("closeTab", { id: view.webContents.id }); + this.closeTab(view.webContents.id); break; - case "newFile": - { - const currentView = this.addTab(); - const onDidFinishLoad = () => { - currentView.webContents.send("newFile"); - currentView.webContents.removeListener("did-finish-load", onDidFinishLoad); - }; - - currentView.webContents.on("did-finish-load", onDidFinishLoad); - } + } + case "newFile": { + this.newProject(); break; - case "openSettings": - { - this.addTab("", `component://Settings`); - } + } + case "chrome://gpu": { + this.addTab("", `chrome://gpu`, "chrome://gpu/"); break; - case "chrome://gpu": - { - this.addTab("", `chrome://gpu`, "chrome://gpu/"); + } + case "openFileUrlClipboard": { + const uri = E.clipboard.readText(); + + if (isValidProjectLink(uri) || isPrototypeUrl(uri)) { + this.addTab("loadContent.js", normalizeUrl(uri)); + } + + if (isCommunityUrl(uri)) { + const parsedUrl = url.parse(uri); + this.mainTab.webContents.send("handleUrl", parsedUrl.path); + this.focusMainTab(); } break; + } default: { - Commander.exec(id); + logger.error("unavailable command id: ", id); } } }); }; - public addTab = (scriptPreload = "loadMainContent.js", url = `${this.home}/login`, title?: string): E.BrowserView => { - if (isComponentUrl(url)) { - this.mainWindow.setBrowserView(null); - this.mainWindow.webContents.send(Const.TABADDED, { - title: title ? title : getComponentTitle(url), - showBackBtn: false, - url, - }); + public tryHandleAppAuthRedeemUrl = (url: string): boolean => { + if (isAppAuthRedeem(url)) { + const normalizedUrl = normalizeUrl(url); + const parsedUrl = parseURL(normalizedUrl); + + const secret = parsedUrl.searchParams.get("g_secret"); + if (secret) { + this.mainTab.webContents.send("redeemAppAuth", secret); + return true; + } - return null; + return true; } + return false; + }; + + public addTab = ( + scriptPreload = "loadMainContent.js", + url = `${this.home}/login`, + title?: string, + focused = true, + ): E.BrowserView => { const tab = Tabs.newTab(url, this.getBounds(), scriptPreload); - this.mainWindow.setBrowserView(tab); + if (focused) { + this.focusTab(tab.webContents.id); + } + tab.webContents.on("will-navigate", this.onMainWindowWillNavigate); tab.webContents.on("new-window", this.onNewWindow); - if (isFileBrowser) { - MenuState.updateInFileBrowserActionState(); - } else { - MenuState.updateActionState(Const.ACTIONTABSTATE); + MenuState.updateActionState(Const.ACTIONTABSTATE); + + this.mainWindow.webContents.send("didTabAdd", { id: tab.webContents.id, url, showBackBtn: true, title, focused }); + + if (focused) { + this.focusTab(tab.webContents.id); } - this.mainWindow.webContents.send(Const.TABADDED, { id: tab.id, url, showBackBtn: true, title }); + return tab; + }; + + public addMainTab = (): E.BrowserView => { + const url = `${this.home}/login`; + const tab = Tabs.newTab(url, this.getBounds(), "loadMainContent.js", false); this.mainWindow.setBrowserView(tab); + tab.webContents.on("will-navigate", this.onMainTabWillNavigate); + tab.webContents.on("will-navigate", this.onMainWindowWillNavigate); + tab.webContents.on("new-window", this.onNewWindow); + + MenuState.updateInFileBrowserActionState(); + + this.lastFocusedTab = tab.webContents; + return tab; }; - private logoutAndRestart = (event?: E.Event) => { + public focusTab = (webContentsId: number): void => { + const tabs = Tabs.getAll(); + let foundView = false; + + for (const tab of tabs) { + if (tab.webContents.id === webContentsId) { + this.mainWindow.setBrowserView(tab); + this.lastFocusedTab = tab.webContents; + foundView = true; + } + } + + if (!foundView) { + this.mainWindow.setBrowserView(this.mainTab); + this.lastFocusedTab = this.mainTab.webContents; + } + }; + + // For multiply BrowserView + // public focusTab = (webContentsId: number): void => { + // const tabs = Tabs.getAll(); + // let foundView = false; + + // for (const tab of tabs) { + // if (tab.webContents.id !== webContentsId) { + // this.mainWindow.removeBrowserView(tab); + // } else { + // foundView = true; + // this.mainWindow.addBrowserView(tab); + // this.lastFocusedTab = tab.webContents; + // } + // } + + // if (!foundView) { + // this.mainWindow.addBrowserView(this.mainTab); + // this.lastFocusedTab = this.mainTab.webContents; + // } + // }; + + private initSettingsView = () => { + this.settingsView = new E.BrowserView({ + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + experimentalFeatures: false, + enableRemoteModule: true, + }, + }); + + this.mainWindow.addBrowserView(this.settingsView); + + const windowBounds = this.mainWindow.getBounds(); + + this.settingsView.setBounds({ + height: windowBounds.height, + width: windowBounds.width, + y: 0, + x: 0, + }); + + this.settingsView.setAutoResize({ + width: true, + height: true, + horizontal: true, + vertical: true, + }); + + this.settingsView.webContents.loadURL(isDev ? winUrlDev : winUrlProd); + + this.settingsView.webContents.on("did-finish-load", () => { + this.settingsView.webContents.send("renderView", "Settings"); + this.settingsView.webContents.send("getUploadedThemes", this.themes); + + isDev && this.settingsView.webContents.openDevTools({ mode: "detach" }); + }); + }; + + private initThemeCreatorView = () => { + this.themeCreatorView = new E.BrowserView({ + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + experimentalFeatures: false, + enableRemoteModule: true, + }, + }); + + this.mainWindow.addBrowserView(this.themeCreatorView); + + const windowBounds = this.mainWindow.getBounds(); + + this.themeCreatorView.setBounds({ + height: windowBounds.height, + width: windowBounds.width, + y: 0, + x: 0, + }); + + this.themeCreatorView.setAutoResize({ + width: true, + height: true, + horizontal: true, + vertical: true, + }); + + this.themeCreatorView.webContents.loadURL(isDev ? winUrlDev : winUrlProd); + + this.themeCreatorView.webContents.on("did-finish-load", () => { + this.themeCreatorView.webContents.send("renderView", "ThemeCreator"); + this.themeCreatorView.webContents.send("getUploadedThemes", this.themes); + this.themeCreatorView.webContents.send("loadCreatorTheme", this.creatorTheme); + }); + }; + + private logoutAndRestart = (event?: E.Event): void => { E.net .request(`${this.home}/logout`) .on("response", response => { response.on("error", (err: Error) => { - console.log("Request error: ", err); + logger.error("Request error: ", err); }); response.on("end", () => { if (response.statusCode >= 200 && response.statusCode <= 299) { - E.session.defaultSession!.cookies.flushStore().then(() => { - const view = Tabs.focus(1); - this.mainWindow.setBrowserView(view); - view.webContents.reload(); + E.session.defaultSession.cookies.flushStore().then(() => { + this.mainWindow.setBrowserView(this.mainTab); + this.mainTab.webContents.reload(); Tabs.closeAll(); - this.mainWindow.webContents.send(Const.CLOSEALLTAB); + this.mainWindow.webContents.send("closeAllTab"); }); } if (response.statusCode >= 400) { - E.session.defaultSession!.clearStorageData(); + E.session.defaultSession.clearStorageData(); this.mainWindow.webContents.loadURL(`${this.home}`); } }); @@ -413,33 +731,75 @@ class WindowManager { return; }; + private changeTheme = (theme: Themes.Theme) => { + this.mainTab.webContents.send("themes-change", theme); + this.mainWindow.webContents.send("themes-change", theme); + + if (this.settingsView && this.isActive(this.settingsView)) { + this.settingsView.webContents.send("themes-change", theme); + } + if (this.themeCreatorView && this.isActive(this.themeCreatorView)) { + this.themeCreatorView.webContents.send("themes-change", theme); + } + + const tabs = Tabs.getAll(); + + for (const tab of tabs) { + tab.webContents.send("themes-change", theme); + } + + storage.setTheme(theme.id); + }; + private onNewWindow = (event: Event, url: string) => { event.preventDefault(); - console.log("newWindow, url: ", url); + logger.debug("newWindow, url: ", url); if (/start_google_sso/.test(url)) return; - if (isProtoLink(url)) { + if (isPrototypeUrl(url) || isValidProjectLink(url)) { this.addTab("loadContent.js", url); return; } - if (/figma.com\/my_plugins/.test(url)) { - this.addTab("loadMainContent.js", url); - return; - } - E.shell.openExternal(url); }; - private onMainWindowWillNavigate = (event: any, newUrl: string) => { + private focusMainTab = (): void => { + this.focusTab(this.mainTab.webContents.id); + + MenuState.updateInFileBrowserActionState(); + + this.mainWindow.webContents.send("mainTabFocused"); + }; + + private onMainTabWillNavigate = (event: E.Event, url: string): void => { + if (isValidProjectLink(url) || isPrototypeUrl(url)) { + this.addTab("loadContent.js", url); + + event.preventDefault(); + } + }; + + private onMainWindowWillNavigate = (event: any, newUrl: string): void => { const currentUrl = event.sender.getURL(); + if (isAppAuthRedeem(newUrl)) { + return; + } + if (newUrl === currentUrl) { event.preventDefault(); return; } + if (isFigmaDocLink(newUrl)) { + E.shell.openExternal(newUrl); + + event.preventDefault(); + return; + } + const from = url.parse(currentUrl); const to = url.parse(newUrl); @@ -454,43 +814,34 @@ class WindowManager { this.logoutAndRestart(event); } - if (Const.REGEXP_APP_AUTH_REDEEM.test(from.pathname || "")) { - return; - } if (to.search && to.search.match(/[\?\&]redirected=1/)) { event.preventDefault(); return; } }; - private openFileBrowser = () => { - const currentView = this.mainWindow.getBrowserView(); - const currentUrl = (currentView && currentView.webContents.getURL()) || ""; - const go: boolean = url.parse(currentUrl).pathname !== "/files/recent"; - - MenuState.updateActionState(Const.INITACTIONINITSTATE); + private closeTab = (id: number): void => { + const currentTab = Tabs.getByWebContentId(id); + const currentTabUrl = currentTab.webContents.getURL(); + const currentTabIndex = Tabs.getTabIndex(id); - currentView && go && currentView!.webContents.loadURL(`${this.home}`); - }; + this.mainWindow.removeBrowserView(currentTab); + Tabs.close(id); - private closeTab = (id: number) => { - const views = Tabs.getAll(); - const currentView = this.mainWindow.getBrowserView(); - const index: number = views.findIndex(t => t.id == id); - const view = Tabs.focus(views[index > 0 ? index - 1 : index].id); - this.mainWindow.setBrowserView(view); + const index = currentTabIndex > 0 ? currentTabIndex - 1 : currentTabIndex; + const nextTab = Tabs.getTabByIndex(index); - if (!currentView) { - Tabs.close(id); - return; + if (nextTab) { + this.focusTab(nextTab.webContents.id); + } else { + this.focusTab(this.mainTab.webContents.id); + MenuState.updateInFileBrowserActionState(); } - this.closedTabsHistory.push(currentView.webContents.getURL()); - - Tabs.close(id); + this.closedTabsHistory.push(currentTabUrl); }; - private updateAllScale = (scale?: number) => { + private updateAllScale = (scale?: number): void => { const views = Tabs.getAll(); let panelHeight = 0; @@ -504,12 +855,12 @@ class WindowManager { panelHeight = Math.floor(Const.TOPPANELHEIGHT * this.panelScale); this.panelHeight = panelHeight; - this.mainWindow.webContents.send(Const.UPDATEPANELHEIGHT, panelHeight); + this.mainWindow.webContents.send("updatePanelHeight", panelHeight); - Settings.set("app.panelHeight", panelHeight); + storage.setPanelHeight(panelHeight); - this.mainWindow.webContents.send(Const.UPDATEPANELSCALE, this.panelScale); - this.mainWindow.webContents.send(Const.UPDATEUISCALE, this.figmaUiScale); + this.mainWindow.webContents.send("updatePanelScale", this.panelScale); + this.mainWindow.webContents.send("updateUiScale", this.figmaUiScale); this.updateBounds(); @@ -518,7 +869,7 @@ class WindowManager { } }; - private updateFigmaUiScale = (figmaScale: number) => { + private updateFigmaUiScale = (figmaScale: number): void => { const views = Tabs.getAll(); this.figmaUiScale = +figmaScale.toFixed(2); @@ -528,20 +879,21 @@ class WindowManager { } }; - private updatePanelScale = (panelScale: number) => { + private updatePanelScale = (panelScale: number): void => { let panelHeight = 0; this.panelScale = +panelScale.toFixed(2); panelHeight = Math.floor(Const.TOPPANELHEIGHT * panelScale); this.panelHeight = panelHeight; - this.mainWindow.webContents.send(Const.UPDATEPANELHEIGHT, panelHeight); + this.mainWindow.webContents.send("updatePanelHeight", panelHeight); - Settings.set("app.panelHeight", panelHeight); + storage.setPanelHeight(panelHeight); + this.mainWindow.webContents.send("updatePanelScale", this.panelScale); this.updateBounds(); }; - private getBounds = () => { + private getBounds = (): E.Rectangle => { return { x: 0, y: this.panelHeight, @@ -550,18 +902,56 @@ class WindowManager { }; }; - private updateBounds = (event?: Event) => { + private updateBounds = (): void => { const views = Tabs.getAll(); + const bounds = this.getBounds(); + this.mainTab.setBounds(bounds); views.forEach((bw: E.BrowserView) => { - bw.setBounds(this.getBounds()); + bw.setBounds(bounds); }); }; - private installReactDevTools = () => { + private updateThemes = async (): Promise => { + this.mainWindow.webContents.on("dom-ready", () => { + this.mainWindow.webContents.send("getUploadedThemes", this.themes); + }); + + this.creatorTheme = await loadCreatorTheme(); + const themesCount = await getThemesCount(); + + logger.debug("themes count: ", themesCount); + + if (themesCount === 0) { + logger.debug("Download themes from repository..."); + await updateThemesFromRepository(); + logger.debug("Download themes successful"); + } + + this.themes = await getThemesFromDirectory(); + this.mainWindow.webContents.send("getUploadedThemes", this.themes); + + if (this.isActive(this.settingsView)) { + this.settingsView.webContents.send("getUploadedThemes", this.themes); + } + }; + + private isActive = (view: E.BrowserView): boolean => { + if (!view || !view.webContents) { + return false; + } + + return !view.webContents.isDestroyed(); + }; + + private destroyView = (view: E.BrowserView): void => { + view.webContents.destroy(); + }; + + private installReactDevTools = (): void => { installExtension(REACT_DEVELOPER_TOOLS) - .then((name: string) => console.log(`Added Extension: ${name}`)) - .catch((err: Error) => console.log("An error occurred: ", err)); + .then((name: string) => logger.info(`Added Extension: ${name}`)) + .catch((err: Error) => logger.error("An error occurred: ", err)); }; } diff --git a/src/main/window/menu.ts b/src/main/window/menu.ts deleted file mode 100644 index 661206e5..00000000 --- a/src/main/window/menu.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as E from "electron"; - -import { setMenuFromTemplate, buildActionToMenuItemMap, resetMenu } from "Utils/Main"; - -const init = (template?: E.MenuItemConstructorOptions[]) => { - let pluginMenuData: Menu.MenuItem[] = []; - const mainMenu: E.Menu = setMenuFromTemplate(pluginMenuData, template); - const menuItemMap = buildActionToMenuItemMap(mainMenu); - - resetMenu(pluginMenuData, template); - - E.app.on("os-menu-invalidated", state => { - if (state.pluginMenuData && state.pluginMenuData.length > 0) { - pluginMenuData = state.pluginMenuData; - - resetMenu(pluginMenuData, template); - } - - if (!state.actionState) return; - - for (const action of Object.keys(menuItemMap)) { - const menuItem: E.MenuItem = menuItemMap[action]; - menuItem.enabled = state.actionState ? !!state.actionState[action] : false; - } - }); -}; - -export default init; diff --git a/src/middleware/ShortcutMan.ts b/src/middleware/ShortcutMan.ts deleted file mode 100644 index a7bc3ec2..00000000 --- a/src/middleware/ShortcutMan.ts +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Copyright 2018 Chugunov Roman - * - * Licensed under the MIT license. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ShortcutMan is a simple keyboard shortcut library for JavaScript with - * no external dependencies. Writed with TypeScript. - * - * @version 1.0.0 - */ - -interface Sequence { - sequence: string; - callback: Function; -} - -/** - * Singleton for register shortcuts in window - */ -export class ShortcutMan { - private static _instance: ShortcutMan; - private sequenceMap: Array = []; - private shiftMap: any = { - "~": "`", - "!": "1", - "@": "2", - "#": "3", - $: "4", - "%": "5", - "^": "6", - "&": "7", - "*": "8", - "(": "9", - ")": "0", - _: "-", - "+": "=", - "|": "\\", - "}": "]", - "{": "[", - '"': "'", - ":": ";", - "?": "/", - ">": ".", - "<": ",", - }; - - /** - * Register event handler - */ - private constructor() { - window.addEventListener("keydown", event => { - const key = event.key.toLocaleLowerCase(); - const pressedSequence: Array = []; - - if (event.shiftKey) { - pressedSequence.push("shift"); - } - if (event.altKey) { - pressedSequence.push("alt"); - } - if (event.ctrlKey) { - pressedSequence.push("ctrl"); - } - if (event.metaKey) { - pressedSequence.push("meta"); - } - - if (key !== "control" && key !== "alt" && key !== "shift" && key !== "meta") { - // If pressed the shift key - if (event.shiftKey && this.shiftMap[key]) { - pressedSequence.push(this.shiftMap[key]); - } else { - pressedSequence.push(key); - } - } - - const _sequence = this.sort(pressedSequence.join("+")); - const sequence = this.sequenceMap.find(item => item.sequence === _sequence); - - if (!sequence) return; - - sequence.callback(); - }); - } - - /** - * Adding the sequence and the callback - * to the sequence collection - */ - public bind = (sequence: string, cb: Function) => { - if (sequence === "") return; - - this.sequenceMap.push({ - sequence: this.sort(sequence), - callback: cb, - }); - }; - - /** - * Deleting a sequence fron the sequence collection - */ - public unbind = (sequence: string) => { - const _sequence = this.sort(sequence); - - this.sequenceMap = this.sequenceMap.filter(item => item.sequence !== _sequence); - }; - - /** - * Getting instance - */ - public static get instance() { - if (ShortcutMan._instance) { - return ShortcutMan._instance; - } - - return new ShortcutMan(); - } - - /** - * Checking the transmitted key sequence to uniqueness. - * If function returned the false, that transmitted sequence was be found. - * If function returned true, that transmitted sequence is unique. - */ - public checkForUniqueness = (sequence: string): boolean => { - const _sequence = this.sort(sequence); - const index = this.sequenceMap.findIndex(item => item.sequence === _sequence); - - return index === -1 ? true : false; - }; - - /** - * Sorting sequence - */ - private sort = (sequence: string) => { - return sequence - .split("+") - .sort((a, b) => (a.length > b.length ? -1 : 1)) - .join("+") - .toLocaleLowerCase(); - }; -} - -export default ShortcutMan.instance; diff --git a/src/middleware/ThemesManager.ts b/src/middleware/ThemesManager.ts new file mode 100644 index 00000000..53d7ed4a --- /dev/null +++ b/src/middleware/ThemesManager.ts @@ -0,0 +1,165 @@ +import * as E from "electron"; +import { DEFAULT_THEME, SELECTORS_TO_IGNORE, PROPS_WITH_COLOR } from "Const"; +import { getColorsMap, variablesColorsMap } from "Utils/Common"; + +export class ThemesManager { + private currentTheme: Themes.Theme; + + constructor() { + this.currentTheme = DEFAULT_THEME; + + this.themeEvents(); + } + + private themeEvents() { + E.ipcRenderer.on("themes-change", (_, theme) => { + this.changePalette(theme); + }); + E.ipcRenderer.on("set-default-theme", () => { + this.changePalette(DEFAULT_THEME); + }); + } + + private changePalette(theme: Themes.Theme) { + this.currentTheme = theme; + + this.setThemeVariables(); + } + + private getCoreStylesheet(): Themes.CSSRuleListCustom { + const css: any = document.styleSheets; + let coreStylesheet; + + Object.keys(css).forEach(key => { + const cssFileUrl = css[key].href; + + if (cssFileUrl && cssFileUrl.includes("figma_app")) { + coreStylesheet = css[key].cssRules; + } + }); + + return coreStylesheet; + } + private isRuleIgnored(selector: string): boolean { + let isMatch = false; + + SELECTORS_TO_IGNORE.forEach(query => { + if (selector.includes(query)) { + isMatch = true; + } + }); + + return isMatch; + } + + private setThemeVariables() { + const keys = Object.keys(this.currentTheme.palette); + + for (const key of keys) { + const value = this.currentTheme.palette[key]; + document.documentElement.style.setProperty(`--${key}`, value); + + if (key === "bg-toolbar-active") { + document.documentElement.style.setProperty("--bg-primary-btn", value); + document.documentElement.style.setProperty("--bg-overlay-active", value); + } + if (key === "fg-overlay") { + document.documentElement.style.setProperty("--fg-overlay", value); + document.documentElement.style.setProperty("--fg-overlay-right", value); + } + if (key === "fg-toolbar-active") { + document.documentElement.style.setProperty("--fg-overlay-active", value); + } + if (key === "fg-toolbar-active") { + document.documentElement.style.setProperty("--fg-overlay-active", value); + } + if (key === "text-disabled") { + document.documentElement.style.setProperty("--fg-overlay-secondary", value); + document.documentElement.style.setProperty("--fg-toolbar-placeholder", value); + } + if (key === "borders") { + document.documentElement.style.setProperty("--fg-overlay-sep", value); + } + } + } + + init(): void { + const figmaCoreStylesheet = this.getCoreStylesheet(); + + if (!figmaCoreStylesheet) { + return; + } + + const colorsMap = getColorsMap(this.currentTheme.palette); + const additionStyleRules: string[] = [ + "#react-page { background-color: var(--bg-panel); }", + `span[class*="action_option--shortcut"] { color: var(--fg-overlay); }`, + ]; + + this.setThemeVariables(); + + for (const cssRule of figmaCoreStylesheet) { + if (cssRule.selectorText != undefined && this.isRuleIgnored(cssRule.selectorText) === false) { + if ( + (cssRule.style != undefined && cssRule.style.color != "") || + cssRule.style.backgroundColor != "" || + cssRule.style.fill != "" || + cssRule.style.stroke != "" || + cssRule.style.boxShadow != "" || + cssRule.style.borderBottomColor != "" || + cssRule.style.borderRightColor != "" || + cssRule.style.borderTopColor != "" || + cssRule.style.borderLeftColor != "" + ) { + PROPS_WITH_COLOR.forEach(colorProp => { + const colorValue = cssRule.style[colorProp]; + + if (colorValue != "" && colorsMap.hasOwnProperty(colorValue)) { + cssRule.style[colorProp] = `${variablesColorsMap[colorValue]}`; + } + }); + } + + if (/search--searchInput/.test(cssRule.selectorText)) { + cssRule.style["backgroundColor"] = `var(--bg-panel)`; + cssRule.style["color"] = `var(--text-active)`; + } + + if (/searchIcon/.test(cssRule.selectorText)) { + cssRule.style["fill"] = `var(--text-active)`; + } + if (/tool_bar--toolBarRightSide|pages_panel--pageRowSelected/.test(cssRule.selectorText)) { + cssRule.style["fill"] = `var(--text-active)`; + } + if (/upgrade_section--icon/.test(cssRule.selectorText)) { + additionStyleRules.push(`span[class*="upgrade_section--icon"] > svg > path { fill: var(--text); }`); + } + if ( + /user_view--devTokenNew|community_hub_banner--bannerIcon|full_width_page--closeMenu/.test( + cssRule.selectorText, + ) + ) { + additionStyleRules.push(`${cssRule.selectorText} svg path { fill: var(--text) !important; }`); + } + if (/basic_form--textInput/.test(cssRule.selectorText)) { + cssRule.style["backgroundColor"] = `var(--bg-panel)`; + } + if (/step_breadcrumb--stepTitle/.test(cssRule.selectorText)) { + cssRule.style["color"] = `var(--text-active)`; + } + if (/toolbar_view--shareButton|basic_form--primaryBtn/.test(cssRule.selectorText)) { + cssRule.style["color"] = `var(--fg-toolbar-active)`; + } + } + } + + if (additionStyleRules.length) { + const newStyles = document.createElement("style"); + newStyles.innerText = additionStyleRules.join("\n"); + + document.head.appendChild(newStyles); + } + } +} + +export const themes = new ThemesManager(); diff --git a/src/middleware/shortcutBinding.ts b/src/middleware/shortcutBinding.ts deleted file mode 100755 index cc60aa3a..00000000 --- a/src/middleware/shortcutBinding.ts +++ /dev/null @@ -1,20 +0,0 @@ -export default (shortcutsMap: ShortcutsMap[], shortcutMan: any) => { - console.log("shortcutsMap: ", typeof shortcutsMap); - for (const shortcut of shortcutsMap) { - if (shortcut.accelerator === "") continue; - - switch (shortcut.type) { - case "action": - { - shortcutMan.bind(shortcut.accelerator.toLocaleLowerCase(), () => { - console.log("Action: ", shortcut); - if (shortcut.value === "save-as") return; - }); - } - break; - - default: { - } - } - } -}; diff --git a/src/middleware/webApi.ts b/src/middleware/webApi.ts deleted file mode 100644 index ba8d217e..00000000 --- a/src/middleware/webApi.ts +++ /dev/null @@ -1,132 +0,0 @@ -interface IntiApiOptions { - version: number; - fileBrowser: boolean; - shortcutBinding?: any; - shortcutsMap?: ShortcutsMap[]; - shortcutMan?: any; -} - -export default (args: IntiApiOptions): void => { - const channel = new MessageChannel(); - const pendingPromises = new Map(); - const registeredCallbacks = new Map(); - - let messageHandler: Function; - let nextPromiseID = 0; - let nextCallbackID = 0; - const messageQueue: any[] = []; - - // console.log('args: ', args, args.shortcutMan); - // const shortcutBinding = new Function(`return ${args.shortcutBinding}`); - // console.log('args.shortcutBinding: ', `return ${args.shortcutBinding}`); - // console.log('shortcutBinding(args.shortcutsMap): ', shortcutBinding()(args.shortcutsMap, args.shortcutMan)); - - const tryFlushMessages = (): void => { - if (messageHandler) { - while (true) { - const msg = messageQueue.shift(); - if (!msg) { - break; - } - messageHandler(msg.name, msg.args); - } - } - }; - - window.__figmaContent = false; - - console.log("args.fileBrowser: ", typeof args.fileBrowser, args.fileBrowser); - - if (/file\/.+/.test(location.href)) { - args.fileBrowser = false; - } - - window.__figmaDesktop = { - version: args.version, - fileBrowser: args.fileBrowser, - postMessage: function(name, args, transferList) { - console.log("postMessage, name, args, transferList: ", name, args, transferList); - - // FIXME: ugly hack - if (!/recent/.test(window.location.href) && name === "updateActionState") { - const state = { - "save-as": true, - "export-selected-exportables": true, - "toggle-grid": true, - "toggle-shown-layout-grids": true, - "toggle-show-masks": true, - "toggle-show-artboard-outlines": true, - "toggle-rulers": true, - "toggle-sidebar": true, - "toggle-ui": true, - "toggle-outlines": true, - "toggle-layers": true, - "toggle-publish": true, - "toggle-library": true, - "toggle-pixel-preview": true, - "toggle-checkerboard": true, - "zoom-in": true, - "zoom-out": true, - "zoom-reset": true, - "zoom-to-fit": true, - "zoom-to-selection": true, - "next-artboard": true, - "previous-artboard": true, - }; - - channel.port1.postMessage({ name, args: { state: { ...args.state, ...state } } }, transferList); - - return; - } - - channel.port1.postMessage({ name, args }, transferList); - }, - registerCallback: function(name, args, callback) { - const id = nextCallbackID++; - registeredCallbacks.set(id, callback); - channel.port1.postMessage({ name, args, callbackID: id }); - return () => { - channel.port1.postMessage({ cancelCallbackID: id }); - }; - }, - promiseMessage: function(name, args, transferList) { - console.log("promiseMessage, name, args, transferList: ", name, args, transferList); - return new Promise((resolve, reject) => { - const id = nextPromiseID++; - pendingPromises.set(id, { resolve, reject }); - channel.port1.postMessage({ name, args, promiseID: id }, transferList); - }); - }, - setMessageHandler: function(handler) { - console.log("setMessageHandler: handler", handler); - messageHandler = handler; - tryFlushMessages(); - }, - }; - - channel.port1.onmessage = (event: MessageEvent) => { - const msg = event.data; - - if (!msg) return; - - console.log("webApi channel.port1.onmessage, event, event.data: ", event, event.data); - - if (msg.promiseID != null) { - const pendingPromise = pendingPromises.get(msg.promiseID); - - if (pendingPromise) { - pendingPromises.delete(msg.promiseID); - if ("result" in msg) { - pendingPromise.resolve(msg.result); - } else { - pendingPromise.reject(msg.error); - } - } - } else if (msg.name != null) { - messageQueue.push(msg); - tryFlushMessages(); - } - }; - - window.postMessage("init", location.origin, [channel.port2]); -}; diff --git a/src/middleware/webBinding.ts b/src/middleware/webBinding.ts index 410aa931..b53e4ee7 100644 --- a/src/middleware/webBinding.ts +++ b/src/middleware/webBinding.ts @@ -1,31 +1,20 @@ -import * as Settings from "electron-settings"; import * as E from "electron"; -import * as path from "path"; import * as fs from "fs"; import { sendMsgToMain, registerCallbackWithMainProcess } from "Utils/Render"; import { isMenuItem } from "Utils/Common"; -import { postPromiseMessageToMainProcess } from "Utils/Render"; -import { shortcutsMap } from "Utils/Render/ShortcutsMap"; -import shortcutBinding from "./shortcutBinding"; -import { ShortcutMan } from "./ShortcutMan"; -import shortcuts from "Utils/Render/shortcuts"; - -// import api from "./webApi"; +import { themes } from "./ThemesManager"; interface IntiApiOptions { version: number; fileBrowser: boolean; - shortcutBinding?: any; - shortcutsMap?: ShortcutsMap[]; - shortcutMan?: any; } -const API_VERSION = 22; +const API_VERSION = 28; let webPort: MessagePort; let fontMap: any = null; let resolveFontMapPromise: any = null; -const mainProcessCancelCallbacks: Map = new Map(); +const mainProcessCancelCallbacks: Map void> = new Map(); const fontMapPromise = new Promise(resolve => { resolveFontMapPromise = resolve; }); @@ -37,8 +26,10 @@ const onClickExportImage = (e: Event, link: HTMLLinkElement) => { const filetype: string = res.headers["content-type"][0].replace(/^.+\//, ""); console.log("response file type: ", filetype); + // TODO: rewrite execute dialogs const savePath = E.remote.dialog.showSaveDialogSync({ - defaultPath: `${Settings.get("app.exportDir")}/${link.textContent.replace(/\..+$/, "")}.${filetype}`, + // defaultPath: `${Settings.getSync("app.exportDir")}/${link.textContent.replace(/\..+$/, "")}.${filetype}`, + defaultPath: "/tmp", showsTagField: false, }); @@ -57,10 +48,10 @@ const onClickExportImage = (e: Event, link: HTMLLinkElement) => { length = chunk.length; }); res.on("error", (err: Error) => { - console.log("Export image error: ", err); + sendMsgToMain("log-error", "Export image error: ", err); }); }) - .on("error", error => console.log("request error: ", error)) + .on("error", error => sendMsgToMain("log-error", "request error: ", error)) .end(); e.preventDefault(); @@ -84,14 +75,13 @@ const onWebMessage = (event: MessageEvent) => { return; } if (!msg.name || !(msg.name in publicAPI)) { - console.error("[desktop] Unhandled message", msg.name); + sendMsgToMain("log-error", "[desktop] Unhandled message", msg.name); return; } let resultPromise = undefined; try { - if (msg.name != "setPluginMenuData") console.log("onWebMessage, msg: ", msg.name, msg.args); resultPromise = msg.name && publicAPI && publicAPI[msg.name](msg.args); } catch (e) { console.error("onWebMessage, err: ", e); @@ -114,24 +104,16 @@ const onWebMessage = (event: MessageEvent) => { } }; -// TODO: (translated) Move a piece of code into separate scripts, -// then to collect from webpack in 1 js file -// and pass it to the executeJavaScript function const initWebApi = (props: IntiApiOptions) => { const channel = new MessageChannel(); const pendingPromises = new Map(); const registeredCallbacks = new Map(); - let messageHandler: Function; + let messageHandler: (name: string, args: any) => void; let nextPromiseID = 0; let nextCallbackID = 0; const messageQueue: any[] = []; - // console.log('args: ', args, args.shortcutMan); - // const shortcutBinding = new Function(`return ${args.shortcutBinding}`); - // console.log('args.shortcutBinding: ', `return ${args.shortcutBinding}`); - // console.log('shortcutBinding(args.shortcutsMap): ', shortcutBinding()(args.shortcutsMap, args.shortcutMan)); - const tryFlushMessages = () => { if (messageHandler) { while (true) { @@ -146,8 +128,6 @@ const initWebApi = (props: IntiApiOptions) => { window.__figmaContent = false; - console.log("args.fileBrowser: ", typeof props.fileBrowser, props.fileBrowser); - if (/file\/.+/.test(location.href)) { props.fileBrowser = false; } @@ -155,8 +135,8 @@ const initWebApi = (props: IntiApiOptions) => { window.__figmaDesktop = { version: props.version, fileBrowser: props.fileBrowser, - postMessage: function(name, args, transferList) { - // console.log("postMessage, name, args, transferList: ", name, args, transferList); + postMessage: function(name, args, transferList): void { + console.log("postMessage, name, args, transferList: ", name, args, transferList); // FIXME: ugly hack if (!/recent/.test(window.location.href) && name === "updateActionState") { @@ -195,7 +175,7 @@ const initWebApi = (props: IntiApiOptions) => { const id = nextCallbackID++; registeredCallbacks.set(id, callback); channel.port1.postMessage({ name, args, callbackID: id }); - return () => { + return (): void => { registeredCallbacks.delete(id); // TODO: is it okay to delete this? will it ever be needed after cancelled? channel.port1.postMessage({ cancelCallbackID: id }); }; @@ -207,19 +187,17 @@ const initWebApi = (props: IntiApiOptions) => { channel.port1.postMessage({ name, args, promiseID: id }, transferList); }); }, - setMessageHandler: function(handler) { + setMessageHandler: function(handler: () => void): void { messageHandler = handler; tryFlushMessages(); }, }; - channel.port1.onmessage = (event: MessageEvent) => { + channel.port1.onmessage = (event: MessageEvent): void => { const msg = event.data; if (!msg) return; - console.log("webBinding channel.port1.onmessage, event.data: ", event.data); - if (msg.promiseID != null) { const pendingPromise = pendingPromises.get(msg.promiseID); @@ -228,6 +206,7 @@ const initWebApi = (props: IntiApiOptions) => { if ("result" in msg) { pendingPromise.resolve(msg.result); } else { + sendMsgToMain("log-error", msg.error); pendingPromise.reject(msg.error); } } @@ -247,11 +226,11 @@ const initWebApi = (props: IntiApiOptions) => { window.postMessage("init", location.origin, [channel.port2]); }; -const initWebBindings = () => { +const initWebBindings = (): void => { setInterval(() => { const link: HTMLLinkElement = document.querySelector('div[class^="code_inspection_panels--inspectorRow"] > a'); link && - (link.onclick = (e: Event) => { + (link.onclick = (e: Event): void => { onClickExportImage(e, link); }); }, 500); @@ -262,6 +241,10 @@ const initWebBindings = () => { E.ipcRenderer.on("handleAction", (event: Event, action: string, source: string) => { webPort.postMessage({ name: "handleAction", args: { action, source } }); }); + E.ipcRenderer.on("handleUrl", (event: Event, path: string, params: string) => { + console.log("handleUrl, url: ", path); + webPort.postMessage({ name: "handleUrl", args: { path, params } }); + }); E.ipcRenderer.on("handlePageCommand", (event: Event, command: string) => { const fullscreenFocusTargetFocused = document.activeElement && document.activeElement.classList.contains("focus-target"); @@ -293,13 +276,17 @@ const initWebBindings = () => { } }); + E.ipcRenderer.on("redeemAppAuth", (event: Event, gSecret: string) => { + webPort.postMessage({ name: "redeemAppAuth", args: { gSecret } }); + }); + E.ipcRenderer.on("handlePluginMenuAction", (event: Event, pluginMenuAction: any) => { webPort.postMessage({ name: "handlePluginMenuAction", args: { pluginMenuAction } }); }); }; const publicAPI: any = { - setTitle(args: any) { + setTitle(args: WebApi.SetTitleArgs) { sendMsgToMain("setTabUrl", window.location.href); sendMsgToMain("setTitle", args.title); }, @@ -316,7 +303,10 @@ const publicAPI: any = { sendMsgToMain("newFile", args.info); }, openFile(args: any) { - sendMsgToMain("openTab", "/file/" + args.fileKey, args.title, undefined, args.target); + sendMsgToMain("openFile", "/file/" + args.fileKey, args.title, undefined, args.target); + }, + openPrototype(args: any) { + sendMsgToMain("openFile", "/proto/" + args.fileKey, args.title, "?node-id=" + args.pageId, args.target); }, close(args: any) { sendMsgToMain("closeTab", args.suppressReopening); @@ -339,60 +329,64 @@ const publicAPI: any = { setIsPreloaded() { sendMsgToMain("setIsPreloaded"); }, - setPluginMenuData(args: WepApi.SetPluginMenuDataProps) { + setPluginMenuData(args: WebApi.SetPluginMenuDataProps) { const pluginMenuData = []; for (const item of args.data) { if (isMenuItem(item)) { pluginMenuData.push(item); } else { - console.error("[desktop] invalid plugin menu item", args); + sendMsgToMain("log-error", "[desktop] invalid plugin menu item", args); } } sendMsgToMain("setPluginMenuData", pluginMenuData); }, - async createMultipleNewLocalFileExtensions(args: any) { - const result = await postPromiseMessageToMainProcess( - "createMultipleNewLocalFileExtensions", - args.options, - args.depth, - ); + setFeatureFlags(args: any) { + sendMsgToMain("setFeatureFlags", args); + }, + startAppAuth(args: any) { + sendMsgToMain("startAppAuth", args); + }, + finishAppAuth(args: any) { + sendMsgToMain("finishAppAuth", args); + }, + openDevTools(args: { mode: string }) { + sendMsgToMain("openDevTools", args.mode); + }, + + async createMultipleNewLocalFileExtensions(args: WebApi.CreateMultipleExtension) { + const result = await E.ipcRenderer.invoke("createMultipleNewLocalFileExtensions", args); + return { data: result }; }, async getAllLocalFileExtensionIds() { - const list = await postPromiseMessageToMainProcess("getAllLocalFileExtensionIds"); + const list = await E.ipcRenderer.invoke("getAllLocalFileExtensionIds"); return { data: list }; }, - async getLocalFileExtensionManifest(args: any) { - const manifest = await postPromiseMessageToMainProcess("getLocalFileExtensionManifest", args.id); + async getLocalFileExtensionManifest(args: WebApi.ExtensionId) { + const manifest = await E.ipcRenderer.invoke("getLocalFileExtensionManifest", args.id); return { data: manifest }; }, - async getLocalFileExtensionSource(args: any) { - const source = await postPromiseMessageToMainProcess("getLocalFileExtensionSource", args.id); + async getLocalFileExtensionSource(args: WebApi.ExtensionId) { + const source = await E.ipcRenderer.invoke("getLocalFileExtensionSource", args.id); return { data: source }; }, - removeLocalFileExtension(args: any) { - console.log("unimplemented removeLocalFileExtension", args); - sendMsgToMain("removeLocalFileExtension", args.id); + removeLocalFileExtension(args: WebApi.ExtensionId) { + E.ipcRenderer.send("removeLocalFileExtension", args.id); }, - openExtensionDirectory(args: any) { - console.log("unimplemented openExtensionDirectory", args); - sendMsgToMain("openExtensionDirectory", args.id); + openExtensionDirectory(args: WebApi.ExtensionId) { + E.ipcRenderer.send("openExtensionDirectory", args.id); }, - async writeNewExtensionToDisk(args: any) { - // args looks like {dirName: "user-typed plugin name", files: [ - // {name: "filename.js", content: "filecontents"} - // ]} - // TODO: data is supposed to be the extensionId of the new extension! - console.log("unimplemented writeNewExtensionToDisk", args); - const extId = await postPromiseMessageToMainProcess("writeNewExtensionToDisk", args); + async writeNewExtensionToDisk(args: WebApi.WriteNewExtensionToDiskArgs) { + const extId = await E.ipcRenderer.invoke("writeNewExtensionToDisk", args); return { data: extId }; }, - async isDevToolsOpened(...args: any[]) { - console.log("unimplemented isDevToolsOpened, args: ", args); - return { data: true }; + async isDevToolsOpened() { + const isOpened = await E.ipcRenderer.invoke("isDevToolsOpened"); + + return { data: isOpened }; }, getFontFile(args: any) { @@ -400,12 +394,14 @@ const publicAPI: any = { const fontPath = args.path; if (!fontMap) { + sendMsgToMain("log-error", "No fonts"); reject(new Error("No fonts")); return; } const faces = fontMap[fontPath]; if (!faces || faces.length === 0) { + sendMsgToMain("log-error", "Invalid path: ", fontPath); reject(new Error("Invalid path")); return; } @@ -434,6 +430,7 @@ const publicAPI: any = { getClipboardData(args: any) { return new Promise((resolve, reject) => { if (E.clipboard.has("org.nspasteboard.ConcealedType")) { + sendMsgToMain("log-error", "Clipboard unavailable"); reject(new Error("Clipboard unavailable")); return; } @@ -449,7 +446,7 @@ const publicAPI: any = { const unsafeHTML = E.clipboard.readHTML().trim(); if (unsafeHTML.includes("")) { - data = new Buffer(unsafeHTML); + data = Buffer.from(unsafeHTML); } } else if (format === "image/svg+xml") { data = E.clipboard.readBuffer(format); @@ -459,7 +456,7 @@ const publicAPI: any = { if (data.byteLength === 0) { const unsafeText = E.clipboard.readText().trim(); if (unsafeText.startsWith("")) { - data = new Buffer(unsafeText); + data = Buffer.from(unsafeText); } } } else if (format === "image/jpeg" || format === "image/png") { @@ -478,6 +475,8 @@ const publicAPI: any = { return; } } + + sendMsgToMain("log-error", "Formats not found. Formats: ", formats); reject(new Error("Formats not found")); }); }, @@ -497,127 +496,18 @@ const publicAPI: any = { } }, - writeFiles(args: any) { - console.log("writeFiles args: ", args); - const files = args.files; - if (!Array.isArray(files) || files.length === 0) return; - - let skipReplaceConfirmation = false; - let directoryPath; - if (files.length === 1 && !files[0].name.includes(path.sep)) { - const originalFileName = files[0].name; - const savePath = E.remote.dialog.showSaveDialogSync({ - defaultPath: `${Settings.get("app.exportDir")}/${originalFileName}`, - showsTagField: false, - }); - - if (savePath) { - directoryPath = path.dirname(savePath); - files[0].name = path.basename(savePath); - - if (path.extname(files[0].name) === "") { - files[0].name += path.extname(originalFileName); - } else { - skipReplaceConfirmation = true; - } - } - } else { - const directories = E.remote.dialog.showOpenDialogSync({ - properties: ["openDirectory", "createDirectory"], - buttonLabel: "Save", - }); - - if (!directories || directories.length !== 1) { - return; - } - directoryPath = directories[0]; - } - - if (!directoryPath) return; - - directoryPath = path.resolve(directoryPath); - let filesToBeReplaced = 0; - for (const file of files) { - const outputPath = path.join(directoryPath, file.name); - const validExtensions = [".fig", ".jpg", ".pdf", ".png", ".svg"]; - if ( - path.relative(directoryPath, outputPath).startsWith("..") || - !validExtensions.findIndex(i => i === path.extname(outputPath)) - ) { - E.remote.dialog.showMessageBoxSync({ - type: "error", - title: "Export Failed", - message: "Export failed", - detail: `"${outputPath}" is not a valid path. No files were saved.`, - buttons: ["OK"], - defaultId: 0, - }); - return; - } - try { - fs.accessSync(outputPath, fs.constants.R_OK); - ++filesToBeReplaced; - } catch (ex) {} - } - if (filesToBeReplaced > 0 && !skipReplaceConfirmation) { - const single = filesToBeReplaced === 1; - const selectedID = E.remote.dialog.showMessageBoxSync({ - type: "warning", - title: "Replace Existing Files", - message: `Replace existing file${single ? "" : `s`}?`, - detail: `${ - single - ? `"${files[0].name}" already exists` - : `${filesToBeReplaced} files including "${files[0].name}" already exist` - }. Replacing ${single ? "it" : "them"} will overwrite ${single ? "its" : "their"} existing contents.`, - buttons: ["Replace", "Cancel"], - defaultId: 0, - }); - if (selectedID !== 0) { - return; - } - } - for (const file of files) { - { - const parts = file.name.split("/"); - parts.pop(); - let dirPath = directoryPath; - for (const part of parts) { - try { - dirPath = path.join(dirPath, part); - fs.mkdirSync(dirPath); - } catch (ex) {} - } - } - - try { - const outputPath = path.join(directoryPath, file.name); - const opts = { encoding: "binary" }; - fs.writeFileSync(outputPath, Buffer.from(file.buffer), opts); - } catch (ex) { - E.remote.dialog.showMessageBox({ - type: "error", - title: "Export Failed", - message: "Saving file failed", - detail: `"${file.name}" could not be saved. Remaining files will not be saved.`, - buttons: ["OK"], - defaultId: 0, - }); - } - } + async writeFiles(args: WebApi.WriteFiles) { + await E.ipcRenderer.invoke("writeFiles", args); }, }; -const init = (fileBrowser: boolean) => { +const init = (fileBrowser: boolean): void => { window.addEventListener( "message", event => { - // console.log(`window message, ${event.origin} === ${location.origin}, data, ports: `, event.data, event.ports); webPort = event.ports[0]; console.log(`window message, webPort: `, webPort); webPort && (webPort.onmessage = onWebMessage); - // console.log('window.__figmaDesktop.fileBrowser: ', window.__figmaDesktop.fileBrowser); - // window.__figmaDesktop.fileBrowser = false; }, { once: true }, ); @@ -625,19 +515,19 @@ const init = (fileBrowser: boolean) => { const initWebOptions: IntiApiOptions = { version: API_VERSION, fileBrowser: fileBrowser, - shortcutBinding: shortcutBinding.toString(), - shortcutsMap, - shortcutMan: ShortcutMan.toString(), }; console.log("init(): window.parent.document: ", window.parent.document.body); initWebBindings(); - // console.log('api: ', api.toString()); E.webFrame.executeJavaScript(`(${initWebApi.toString()})(${JSON.stringify(initWebOptions)})`); - shortcuts(); + document.addEventListener("DOMContentLoaded", () => { + setTimeout(() => { + themes.init(); + }, 10); + }); }; export default init; diff --git a/src/package.json b/src/package.json index 373e2af0..2dca8575 100755 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "figma-linux", - "version": "0.6.4", + "version": "0.7.0", "description": "Figma is the first interface design tool based in the browser, making it easier for teams to create software. Join as in Telegram: https://t.me/figma_linux", "main": "main/main.js", "repository": "git@github.com:ChugunovRoman/figma-linux.git", @@ -8,17 +8,18 @@ "author": "ChugunovRoman ", "license": "MIT", "dependencies": { + "adm-zip": "^0.5.1", "chokidar": "^3.0.2", "electron-devtools-installer": "^2.2.4", "figma-linux-rust-binding": "=0.1.4", "electron-build-env": "^0.2", - "electron-settings": "github:ChugunovRoman/electron-settings#figma-linux", + "electron-settings": "^4.0.2", + "lodash": "^4.17.20", "mobx": "^5.0.3", "mobx-react": "^5.2.8", - "mobx-state-router": "^4.0.3", "react": "^16.5.2", "react-dom": "^16.5.2", - "react-router-dom": "^4.3.1", - "source-map-support": "^0.5.6" + "source-map-support": "^0.5.6", + "uuid": "^8.3.2" } } diff --git a/src/renderer/animations.scss b/src/renderer/animations.scss new file mode 100644 index 00000000..0dd33eeb --- /dev/null +++ b/src/renderer/animations.scss @@ -0,0 +1,15 @@ +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.spin { + animation-name: spin; + animation-duration: 1000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} diff --git a/src/renderer/colors.scss b/src/renderer/colors.scss index 30e59403..a8d7fc77 100644 --- a/src/renderer/colors.scss +++ b/src/renderer/colors.scss @@ -1,12 +1,21 @@ + +$css-vars-use-native: true; + $white_1: #fff; $black_1: #050505; $black_2: #333333; +$black_3: #222222; $llgray_1: #F2F2F2; $lgray_1: #D1D1D1; +$lgray_2: #828282; $gray_1: #2c2c2c; -$gray_2: #C0C0C0; +$gray_2: #444444; $blue_1: #30C2FF; -$blue_2: #D8F3FF; +$blue_2: #d8f3ffff; + +$red_1: #e81123; + +$second_text_color: #B3B3B3; diff --git a/src/renderer/components/Body/Settings/index.tsx b/src/renderer/components/Body/Settings/index.tsx deleted file mode 100644 index ab754864..00000000 --- a/src/renderer/components/Body/Settings/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -// import * as E from "electron"; -import * as React from "react"; -import { observer, inject } from "mobx-react"; -import { RouterView, ViewMap } from "mobx-state-router"; - -import "./style.scss"; -import PanelBody from "./panel"; -import General from "./views/General"; -import Shortcuts from "./views/Shortcuts"; -import { Routes } from "Store/Routes"; - -interface SettingsProps { - route?: Routes; -} - -const routeMap: ViewMap = { - general: , - shortcuts: , -}; - -@inject("route") -@observer -class Settings extends React.Component { - props: SettingsProps; - - constructor(props: SettingsProps) { - super(props); - - this.props = props; - } - render() { - return ( -

- -
- -
-
- ); - } -} - -export default Settings; diff --git a/src/renderer/components/Body/Settings/panel.tsx b/src/renderer/components/Body/Settings/panel.tsx deleted file mode 100755 index 4ccdcfeb..00000000 --- a/src/renderer/components/Body/Settings/panel.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import * as React from "react"; -import { Route } from "mobx-state-router"; - -import "./style.scss"; -import { Routes } from "Store/Routes"; - -interface SettingsPanelProps { - route?: Routes; - currentRoute: Route; -} - -const SettingsPanel: React.SFC = props => { - // FIXME: maybe, there are have another way how - // to show the general page in first render - if (props.currentRoute.name === "__initial__") { - props.route.route.goTo("general"); - } - - const goTo = (to: string) => { - props.route.route.goTo(to); - }; - - return ( -
-
goTo("general")}> -
-
- - - - -
-

General

-
-
- {/*
goTo('shortcuts')}> -
-
- - - - - - - - -
-

Shortcuts

-
-
*/} -
- ); -}; - -export default SettingsPanel; diff --git a/src/renderer/components/Body/Settings/style.scss b/src/renderer/components/Body/Settings/style.scss deleted file mode 100644 index 36e5cf48..00000000 --- a/src/renderer/components/Body/Settings/style.scss +++ /dev/null @@ -1,55 +0,0 @@ -@import '../../../colors.scss'; - -#settings { - display: grid; - grid-template-columns: minmax(140px, 287px) auto; - grid-template-rows: 1; - height: 100%; - - &>.panel { - border-right: 2px solid $lgray_1; - - .item { - display: flex; - padding: 0 20px; - align-items: center; - justify-content: left; - transition: background-color .1s ease; - - &:hover { - background-color: $blue_1; - cursor: pointer; - } - &.active { - background-color: $blue_1; - & .label { - color:$white_1; - } - } - - &>.icon { - width: 38px; - } - - &>.label { - font: { - size: 18px; - weight: 500; - } - - margin: 12px 0px; - color: $black_2; - } - } - } - - &>.body { - padding: 10px 30px 10px 20px; - background-color: $llgray_1; - - & h1, h2 { - text-align: center; - color: $black_2 - } - } -} \ No newline at end of file diff --git a/src/renderer/components/Body/Settings/views/General/index.scss b/src/renderer/components/Body/Settings/views/General/index.scss deleted file mode 100644 index 85b24acf..00000000 --- a/src/renderer/components/Body/Settings/views/General/index.scss +++ /dev/null @@ -1,28 +0,0 @@ -@import '../../../../../colors.scss'; - -.general { - padding-bottom: 20px; - .section { - padding-bottom: 20px; - border-bottom: 1px solid $gray_2; - - .selectFolder { - display: flex; - justify-content: space-between; - } - } - - .add { - align-self: center; - - &:hover { - cursor: pointer; - } - } - - .button { - &:hover { - cursor: pointer; - } - } -} \ No newline at end of file diff --git a/src/renderer/components/Body/Settings/views/General/index.tsx b/src/renderer/components/Body/Settings/views/General/index.tsx deleted file mode 100644 index ab7c093a..00000000 --- a/src/renderer/components/Body/Settings/views/General/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import * as React from "react"; -import { observer, inject } from "mobx-react"; - -import "./index.scss"; -import { Input, Area, CheckBox } from "Elements"; -import { InputTypes } from "Elements/input"; -import { Settings } from "Store/Settings"; - -interface GeneralBodyProps { - settings?: Settings; -} - -const GeneralBody: React.SFC = props => { - return ( -
-

General Settings

-
-
-
-
-

Scale Figma UI

- props.settings.updateFigmaUiScale(d)} - /> -
-
-

Scale Tab Panel

- props.settings.updatePanelScale(d)} - /> -
-
-
-

Auto hide the Main menu (toggle by Alt key)

- -
-
-

Disable menu (The app will be reload)

- -
-
-

Do save the last opened tabs?

- -
-
-

Window frame

- -
-
-

Disable Local Fonts

- -
-
-
-
-

Default export directory

-
- props.settings.inputExportDir(e.target.value)} - /> -
props.settings.selectExportDir()}> - - - - -
-
-
-
-

Font directories

-
props.settings.addDir()}> - - - -
- -
-
-
-
- ); -}; - -export default inject("settings")(observer(GeneralBody)); diff --git a/src/renderer/components/Body/Settings/views/Shortcuts/index.tsx b/src/renderer/components/Body/Settings/views/Shortcuts/index.tsx deleted file mode 100644 index d88a5f9c..00000000 --- a/src/renderer/components/Body/Settings/views/Shortcuts/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import * as React from "react"; - -const ShortcutsBody: React.SFC<{}> = props => { - return ( -
-

Shortcuts Settings

-
- ); -}; - -export default ShortcutsBody; diff --git a/src/renderer/components/Body/index.tsx b/src/renderer/components/Body/index.tsx deleted file mode 100644 index 98c082cd..00000000 --- a/src/renderer/components/Body/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; -import { observer, inject } from "mobx-react"; - -import SettingsComponent from "./Settings"; -import { isComponentUrl, getComponentTitle } from "Utils/Common"; -import { Settings } from "Store/Settings"; - -interface BodyProps { - tabs?: TabsStore; - settings?: Settings; -} - -@inject("tabs") -@inject("settings") -@observer -class Body extends React.Component { - props: BodyProps; - private components: any; - - constructor(props: BodyProps) { - super(props); - - this.props = props; - this.components = { - Settings: , - }; - } - - private loadComponent = () => { - const tabs = this.props.tabs.tabs; - const currentTabId = this.props.tabs.current; - const currentTab = tabs.find(t => t.id === currentTabId); - - if (currentTab && isComponentUrl(currentTab.url)) { - const name = getComponentTitle(currentTab.url); - - return this.components[name]; - } - - return ""; - }; - - render() { - return ( -
- {this.loadComponent()} -
- ); - } -} - -export default Body; diff --git a/src/renderer/components/Header/index.tsx b/src/renderer/components/Header/index.tsx new file mode 100755 index 00000000..09767293 --- /dev/null +++ b/src/renderer/components/Header/index.tsx @@ -0,0 +1,32 @@ +import * as React from "react"; + +import { Text, Button, Icon } from "Elements"; + +import "./style.scss"; + +interface HeaderProps { + text: string; + textAlign?: "left" | "right" | "center"; + displayCloseButton?: boolean; + className?: string; + additionalContent?: React.ReactElement; + onCloseClick?(e: React.MouseEvent): void; +} + +const Header: React.FunctionComponent = props => { + return ( +
+ {props.text} +
{props.additionalContent || null}
+ {props.displayCloseButton ? ( + + ) : ( + "" + )} +
+ ); +}; + +export default Header; diff --git a/src/renderer/components/Header/style.scss b/src/renderer/components/Header/style.scss new file mode 100644 index 00000000..d0404fb7 --- /dev/null +++ b/src/renderer/components/Header/style.scss @@ -0,0 +1,23 @@ +.header { + display: grid; + grid-template-columns: 1fr 50px 20px; + justify-content: space-between; + background-color: var(--bg-header); + padding: 10px 14px 10px 30px; + align-items: center; + height: 30px; + + &__text { + padding: 0; + margin: 0; + color: var(--fg-header); + fill: var(--fg-header); + } + &__additional { + display: flex; + } + &__close { + color: var(--fg-header-control); + fill: var(--fg-header-control); + } +} diff --git a/src/renderer/components/Settings/index.tsx b/src/renderer/components/Settings/index.tsx new file mode 100644 index 00000000..035177fc --- /dev/null +++ b/src/renderer/components/Settings/index.tsx @@ -0,0 +1,83 @@ +import * as E from "electron"; +import * as React from "react"; +import { observer, inject } from "mobx-react"; + +import "./style.scss"; +import { Text, Button, Icon } from "Elements"; +import Header from "../Header"; +import General from "./views/General"; +import Themes from "./views/Themes"; +import { Views } from "Store/Views"; +import { Settings as SettingsStore } from "Store/Settings"; + +interface SettingsProps { + settings?: SettingsStore; + views?: Views; +} + +@inject("settings") +@inject("views") +@observer +class Settings extends React.Component { + props: SettingsProps; + viewMap = { + General, + Themes, + }; + + constructor(props: SettingsProps) { + super(props); + + this.props = props; + } + + onCloseClick = (e: React.MouseEvent): void => { + e.nativeEvent.stopImmediatePropagation(); + e.stopPropagation(); + + this.props.settings!.setSettings(); + + E.ipcRenderer.send("closeSettingsView"); + }; + + onSyncThemes = () => { + E.ipcRenderer.send("sync-themes"); + }; + + render(): JSX.Element { + const View = this.viewMap[this.props.views.settingsView]; + const viewName = this.props.views.settingsView; + const isSyncDisabled = this.props.settings!.isSyncDisabled; + + return ( +
+
this.onSyncThemes()} disabled={isSyncDisabled}> + + + ) : null + } + onCloseClick={this.onCloseClick} + /> +
+
this.props.views.setSettingsView("General")}> + General +
+
this.props.views.setSettingsView("Themes")}> + Themes +
+
+
+ +
+
+ ); + } +} + +export default Settings; diff --git a/src/renderer/components/Settings/style.scss b/src/renderer/components/Settings/style.scss new file mode 100644 index 00000000..adc9ecae --- /dev/null +++ b/src/renderer/components/Settings/style.scss @@ -0,0 +1,56 @@ +.settings { + padding: 5% 0px; + width: 70%; + margin: auto; + height: -webkit-fill-available; + + &__header { + border-top: 1px solid var(--borders); + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + } + + &__panel { + display: flex; + justify-content: left; + align-items: center; + background: var(--bg-toolbar); + color: var(--bg-panel); + padding: 14px 10px 14px 30px; + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + } + + &__body { + overflow: scroll; + overflow-x: hidden; + overflow-y: overlay; + background: var(--bg-panel); + padding: 20px 30px; + height: 80%; + border-bottom: 1px solid var(--borders); + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + + &::-webkit-scrollbar { + width: 0px; + background: transparent; + } + &::-webkit-scrollbar-thumb { + width: 0; + background: transparent; + } + } + + &__tab { + padding: 10px 0px; + margin-right: 36px; + background: var(--bg-toolbar); + border: 0; + + &:hover { + cursor: pointer; + background: var(--bg-toolbar); + } + } +} diff --git a/src/renderer/components/Settings/views/General/index.scss b/src/renderer/components/Settings/views/General/index.scss new file mode 100644 index 00000000..49e91acf --- /dev/null +++ b/src/renderer/components/Settings/views/General/index.scss @@ -0,0 +1,17 @@ +.general { + padding-bottom: 20px; + + .add { + align-self: center; + + &:hover { + cursor: pointer; + } + } + + .button { + &:hover { + cursor: pointer; + } + } +} diff --git a/src/renderer/components/Settings/views/General/index.tsx b/src/renderer/components/Settings/views/General/index.tsx new file mode 100644 index 00000000..994f34e0 --- /dev/null +++ b/src/renderer/components/Settings/views/General/index.tsx @@ -0,0 +1,119 @@ +import * as React from "react"; +import { observer, inject } from "mobx-react"; + +import "./index.scss"; +import { Input, List, CheckBox, Text, Button, Icon } from "Elements"; +import { Settings } from "Store/Settings"; +import ListItems from "./listItems"; + +interface GeneralBodyProps { + settings?: Settings; +} + +const GeneralBody: React.FunctionComponent = props => { + return ( +
+
+
+ Scale UI + props.settings.updateFigmaUiScale(d)} + /> +
+
+
+ Scale Tabs + props.settings.updatePanelScale(d)} + /> +
+
+
+
+ Main settings + + + +
+
+
+ Export files to +
+ props.settings.selectExportDir()}> + + + } + value={props.settings.settings.app.exportDir} + onChange={(e): void => props.settings.inputExportDir(e.target.value)} + /> +
+
+
+
+
+ Font directories +
+
+
+
+
+ {/* + UI font + + */} +
+
+
+ ); +}; + +export default inject("settings")(observer(GeneralBody)); diff --git a/src/renderer/components/Settings/views/General/listItems.tsx b/src/renderer/components/Settings/views/General/listItems.tsx new file mode 100644 index 00000000..a9ead204 --- /dev/null +++ b/src/renderer/components/Settings/views/General/listItems.tsx @@ -0,0 +1,31 @@ +import * as React from "react"; + +import "./index.scss"; +import { Icon } from "Elements"; + +interface GeneralBodyProps { + items: string[]; + + onRemove?(index: number): void; +} + +const ListItems: React.FunctionComponent = props => { + return ( + + {props.items.map((item, i) => ( +
+ {props.onRemove ? ( +
props.onRemove(i)}> + +
+ ) : ( + "" + )} + {item} +
+ ))} +
+ ); +}; + +export default ListItems; diff --git a/src/renderer/components/Settings/views/Themes/index.scss b/src/renderer/components/Settings/views/Themes/index.scss new file mode 100644 index 00000000..edded41f --- /dev/null +++ b/src/renderer/components/Settings/views/Themes/index.scss @@ -0,0 +1,127 @@ +.themeview { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + grid-column-gap: 3%; + grid-row-gap: 3%; + + &_item { + &_tumbl { + flex-direction: column; + height: 159px; + border: 1px solid var(--borders); + border-radius: 6px 6px 0 0; + + &_top { + height: 8px; + background-color: var(--bg-header); + border-radius: 6px 6px 0 0; + } + + &_toolpanel { + display: grid; + grid-template-columns: 60px 1fr 60px; + height: 24px; + align-items: center; + background-color: var(--bg-toolbar); + + &>div { + display: flex; + align-items: flex-end; + } + + &>div:nth-child(1) { + padding-left: 6px; + } + + &>div:nth-child(2) { + justify-content: center; + } + + } + + &_body { + display: grid; + grid-template-columns: 60px 1fr 60px; + height: 127px; + + &_left { + padding-left: 8px; + padding-top: 10px; + background-color: var(--bg-panel); + border-right: 1px solid var(--borders); + + &_text1 { + width: 40px; + height: 4px; + background-color: var(--text); + } + + &_text2 { + margin-top: 6px; + width: 28px; + height: 4px; + background-color: var(--text); + } + } + + &_center { + background-color: var(--borders); + } + + &_right { + border-left: 1px solid var(--borders); + background-color: var(--bg-panel); + } + } + + &_panel { + display: flex; + justify-content: space-between; + padding: 14px; + border-radius: 0 0 6px 6px; + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + border-bottom: 1px solid var(--borders); + + &_name { + max-width: 10vw; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-size: 16px; + color: var(--text-active); + } + + &_author { + font-size: 12px; + max-width: 10vw; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: var(--text-disabled); + } + + &>div { + display: flex; + } + + &>div:nth-child(1) { + flex-direction: column; + } + + &>div:nth-child(2) { + align-self: center; + } + + } + } + } +} + +.template_button { + height: 14px; + width: 30px; + border-radius: 2px; + background: var(--bg-toolbar-active); + margin: 1px; +} diff --git a/src/renderer/components/Settings/views/Themes/index.tsx b/src/renderer/components/Settings/views/Themes/index.tsx new file mode 100644 index 00000000..af56c156 --- /dev/null +++ b/src/renderer/components/Settings/views/Themes/index.tsx @@ -0,0 +1,55 @@ +import * as React from "react"; +import { observer, inject } from "mobx-react"; +import { toJS } from "mobx"; + +import { DEFAULT_THEME, TEST_THEME_ID } from "Const"; + +import ThemeItem from "./themeItem"; +import { Themes as ThemesStore } from "Store/Themes"; +import { Settings } from "Store/Settings"; +import "./index.scss"; + +interface ThemeViewProps { + settings?: Settings; + themes?: ThemesStore; +} + +@inject("settings") +@inject("themes") +@observer +class ThemesBody extends React.Component { + props: ThemeViewProps; + + constructor(props: ThemeViewProps) { + super(props); + + this.props = props; + } + + onClickApply = (e: React.MouseEvent, theme: Themes.Theme): void => { + this.props.themes.changeTheme(theme.id); + }; + onClickDefaultThemeApply = (e: React.MouseEvent): void => { + this.props.themes.changeTheme("0"); + }; + + render(): JSX.Element { + const themes = toJS(this.props.themes.themes); + const currentTheme = toJS(this.props.themes.currentTheme); + + return ( +
+
+ + {themes.map(theme => + theme.id !== TEST_THEME_ID ? ( + + ) : null, + )} +
+
+ ); + } +} + +export default ThemesBody; diff --git a/src/renderer/components/Settings/views/Themes/themeItem.tsx b/src/renderer/components/Settings/views/Themes/themeItem.tsx new file mode 100644 index 00000000..bf3a4584 --- /dev/null +++ b/src/renderer/components/Settings/views/Themes/themeItem.tsx @@ -0,0 +1,60 @@ +import * as React from "react"; + +import { Button, Text, Icon } from "Elements"; +import { getColorPallet } from "Utils/Render"; + +import "./index.scss"; + +interface ThemeViewItemProps { + currentTheme: string; + theme: Themes.Theme; + + onClickApply(e: React.MouseEvent, theme: Themes.Theme): void; +} + +const ThemeItem: React.FunctionComponent = props => { + const theme = props.theme; + const pallet = getColorPallet(theme); + + return ( +
+
+
+
+
+ + +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ {theme.name} + {theme.author} +
+
+
+ ); +}; + +export default ThemeItem; diff --git a/src/renderer/components/Tabs/index.tsx b/src/renderer/components/Tabs/index.tsx index 2268aaf6..e66dbf15 100755 --- a/src/renderer/components/Tabs/index.tsx +++ b/src/renderer/components/Tabs/index.tsx @@ -4,7 +4,7 @@ import { observer, inject } from "mobx-react"; import { toJS } from "mobx"; import * as Const from "Const"; -import { isComponentUrl } from "Utils/Common"; +import { isValidProjectLink } from "Utils/Common"; import TabList from "./tabs"; import "./style.scss"; @@ -14,8 +14,10 @@ interface TabsProps { @inject("tabs") @observer -class Tabs extends React.Component { +class Tabs extends React.Component { props: TabsProps; + private pos = { x: 0, y: 0 }; + private isMoving = false; constructor(props: TabsProps) { super(props); @@ -23,124 +25,33 @@ class Tabs extends React.Component { this.props = props; } - private close = (e: React.MouseEvent & Event, id: number) => { + private close = (e: React.MouseEvent & Event, id: number): void => { e.stopPropagation(); - const tabs = toJS(this.props.tabs!.tabs); - const tab = this.props.tabs.getTab(id); - const currentTabId: number = toJS(this.props.tabs!.current); - const index: number = tabs.findIndex(t => t.id === id); + const tabs = toJS(this.props.tabs.tabs); + const currentTabId: number | undefined = toJS(this.props.tabs.current); + const currentTabIndex: number = tabs.findIndex(t => t.id === id); - if (isComponentUrl(tab.url)) { - E.ipcRenderer.send(Const.MAINTAB); - } else { - E.ipcRenderer.send(Const.CLOSETAB, id); - } + E.ipcRenderer.send("closeTab", id); this.props.tabs.deleteTab(id); - if (id !== currentTabId) return; + if (!currentTabId || id !== currentTabId) return; - if (isComponentUrl(tab.url)) { - this.props.tabs!.setFocus(1); - } else { - this.props.tabs!.setFocus(index !== 0 ? tabs[index > 0 ? index - 1 : index].id : 1); - } + const index = currentTabIndex > 0 ? currentTabIndex - 1 : currentTabIndex; + const nextTab = this.props.tabs!.tabs[index]; + + this.props.tabs.setFocus(nextTab ? nextTab.id : undefined); }; - private clickTab = (e: React.MouseEvent & Event, tab: Tab) => { + private clickTab = (e: React.MouseEvent & Event, tab: Tab): void => { e.stopPropagation(); switch (e.button) { - // Handle left click, set focuse on the target tab + // Handle left click, set focus on the target tab case 0: { - const tabEl = e.target as any; - this.focus(e, tab.id); - - // Move tab - // if (/tab/.test(tabEl.className)) { - // const currentTab: Tab = this.props.tabs.tabs.find(t => t.id === tab.id ) - // const TabContainer = tabEl.parentNode as any; - // const TabContainerRect = TabContainer.getBoundingClientRect(); - // const TabBox = tabEl.getBoundingClientRect(); - // const BoxXShift = event.pageX - TabBox.left; - // let fakeTab: any; - // let fakeTabBox: ClientRect | DOMRect; - // let fakeTabClassName: string; - // let shift = 1; - // let isMove = false; - - // const onMouseMove = (e: MouseEvent) => { - // const TabBoxUpdated = tabEl.getBoundingClientRect(); - // const left = Math.abs(e.pageX - (BoxXShift + TabBox.width)); - - // tabEl.style.position = 'absolute'; - // tabEl.style.zIndex = '1000'; - // tabEl.style.height = '28px'; - - // if (!isMove) { - // this.props.tabs.updateTab({ ...currentTab, moves: true }); - // fakeTab = document.getElementsByClassName('fakeTab')[0] as any; - // fakeTabBox = fakeTab.getBoundingClientRect(); - // fakeTabClassName = fakeTab.className; - // isMove = true; - // } - - // // left side restriction - // if ((e.pageX + (TabBox.left - BoxXShift)) > TabContainerRect.right) { - // return; - // } - - // // right side restriction - // if ((e.pageX - BoxXShift) < TabContainerRect.left) { - // shift += 3; - - // if (Math.floor((left / shift) < 0 ? 0 : (left / shift)) !== 0) { - // tabEl.style.left = `-${left / shift}px`; - // } else { - // tabEl.style.left = `0px`; - // } - - // return; - // } - - // if (TabBoxUpdated.left > fakeTabBox.right - 30) { - // console.log('Move tab to right ', TabBoxUpdated.left, fakeTabBox.right - 30); - // // fakeTab.className = fakeTabClassName.replace(/order(\d)/, match => { - // // let order = parseInt(match.replace(/\D/g, '')); - // // return 'order' + (order + 2); - // // }); - // this.props.tabs.updateTab({ ...currentTab, order: currentTab.order + 2 }); - // } - - // if (TabBoxUpdated.right < fakeTabBox.left + 30) { - // console.log('Move tab to left ', TabBoxUpdated.right, fakeTabBox.left + 30); - // // fakeTab.className = fakeTabClassName.replace(/order(\d)/, match => { - // // let order = parseInt(match.replace(/\D/g, '')); - // // return 'order' + (order - 2); - // // }); - // this.props.tabs.updateTab({ ...currentTab, order: currentTab.order - 2 }); - // } - - // tabEl.style.left = `${left}px`; - // shift = 0; - // }; - // const onMouseUp = (e: MouseEvent) => { - // tabEl.style.position = 'relative'; - // tabEl.style.left = `0px`; - // tabEl.style.zIndex = '0'; - - // this.props.tabs.updateTab({ id: currentTab.id, moves: false }); - - // document.removeEventListener('mousemove', onMouseMove); - // document.removeEventListener('mouseup', onMouseUp); - // }; - - // document.addEventListener('mousemove', onMouseMove) - // document.addEventListener('mouseup', onMouseUp); - // } } break; // Handle middle click, close tab @@ -158,45 +69,52 @@ class Tabs extends React.Component { } }; - private focus = (event: React.MouseEvent & Event, id: number) => { + private focus = (event: React.MouseEvent & Event, id: number): void => { event.stopPropagation(); event.nativeEvent.stopImmediatePropagation(); - const tab = this.props.tabs.getTab(id); - if (isComponentUrl(tab.url)) { - E.ipcRenderer.send(Const.CLEARVIEW); - } else { - E.ipcRenderer.send(Const.FOCUSTAB, id); - } + E.ipcRenderer.send("setTabFocus", id); - this.props.tabs!.setFocus(id); + this.props.tabs.setFocus(id); }; - private popup = (event: React.MouseEvent & Event, id: number) => { + private popup = (event: React.MouseEvent & Event, id: number): void => { const context: E.MenuItemConstructorOptions[] = [ { id: "copyAppUrl", label: "Copy App Url", - click: () => { + click: (): void => { const tab: Tab | undefined = this.props.tabs.getTab(id); - tab && E.clipboard.writeText(encodeURI(`figma://file/${tab.fileKey}/${tab.title}`)); + let url = `figma://file/${tab.fileKey}/${tab.title}`; + + if (!isValidProjectLink(tab.url)) { + url = tab.url; + } + + tab && E.clipboard.writeText(encodeURI(url)); }, }, { id: "copyUrl", label: "Copy Url", - click: () => { + click: (): void => { const tab: Tab | undefined = this.props.tabs.getTab(id); - tab && E.clipboard.writeText(`${Const.HOMEPAGE}/file/${tab.fileKey}`); + let url = `${Const.HOMEPAGE}/file/${tab.fileKey}`; + + if (!isValidProjectLink(tab.url)) { + url = tab.url; + } + + tab && E.clipboard.writeText(url); }, }, { type: "separator" }, { id: "openInBrowser", label: "Open in Browser", - click: () => { + click: (): void => { const tab: Tab | undefined = this.props.tabs.getTab(id); tab && E.remote.shell.openExternal(`${Const.HOMEPAGE}/file/${tab.fileKey}`); @@ -207,8 +125,7 @@ class Tabs extends React.Component { id: "close", label: "Close", visible: true, - click: () => { - console.log("close tab id: ", id); + click: (): void => { this.close(event, id); }, }, @@ -221,8 +138,47 @@ class Tabs extends React.Component { }); }; - render() { - return ; + private mouseDownHandler = (e: React.MouseEvent) => { + (e.target as HTMLDivElement).style.cursor = "grabbing"; + + this.isMoving = true; + this.pos.x = e.pageX; + this.pos.y = e.pageY; + + window.addEventListener("mousemove", this.mouseMoveHandler); + window.addEventListener("mouseup", this.mouseUpHandler); + }; + private mouseUpHandler = (e: MouseEvent) => { + (e.target as HTMLDivElement).style.cursor = "grab"; + this.isMoving = false; + + window.removeEventListener("mousemove", this.mouseMoveHandler); + window.removeEventListener("mouseup", this.mouseUpHandler); + }; + private mouseMoveHandler = (e: MouseEvent) => { + if (!this.isMoving) { + return; + } + + const w = E.remote.getCurrentWindow(); + const windowBounds = w.getBounds(); + + w.setBounds({ + ...windowBounds, + x: e.screenX - this.pos.x, + y: e.screenY - this.pos.y, + }); + }; + + render(): JSX.Element { + return ( + + ); } } diff --git a/src/renderer/components/Tabs/style.scss b/src/renderer/components/Tabs/style.scss index 1dbd2fb4..646a4de3 100755 --- a/src/renderer/components/Tabs/style.scss +++ b/src/renderer/components/Tabs/style.scss @@ -1,84 +1,52 @@ -@import '../../colors.scss'; - .tabBar { - position: relative; - display: flex; + position: relative; + overflow-x: hidden; + display: flex; + align-content: stretch; } .tab { - display: inline-flex; - -webkit-app-region: no-drag; - align-items: center; - padding: 0px 10px; - &:hover { - background-color: $gray_1; - } - - & > span { - position: relative; - // pointer-events: none; - user-select: none; - cursor: default; - white-space: nowrap; - font: { - size: 10px; - } - color: $white_1; - - &:hover { - &::after { - cursor: pointer; - } - } - - &::after { - content: ''; - position: absolute; - top: -8px; - left: -10px; - height: 28px; - width: 115%; - } - } -} -.active { - -webkit-app-region: no-drag; - background-color: $gray_1; -} - -.fakeTab { - -webkit-app-region: no-drag; - position: relative; - display: inline; - align-items: center; - padding: 0px 10px; - pointer-events: none; - user-select: none; - background-color: transparent; - - & > span { - opacity: 0; - white-space: nowrap; - font: { - size: 10px; - } - } -} - -.tabClose { - -webkit-app-region: no-drag; - margin: 0px 0px 3px 10px; - &:hover { - cursor: pointer; - } -} -.newTab { - -webkit-app-region: no-drag; - display: flex; - align-items: center; - padding: 2px 6px; - &:hover { - background-color: $black_1; - cursor: pointer; - } + position: relative; + display: inline-flex; + align-items: center; + padding: 0 10px; + user-select: none; + overflow: hidden; + background-color: var(--bg-tab); + color: var(--fg-tab); + fill: var(--fg-tab); + + &:hover { + background-color: var(--bg-tab-hover); + color: var(--fg-tab-hover); + fill: var(--fg-tab-hover); + cursor: pointer; + } + + &__text { + overflow: hidden; + text-align: center; + white-space: nowrap; + text-overflow: clip; + font-size: var(--fontControlSize); + margin-right: 6px; + } + + &__close { + height: 16px; + color: var(--fg-tab); + fill: var(--fg-tab); + + &:hover { + color: var(--fg-tab-hover); + fill: var(--fg-tab-hover); + cursor: pointer; + } + } + + &_active { + background-color: var(--bg-tab-active); + color: var(--fg-tab-active); + fill: var(--fg-tab-active); + } } diff --git a/src/renderer/components/Tabs/tabs.tsx b/src/renderer/components/Tabs/tabs.tsx index 682728ff..30e6dffb 100755 --- a/src/renderer/components/Tabs/tabs.tsx +++ b/src/renderer/components/Tabs/tabs.tsx @@ -1,33 +1,33 @@ import * as React from "react"; +import { Text, Button, Icon } from "Elements"; + interface Props { tabs: TabsStore; close(e: React.MouseEvent, id: number): void; clickTab(e: React.MouseEvent, tab: Tab): void; + mouseDownHandler(e: React.MouseEvent): void; } -const Tabs: React.SFC = props => { +const Tabs: React.FunctionComponent = props => { return ( -
+
{props.tabs.tabs.map((t: Tab, i) => ( -
- props.clickTab(e, t)}>{t.title} -
props.close(e, t.id)}> - - - -
+
props.clickTab(e, t)} + onAuxClick={e => props.clickTab(e, t)} + > + {t.title} +
))}
diff --git a/src/renderer/components/ThemeCreator/index.tsx b/src/renderer/components/ThemeCreator/index.tsx new file mode 100644 index 00000000..b3d149e8 --- /dev/null +++ b/src/renderer/components/ThemeCreator/index.tsx @@ -0,0 +1,110 @@ +import * as E from "electron"; +import * as React from "react"; +import { observer, inject } from "mobx-react"; +import { toJS } from "mobx"; + +import "./style.scss"; +import View from "./view"; +import { Themes } from "Store/Themes"; +import { AVAILABLE_THEME_COLOR_VALUE } from "Const"; + +interface CreatorProps { + themes?: Themes; +} + +@inject("themes") +@observer +class ThemeCreator extends React.Component { + props: CreatorProps; + + constructor(props: CreatorProps) { + super(props); + + this.props = props; + } + + onChange = ( + e: React.MouseEvent | React.ChangeEvent, + key: string, + color: string, + ): void => { + this.props.themes!.changeCreatorThemePalette(key, color); + }; + + onChangeThemeName = (e: React.MouseEvent | React.ChangeEvent, value: string) => { + this.props.themes.changeCreatorThemeName(value); + }; + onChangeThemeAuthorName = ( + e: React.MouseEvent | React.ChangeEvent, + value: string, + ) => { + this.props.themes.changeCreatorThemeAuthorName(value); + }; + + onCloseClick = (e: React.MouseEvent): void => { + e.nativeEvent.stopImmediatePropagation(); + e.stopPropagation(); + + this.props.themes!.saveCreatorTheme(); + + E.ipcRenderer.send("closeThemeCreatorView"); + }; + + onColorClick = (e: React.MouseEvent, key: string): void => { + const target = e.target as HTMLInputElement; + + switch (e.button) { + case 2: { + const context: E.MenuItemConstructorOptions[] = [ + { + id: "copy_color", + label: "Copy color", + visible: true, + click: (): void => { + E.clipboard.writeText(target.value); + }, + }, + { + id: "paste_color", + label: "Paste color", + visible: true, + click: (): void => { + const text = E.clipboard.readText(); + + if (AVAILABLE_THEME_COLOR_VALUE.test(text)) { + this.props.themes!.changeCreatorThemePalette(key, text); + } + }, + }, + ]; + + const menu = E.remote.Menu.buildFromTemplate(context); + + menu.popup({ + window: E.remote.getCurrentWindow(), + }); + } + } + }; + + onExportClick = (): void => { + E.ipcRenderer.send("themeCreatorExportTheme", toJS(this.props.themes!.creatorTheme)); + }; + + onApplyThemeClick = (): void => { + E.ipcRenderer.send("themes-change", toJS(this.props.themes!.creatorTheme)); + }; + + render(): JSX.Element { + return ( + + ); + } +} + +export default ThemeCreator; diff --git a/src/renderer/components/ThemeCreator/previewer.tsx b/src/renderer/components/ThemeCreator/previewer.tsx new file mode 100755 index 00000000..29af10cc --- /dev/null +++ b/src/renderer/components/ThemeCreator/previewer.tsx @@ -0,0 +1,730 @@ +import * as React from "react"; + +interface PreviewerProps { + zoom: number; +} + +const Previewer: React.FunctionComponent = props => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Previewer; diff --git a/src/renderer/components/ThemeCreator/style.scss b/src/renderer/components/ThemeCreator/style.scss new file mode 100644 index 00000000..97359aca --- /dev/null +++ b/src/renderer/components/ThemeCreator/style.scss @@ -0,0 +1,83 @@ +.creator { + padding: 5% 0px; + width: 80%; + margin: auto; + height: -webkit-fill-available; + + &__header { + border-top: 1px solid var(--borders); + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + } + + &__body { + display: grid; + grid-template-columns: 1fr 30%; + grid-template-rows: 1fr 50px; + overflow: scroll; + overflow-x: hidden; + overflow-y: overlay; + background: var(--bg-panel); + padding: 20px 30px; + height: 80%; + border-bottom: 1px solid var(--borders); + border-left: 1px solid var(--borders); + border-right: 1px solid var(--borders); + + &::-webkit-scrollbar { + width: 0px; + background: transparent; + } + &::-webkit-scrollbar-thumb { + width: 0; + background: transparent; + } + + &_left { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 30px 30px 1fr; + grid-template-areas: + "a b" + "c d" + "e e"; + } + + &_zoom { + padding: 10px 20px 0 0; + } + + &_buttons { + display: flex; + align-items: center; + justify-content: flex-end; + } + } + + &_view { + grid-area: e; + height: 50vmin; + margin: 20px 20px 0 0; + padding: 20px; + overflow: auto; + background-color: #ffffff; + + &::-webkit-scrollbar { + width: 0px; + background: transparent; + } + &::-webkit-scrollbar-thumb { + width: 0; + background: transparent; + } + } + + &_list { + height: 58vmin; + + &_item { + display: grid; + grid-template-columns: 40px 1fr; + } + } +} diff --git a/src/renderer/components/ThemeCreator/view.tsx b/src/renderer/components/ThemeCreator/view.tsx new file mode 100755 index 00000000..243a17b8 --- /dev/null +++ b/src/renderer/components/ThemeCreator/view.tsx @@ -0,0 +1,107 @@ +import * as React from "react"; +import { observer, inject } from "mobx-react"; + +import { Button, Input, Text, List } from "Elements"; +import { getColorPallet } from "Utils/Render"; +import { PALETTE_TEXT } from "Const"; +import Header from "../Header"; +import Previewer from "./previewer"; +import { Themes } from "Store/Themes"; +import { toJS } from "mobx"; + +interface TopPanelProps { + themes?: Themes; + + onCloseClick(e: React.MouseEvent): void; + onColorClick(e: React.MouseEvent, key: string): void; + onExportClick(): void; + onApplyThemeClick(): void; +} + +const ThemeCreator: React.FunctionComponent = props => { + const theme = toJS(props.themes!.creatorTheme); + const paletteKeys = Object.keys(theme.palette); + const palette = getColorPallet(theme); + + return ( +
+
+
+
+ Theme name + Theme author name + props.themes!.changeCreatorThemeName(e.target.value)} + /> + props.themes!.changeCreatorThemeAuthorName(e.target.value)} + /> + + + +
+
+ Color palette + + {paletteKeys.map((key, index) => ( + { + props.themes!.changeCreatorThemePalette(key, e.target.value); + }} + onClick={e => props.onColorClick(e, key)} + /> + ))} + +
+
+ props.themes!.changeCreatorThemeZoom(d)} + /> +
+
+
+
+
+ ); +}; + +export default inject("themes")(observer(ThemeCreator)); diff --git a/src/renderer/components/TopPanel/index.tsx b/src/renderer/components/TopPanel/index.tsx index 955ea629..81036c2f 100755 --- a/src/renderer/components/TopPanel/index.tsx +++ b/src/renderer/components/TopPanel/index.tsx @@ -4,17 +4,20 @@ import { observer, inject } from "mobx-react"; import Panel from "./toppanel"; import { Settings } from "Store/Settings"; +import { Views } from "Store/Views"; import "./style.scss"; interface TopPanelProps { tabs?: TabsStore; settings?: Settings; + views?: Views; } @inject("tabs") @inject("settings") +@inject("views") @observer -class TopPanel extends React.Component { +class TopPanel extends React.Component { props: TopPanelProps; constructor(props: TopPanelProps) { @@ -23,26 +26,30 @@ class TopPanel extends React.Component { this.props = props; } - private onMainTab = (e: React.MouseEvent & Event) => { + private onMainTab = (e: React.MouseEvent & Event): void => { e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); - E.ipcRenderer.send("maintab"); - this.props.tabs!.setFocus(1); + E.ipcRenderer.send("setFocusToMainTab"); + this.props.tabs.setFocus(); }; - private onOpenSettings = (e: React.MouseEvent & Event) => { + private onNewProject = (e: React.MouseEvent & Event): void => { e.nativeEvent.stopImmediatePropagation(); e.stopPropagation(); - E.remote.app.emit("handle-command", "openSettings"); + E.ipcRenderer.send("newProject"); }; - private onHomeClick = (event: React.MouseEvent & Event) => { - E.ipcRenderer.send("toHome"); + private onOpenMenu = (e: React.MouseEvent & Event): void => { + e.nativeEvent.stopImmediatePropagation(); + e.stopPropagation(); + + E.ipcRenderer.send("openMenu"); }; + private closew = (event: React.MouseEvent & Event) => { - E.ipcRenderer.send("app-exit"); + E.ipcRenderer.send("appExit"); }; private maxiw = (event: React.MouseEvent & Event) => { E.ipcRenderer.send("window-maximize"); @@ -51,23 +58,23 @@ class TopPanel extends React.Component { E.ipcRenderer.send("window-minimize"); }; - private newTab = () => { - E.ipcRenderer.send("newtab"); + private newTab = (): void => { + E.ipcRenderer.send("newTab"); }; - render() { + render(): JSX.Element { return ( ); } diff --git a/src/renderer/components/TopPanel/style.scss b/src/renderer/components/TopPanel/style.scss index dd1a4acd..de3bb4c3 100755 --- a/src/renderer/components/TopPanel/style.scss +++ b/src/renderer/components/TopPanel/style.scss @@ -1,32 +1,19 @@ -@import '../../colors.scss'; +.top-panel { + display: grid; + grid-template: "a b c"; + grid-template-columns: auto 1fr auto; + background-color: var(--bg-header); -#app, #react-page { - &>.panel { - display: grid; - grid-template: "a b c"; - grid-template-columns: auto 1fr auto; - background-color: $black_1; - -webkit-app-region: drag; + &>.panelButtons { + display: inline-flex; + flex-direction: row; + align-content: center; - &>.panelButtons { - display: inline-flex; - flex-direction: row; - align-content: center; - -webkit-app-region: no-drag; - &>.button { - display: flex; - align-items: center; - padding: 6px 8px 6px 6px; - &:hover { - background-color: $gray_1; - cursor: pointer; - } - } - } - } - - &>#body { - overflow-y: auto; - } + &>.button { + display: flex; + align-items: center; + } + } } + diff --git a/src/renderer/components/TopPanel/toppanel.tsx b/src/renderer/components/TopPanel/toppanel.tsx index 722d1afd..9a5323b2 100755 --- a/src/renderer/components/TopPanel/toppanel.tsx +++ b/src/renderer/components/TopPanel/toppanel.tsx @@ -1,95 +1,51 @@ import * as React from "react"; + +import { Icon, Button } from "Elements"; import Tabs from "Components/Tabs"; interface TopPanelProps { current: number; scalePanel: number; + visibleNewProjectBtn: boolean; - onMainTab(e: React.MouseEvent): void; - openSettings(e: React.MouseEvent): void; - onHomeClick(e: React.MouseEvent): void; - getTab(id: number): Tab | undefined; newTab(): void; + onMainTab(e: React.MouseEvent): void; + onNewProject(e: React.MouseEvent): void; + openMenu(e: React.MouseEvent): void; closew(e: React.MouseEvent): void; maxiw(e: React.MouseEvent): void; miniw(e: React.MouseEvent): void; } -const TopPanel: React.SFC = props => { - const currentTab: Tab | undefined = props.getTab(props.current); - +const TopPanel: React.FunctionComponent = props => { return ( -
-
-
- - - -
- {!currentTab || (!!currentTab && currentTab.showBackBtn) ? ( -
- - - - - -
- ) : null} -
- - - -
+
+
+ + {props.visibleNewProjectBtn ? ( + + ) : ( + "" + )}
-
-
- - - - - - - - - - - -
-
- - - -
-
- - - -
-
- - - -
+
+ + + +
); diff --git a/src/renderer/components/index.tsx b/src/renderer/components/index.tsx index 4bed7825..b393379e 100755 --- a/src/renderer/components/index.tsx +++ b/src/renderer/components/index.tsx @@ -1,20 +1,47 @@ import * as React from "react"; +import { observer, inject } from "mobx-react"; -import Body from "./Body"; +import { getColorPallet } from "Utils/Render"; +import { Views } from "Store/Views"; +import { Themes } from "Store/Themes"; import TopPanel from "./TopPanel"; +import Settings from "./Settings"; +import ThemeCreator from "./ThemeCreator"; import "./style.scss"; -class App extends React.Component<{}, {}> { - props: {}; +interface AppProps { + views?: Views; + themes?: Themes; +} + +const viewMap = { + TopPanel, + Settings, + ThemeCreator, +}; - constructor(props: {}) { +@inject("views") +@inject("themes") +@observer +class App extends React.Component { + props: AppProps; + + constructor(props: AppProps) { super(props); this.props = props; } - render() { - return [, ]; + render(): JSX.Element { + const theme = this.props.themes.getThemeById(this.props.themes.currentTheme); + const pallet = getColorPallet(theme); + + const View = viewMap[this.props.views.view]; + return ( +
+ +
+ ); } } diff --git a/src/renderer/components/style.scss b/src/renderer/components/style.scss index 181b8c87..8fabbf9f 100644 --- a/src/renderer/components/style.scss +++ b/src/renderer/components/style.scss @@ -1,44 +1,153 @@ -$list: a b c d e f g h i j k l m n o p q r s t; +html, +body, +#app, +#react-page { + --fontControlSize: 12px; + --fontSize: 16px; + --fontSubtitleSize: 18px; + --fontTitleSize: 22px; -html, body, #app, #react-page { - margin: 0; - padding: 0; - outline: none; - border: 0; - height: 100%; + margin: 0; + padding: 0; + outline: none; + border: 0; + height: 100%; - font: { - family: 'Roboto', sans-serif; - } + font: { + family: 'Inter', sans-serif; + size: var(--fontSize); + weight: 400; + } } -@each $i in $list { - .gridArea-#{$i} { - grid-area: #{$i} - } +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } -@for $i from 1 through 50 { - .order#{$i} { - order: #{$i}; - } +#body { + overflow-y: auto; + height: 100%; +} + +.hover:hover { + cursor: pointer; } .hidden { - display: none; + display: none; } -.grid_1x2 { - display: grid; - grid-template-columns: 1fr 1fr; +.section { + padding: 30px 0px; + border-bottom: 1px solid var(--borders); + + &_end { + border-bottom: 0px; + } } -.grid_2x1 { - display: grid; - grid-template: "a b" "c c"; - grid-template-columns: 1fr 20px; +.grid { + display: grid; + + &_1x2 { + grid-template-columns: 1fr 1fr; + } + + &_1x3 { + grid-template-columns: 10fr 2fr 10fr; + } + + &_1x3_input { + grid-template-columns: 10fr 30px 10fr; + } } .grid_cgap5per { - grid-column-gap: 5%; + grid-column-gap: 5%; +} + +.justify__content { + justify-content: left; + + &_center { + justify-content: center; + } + + &_right { + justify-content: right; + } + + &_space_around { + justify-content: space-around; + } +} + +.align_items_center { + align-items: center; +} + +.flex { + display: flex; + + &_column { + flex-direction: column; + } + + &_grow_1 { + flex-grow: 1; + } +} + +.width { + &_60px { + width: 60px; + } + &_100px { + width: 100px; + } + &_110px { + width: 110px; + } + &_120px { + width: 120px; + } +} + +.border_light { + border: 1px solid var(--borders); +} + +.pad { + &_left { + &_6px { + padding-left: 6px; + } + &_10px { + padding-left: 10px; + } + } + + &_top { + &_10px { + padding-top: 10px; + } + } +} + +.marg { + &_right { + &_10px { + margin-right: 10px; + } + } +} + +.pointer_events_none { + pointer-events: none; } diff --git a/src/renderer/elements/AreaList/index.scss b/src/renderer/elements/AreaList/index.scss deleted file mode 100644 index 42d98ae1..00000000 --- a/src/renderer/elements/AreaList/index.scss +++ /dev/null @@ -1,52 +0,0 @@ -@import '../../colors.scss'; - -.area { - height: 200px; - position: relative; - overflow-y: scroll; - padding-left: 10px; - background-color: $white_1; - - &::-webkit-scrollbar { - width: 6px; - } - &::-webkit-scrollbar-track { - background-color: $gray_2; - } - &::-webkit-scrollbar-thumb { - background-color: $blue_1; - } - - &>.item { - display: flex; - color: $black_2; - align-items: center; - justify-content: space-between; - transition: all .1s ease; - font: { - size: 18px; - } - padding: 6px 20px 2px 10px; - border-bottom: 1px solid $blue_2; - - &>span { - max-width: calc(100vw - 320px); - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - } - - &:hover { - background-color: $blue_2; - } - - &>.remove { - display: inline-flex; - margin-left: 5px; - - &:hover { - cursor: pointer; - } - } - } -} diff --git a/src/renderer/elements/AreaList/index.tsx b/src/renderer/elements/AreaList/index.tsx deleted file mode 100644 index dc98df1b..00000000 --- a/src/renderer/elements/AreaList/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from "react"; - -import "./index.scss"; - -export interface AreaProps { - onRemove(index: number): void; - c?: string; - items?: string[]; -} - -export class Area extends React.Component { - constructor(props: AreaProps) { - super(props); - } - - render() { - return ( -
- {this.props.items && - this.props.items.map((item, i) => ( -
- {item} -
this.props.onRemove(i)}> - - - -
-
- ))} -
- ); - } -} diff --git a/src/renderer/elements/Button/index.scss b/src/renderer/elements/Button/index.scss new file mode 100644 index 00000000..6e58cfe4 --- /dev/null +++ b/src/renderer/elements/Button/index.scss @@ -0,0 +1,111 @@ +.button { + --buttonWidthXxs: 2px; + --buttonWidthXs: 4px; + --buttonWidthS: 6px; + --buttonWidthM: 8px; + --buttonWidthL: 12px; + --buttonWidthXl: 16px; + --buttonWidthXxl: 20px; + + --buttonHeightXxs: 2px; + --buttonHeightXs: 4px; + --buttonHeightS: 6px; + --buttonHeightM: 8px; + --buttonHeightL: 12px; + --buttonHeightXl: 16px; + --buttonHeightXxl: 20px; + + transition: all .1s ease; + user-select: none; + + + &_primary { + padding: var(--buttonHeightS) var(--buttonWidthM); + border: 1px solid var(--text); + border-radius: 5px; + color: var(--text); + + &:active { + border-color: var(--bg-toolbar-active); + } + &:hover { + cursor: pointer; + } + } + &_secondary { + padding: var(--buttonHeightS) var(--buttonWidthM); + border: 1px solid var(--bg-toolbar-active); + background-color: var(--bg-toolbar-active); + border-radius: 5px; + color: var(--fg-toolbar-active); + + &:active { + border-color: var(--bg-toolbar-active); + } + &:hover { + cursor: pointer; + } + } + + &_thin { + padding: var(buttonHeightS) var(--buttonWidthM); + } + &_thick { + padding: var(buttonHeightL) var(--buttonWidthXxl); + } + + &_rounded { + border-radius: 5px; + } + + &_clear { + background: transparent; + border: 0px; + border-radius: 0px; + padding: 0px; + } + &_clear:hover { + border: 0px; + box-shadow: none; + } + + &_title { + padding: 12px; + color: var(--fg-header); + background-color: var(--bg-header-control); + + &:hover { + background-color: var(--bg-header-control-hover); + color: var(--bg-header-hover); + cursor: pointer; + } + } + &_control { + padding: 12px 18px; + background-color: var(--bg-header-control); + color: var(--fg-header-control); + + &:hover { + background-color: var(--bg-header-control-hover); + color: var(--bg-header-control-hover); + cursor: pointer; + } + } + &_close { + color: var(--fg-header-control); + &:hover { + background: var(--bg-window-close); + cursor: pointer; + } + } + + &_disabled { + color: var(--text-disabled); + border-color: var(--text-disabled); + cursor: default; + + &:hover { + cursor: default; + } + } +} diff --git a/src/renderer/elements/Button/index.tsx b/src/renderer/elements/Button/index.tsx new file mode 100644 index 00000000..59962169 --- /dev/null +++ b/src/renderer/elements/Button/index.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; + +import { Text } from ".."; +import "./index.scss"; + +export interface ButtonProps { + onClick?(e: React.MouseEvent): void; + type?: "primary" | "secondary"; + className?: string; + text?: string; + contentBefore?: JSX.Element; + contentAfter?: JSX.Element; + disabled?: boolean; +} + +export class Button extends React.Component { + constructor(props: ButtonProps) { + super(props); + } + + render(): JSX.Element { + let type = this.props.type; + if (!type) { + type = "primary"; + } + + const classNames: string[] = ["button", `button_${type}`]; + const onClick = this.props.onClick || ((): void => {}); + + if (this.props.className) { + classNames.push(this.props.className); + } + if (this.props.disabled) { + classNames.push("button_disabled"); + } + + return ( +
+ {this.props.contentBefore ?
{this.props.contentBefore}
: ""} + {this.props.text ? {this.props.text} : ""} + {this.props.children ? this.props.children : ""} + {this.props.contentAfter ?
{this.props.contentAfter}
: ""} +
+ ); + } +} diff --git a/src/renderer/elements/CheckBox/index.scss b/src/renderer/elements/CheckBox/index.scss index 85198ac7..6aa6b6fb 100644 --- a/src/renderer/elements/CheckBox/index.scss +++ b/src/renderer/elements/CheckBox/index.scss @@ -1,7 +1,13 @@ @import '../../colors.scss'; .checkbox { - position: relative; + --checkSize: 12px; + --checkWidth: 28px; + --checkBorder: 1px; + color: var(--text); + + position: relative; + padding: 6px 0; &>label { position: relative; @@ -12,58 +18,58 @@ &>span { position: relative; - padding-left: 57px; + padding-left: 45px; user-select: none; } &>span::before { content: ''; position: absolute; - top: -2px; - left: 0px; - width: 45px; - height: 20px; - background-color: $llgray_1; - border: 1px solid $black_2; - border-radius: 20px; + top: 1px; + left: 1px; + width: var(--checkWidth); + height: var(--checkSize); + background-color: $white_1; + border: var(--checkBorder) solid var(--borders); + border-radius: var(--checkSize); transition: all .1s ease; } &>span:hover::before { - box-shadow: 0 0 2px 0px $black_2; + box-shadow: 0 0 1px 0px $black_2; } &>span::after { content: ''; position: absolute; - top: 0px; - left: 3px; - width: 16px; - height: 16px; - background-color: $llgray_1; - border: 1px solid $black_2; - border-radius: 20px; + top: 1px; + left: 1px; + width: var(--checkSize); + height: var(--checkSize); + background-color: var(--bg-header);; + border: var(--checkBorder) solid var(--borders); + border-radius: var(--checkSize); transition: all .2s ease; } &>input[type="checkbox"]:checked ~ span::before { content: ''; position: absolute; - top: -2px; + top: 1px; left: 0px; - width: 45px; - height: 20px; - background-color: $black_2; - border: 1px solid $black_2; - border-radius: 20px; + width: var(--checkWidth); + height: var(--checkSize); + background-color: var(--bg-header); + border: var(--checkBorder) solid var(--borders); + border-radius: var(--checkSize); transition: all .1s ease; } &>input[type="checkbox"]:checked ~ span::after { content: ''; position: absolute; - top: 0px; - left: 27px; - width: 16px; - height: 16px; - background-color: $llgray_1; + top: 1px; + left: calc(var(--checkWidth) - var(--checkSize)); + width: var(--checkSize); + height: var(--checkSize); + background-color: $white_1; border: 1px solid $black_2; - border-radius: 20px; + border-radius: var(--checkSize); transition: all .2s ease; } @@ -94,8 +100,8 @@ left: 0px; width: 45px; height: 20px; - background-color: $llgray_1; - border: 1px solid $gray_2; + background-color: var(--borders); + border: 1px solid var(--borders); border-radius: 20px; transition: all .1s ease; } @@ -106,8 +112,8 @@ left: 3px; width: 16px; height: 16px; - background-color: $llgray_1; - border: 1px solid $gray_2; + background-color: var(--borders); + border: 1px solid var(--borders); border-radius: 20px; transition: all .2s ease; } diff --git a/src/renderer/elements/CheckBox/index.tsx b/src/renderer/elements/CheckBox/index.tsx index 855e9904..59d8cee5 100644 --- a/src/renderer/elements/CheckBox/index.tsx +++ b/src/renderer/elements/CheckBox/index.tsx @@ -7,18 +7,30 @@ export interface CheckBoxProps { text?: string; // text for label value?: boolean; disabled?: boolean; - title?: string; - s?: string; // custom style classes + hidden?: boolean; + className?: string; // custom style classes } -export class CheckBox extends React.Component { +export class CheckBox extends React.Component { constructor(props: CheckBoxProps) { super(props); } - render() { + render(): JSX.Element { + const classNames: string[] = ["checkbox"]; + + if (this.props.className) { + classNames.push(this.props.className); + } + if (this.props.disabled) { + classNames.push("disabled"); + } + if (this.props.hidden) { + classNames.push("hidden"); + } + return ( -
+
); diff --git a/src/renderer/elements/ComboBox/index.scss b/src/renderer/elements/ComboBox/index.scss new file mode 100644 index 00000000..79620581 --- /dev/null +++ b/src/renderer/elements/ComboBox/index.scss @@ -0,0 +1,24 @@ +.combobox { + -webkit-appearance: none; + padding: 5px 10px; + width: 150px; + border-radius: 3px; + background: #FFFFFF; + outline: none; + + &:focus { + background: #FFFFFF; + outline: none; + } + + &:after { + position: absolute; + content: ""; + top: 14px; + right: 10px; + width: 0; + height: 0; + border: 6px solid transparent; + border-color: #fff transparent transparent transparent; + } +} diff --git a/src/renderer/elements/ComboBox/index.tsx b/src/renderer/elements/ComboBox/index.tsx new file mode 100644 index 00000000..cdf48a40 --- /dev/null +++ b/src/renderer/elements/ComboBox/index.tsx @@ -0,0 +1,31 @@ +import * as React from "react"; + +import "./index.scss"; + +export interface ComboBoxProps { + className?: string; + items?: string[]; +} + +export class ComboBox extends React.Component { + constructor(props: ComboBoxProps) { + super(props); + } + + render(): JSX.Element { + const classNames: string[] = ["combobox"]; + const items = this.props.items || []; + + if (this.props.className) { + classNames.push(this.props.className); + } + + return ( + + ); + } +} diff --git a/src/renderer/elements/Hint/index.scss b/src/renderer/elements/Hint/index.scss new file mode 100644 index 00000000..7b895652 --- /dev/null +++ b/src/renderer/elements/Hint/index.scss @@ -0,0 +1,2 @@ +.hint {} +.hint:hover {} diff --git a/src/renderer/elements/Hint/index.tsx b/src/renderer/elements/Hint/index.tsx new file mode 100644 index 00000000..a1232678 --- /dev/null +++ b/src/renderer/elements/Hint/index.tsx @@ -0,0 +1,24 @@ +import * as React from "react"; + +import "./index.scss"; + +export interface HintProps { + className?: string; + hint: JSX.Element; +} + +export class Hint extends React.Component { + constructor(props: HintProps) { + super(props); + } + + render(): JSX.Element { + const classNames: string[] = ["hint"]; + + if (this.props.className) { + classNames.push(this.props.className); + } + + return
{this.props.children}
; + } +} diff --git a/src/renderer/elements/Icon/icons/ArrowLeft.tsx b/src/renderer/elements/Icon/icons/ArrowLeft.tsx new file mode 100644 index 00000000..fe8661de --- /dev/null +++ b/src/renderer/elements/Icon/icons/ArrowLeft.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const ArrowLeft: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/ArrowRight.tsx b/src/renderer/elements/Icon/icons/ArrowRight.tsx new file mode 100644 index 00000000..f52cdd42 --- /dev/null +++ b/src/renderer/elements/Icon/icons/ArrowRight.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const ArrowRight: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#333333"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Burger.tsx b/src/renderer/elements/Icon/icons/Burger.tsx new file mode 100644 index 00000000..c2bd159c --- /dev/null +++ b/src/renderer/elements/Icon/icons/Burger.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Burger: React.FunctionComponent = props => { + const size = props.size ? props.size : "18"; + const color = props.color ? props.color : "#FFFFFF"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Close.tsx b/src/renderer/elements/Icon/icons/Close.tsx new file mode 100644 index 00000000..f5ba0d80 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Close.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Close: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#2C2C2C"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Component.tsx b/src/renderer/elements/Icon/icons/Component.tsx new file mode 100644 index 00000000..3fb4c5af --- /dev/null +++ b/src/renderer/elements/Icon/icons/Component.tsx @@ -0,0 +1,50 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Component: React.FunctionComponent = props => { + const size = props.size ? props.size : "18"; + const color = props.color ? props.color : "#FFFFFF"; + + return ( + + + + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Corner.tsx b/src/renderer/elements/Icon/icons/Corner.tsx new file mode 100644 index 00000000..07e3f69e --- /dev/null +++ b/src/renderer/elements/Icon/icons/Corner.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Corner: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#333333"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Delete.tsx b/src/renderer/elements/Icon/icons/Delete.tsx new file mode 100644 index 00000000..fcd884d6 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Delete.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Delete: React.FunctionComponent = props => { + const size = props.size ? props.size : "18"; + const color = props.color ? props.color : "#FFFFFF"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Folder.tsx b/src/renderer/elements/Icon/icons/Folder.tsx new file mode 100644 index 00000000..abda3f46 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Folder.tsx @@ -0,0 +1,22 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Folder: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#333333"; + + return ( + + + + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Github.tsx b/src/renderer/elements/Icon/icons/Github.tsx new file mode 100644 index 00000000..0cc1f096 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Github.tsx @@ -0,0 +1,17 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Github: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Hand.tsx b/src/renderer/elements/Icon/icons/Hand.tsx new file mode 100644 index 00000000..7d8dc1e0 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Hand.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Hand: React.FunctionComponent = props => { + const size = props.size ? props.size : "18"; + const color = props.color ? props.color : "#FFFFFF"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Main.tsx b/src/renderer/elements/Icon/icons/Main.tsx new file mode 100644 index 00000000..21c0b66c --- /dev/null +++ b/src/renderer/elements/Icon/icons/Main.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Main: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Maximize.tsx b/src/renderer/elements/Icon/icons/Maximize.tsx new file mode 100644 index 00000000..c904641b --- /dev/null +++ b/src/renderer/elements/Icon/icons/Maximize.tsx @@ -0,0 +1,19 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Maximize: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/MenuCorner.tsx b/src/renderer/elements/Icon/icons/MenuCorner.tsx new file mode 100644 index 00000000..3c91317f --- /dev/null +++ b/src/renderer/elements/Icon/icons/MenuCorner.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const MenuCorner: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Minimize.tsx b/src/renderer/elements/Icon/icons/Minimize.tsx new file mode 100644 index 00000000..aae3c488 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Minimize.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Minimize: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Pencil.tsx b/src/renderer/elements/Icon/icons/Pencil.tsx new file mode 100644 index 00000000..e1fa1c5a --- /dev/null +++ b/src/renderer/elements/Icon/icons/Pencil.tsx @@ -0,0 +1,17 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Pencil: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Plus.tsx b/src/renderer/elements/Icon/icons/Plus.tsx new file mode 100644 index 00000000..581cb509 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Plus.tsx @@ -0,0 +1,15 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Plus: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Settings.tsx b/src/renderer/elements/Icon/icons/Settings.tsx new file mode 100644 index 00000000..875f97d3 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Settings.tsx @@ -0,0 +1,19 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Settings: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + + ); +}; diff --git a/src/renderer/elements/Icon/icons/Sync.tsx b/src/renderer/elements/Icon/icons/Sync.tsx new file mode 100644 index 00000000..775d3b29 --- /dev/null +++ b/src/renderer/elements/Icon/icons/Sync.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; + +import { IconProps } from ".."; +import "../index.scss"; + +export const Sync: React.FunctionComponent = props => { + const size = props.size ? props.size : "16"; + const color = props.color ? props.color : "#7a7a7a"; + + return ( + + + + ); +}; diff --git a/src/renderer/elements/Icon/index.scss b/src/renderer/elements/Icon/index.scss new file mode 100644 index 00000000..c60f7c6a --- /dev/null +++ b/src/renderer/elements/Icon/index.scss @@ -0,0 +1,5 @@ +.icon { + display: inline-flex; + justify-content: center; + align-items: center; +} diff --git a/src/renderer/elements/Icon/index.tsx b/src/renderer/elements/Icon/index.tsx new file mode 100644 index 00000000..a06c6b4c --- /dev/null +++ b/src/renderer/elements/Icon/index.tsx @@ -0,0 +1,100 @@ +import * as React from "react"; + +import { Close } from "./icons/Close"; +import { Corner } from "./icons/Corner"; +import { Folder } from "./icons/Folder"; +import { Github } from "./icons/Github"; +import { Pencil } from "./icons/Pencil"; +import { ArrowLeft } from "./icons/ArrowLeft"; +import { ArrowRight } from "./icons/ArrowRight"; +import { Main } from "./icons/Main"; +import { Plus } from "./icons/Plus"; +import { Maximize } from "./icons/Maximize"; +import { Minimize } from "./icons/Minimize"; +import { Settings } from "./icons/Settings"; +import { Hand } from "./icons/Hand"; +import { Component } from "./icons/Component"; +import { Burger } from "./icons/Burger"; +import { Delete } from "./icons/Delete"; +import { MenuCorner } from "./icons/MenuCorner"; +import { Sync } from "./icons/Sync"; + +import "../../animations.scss"; +import "./index.scss"; + +type Icons = + | "Close" + | "Corner" + | "Folder" + | "Github" + | "Pencil" + | "ArrowLeft" + | "ArrowRight" + | "Main" + | "Plus" + | "Maximize" + | "Minimize" + | "Hand" + | "Component" + | "Burger" + | "Delete" + | "Sync" + | "MenuCorner" + | "Settings"; + +export interface IconProps { + color?: string; + size?: string; +} + +export interface ContainerProps extends IconProps { + type: Icons; + isSpinner?: boolean; + className?: string; +} + +export class Icon extends React.Component { + private iconsMap = { + Close, + Corner, + Folder, + Github, + Pencil, + ArrowLeft, + ArrowRight, + Main, + Plus, + Maximize, + Minimize, + Hand, + Component, + Burger, + Delete, + Settings, + Sync, + MenuCorner, + }; + + constructor(props: ContainerProps) { + super(props); + } + + render(): JSX.Element { + const classNames: string[] = ["icon"]; + const IconView = this.iconsMap[this.props.type]; + const size = this.props.size || "16"; + + if (this.props.className) { + classNames.push(this.props.className); + } + if (this.props.isSpinner) { + classNames.push("spin"); + } + + return ( +
+ +
+ ); + } +} diff --git a/src/renderer/elements/Input/index.scss b/src/renderer/elements/Input/index.scss new file mode 100644 index 00000000..45b257dc --- /dev/null +++ b/src/renderer/elements/Input/index.scss @@ -0,0 +1,142 @@ +@import '../../colors.scss'; + +.input { + display: flex; + flex-wrap: wrap; + align-items: center; + border-radius: 2px; + + & input:focus { + border: 0; + outline: none; + } + + &__label { + color: var(--text); + } + + &__color { + background-color: var(--bg-panel); + width: 30px; + height: 30px; + border: none; + outline: none; + margin: 0; + padding: 0 10px 0 0; + + &:focus, &:active { + background-color: var(--bg-panel); + border: none; + outline: none; + margin: 0; + padding: 0 10px 0 0; + } + } + + &__content_before { + display: flex; + justify-self: center; + } + &__content_after { + display: flex; + justify-self: center; + } + + &_inline { + display: inline-flex; + } + + &_grid3 { + display: grid; + grid-template-columns: 40px 1fr 40px; + } + + &__range { + --thumbSize: 16px; + --trackSize: 2px; + background-color: var(--bg-panel); + -webkit-appearance: none; + appearance: none; + height: var(--thumbSize); + margin: 0; + padding: 0; + border: 0; + width: 100%; + } + + &__range::-webkit-slider-runnable-track { + background: var(--text); + height: var(--trackSize); + border-radius: calc(var(--trackSize) / 2); + } + + &__range::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + border: 1 solid var(--text); + background: var(--text); + width: var(--thumbSize); + height: var(--thumbSize); + border-radius: calc(var(--thumbSize)); + margin-top: calc(((var(--thumbSize) - var(--trackSize)) / 2) * -1); + } + + &__range:hover::-webkit-slider-thumb { + cursor: pointer; + } + + &__range:hover::-webkit-slider-runnable-track { + cursor: pointer; + } + + &__text { + margin: 8px 10px; + border: 0; + background-color: var(--bg-panel); + color: var(--text); + font: { + family: 'Inter', sans-serif; + size: 14px; + weight: 300; + }; + } + + &__text:focus { + border: 0; + outline: none; + } + + &__text::placeholder { + color: $gray_2; + flex-grow: 1; + user-select: none; + } + + &__content_before { + padding-left: 12px; + } + + &__content_after { + padding-right: 12px; + } + + + &_w_40per input { + width: 40%; + } + + &_w_60per input { + width: 60%; + } + &_w_70per input { + width: 70%; + } + + &_w_80per input { + width: 80%; + } + + &_w_100per input { + width: 100%; + } +} diff --git a/src/renderer/elements/Input/index.tsx b/src/renderer/elements/Input/index.tsx new file mode 100644 index 00000000..cb924250 --- /dev/null +++ b/src/renderer/elements/Input/index.tsx @@ -0,0 +1,45 @@ +import * as React from "react"; + +import { InputColor, InputColorProps } from "./types/Color"; +import { InputRange, InputRangeProps } from "./types/Range"; +import { InputText, InputTextProps } from "./types/Text"; + +import "./index.scss"; + +export interface InputBaseProps { + className?: string; +} + +export interface TextInputProps extends InputTextProps { + type: "text"; +} +export interface ColorProps extends InputColorProps { + type: "color"; +} +export interface RangeInputProps extends InputRangeProps { + type: "range"; +} + +type InputsProps = (TextInputProps | RangeInputProps | ColorProps) & InputBaseProps; + +export class Input extends React.Component { + private inputMap = { + text: InputText, + range: InputRange, + color: InputColor, + }; + + constructor(props: InputsProps) { + super(props); + } + + render(): JSX.Element { + const Input = this.inputMap[this.props.type]; + + return ( +
+ +
+ ); + } +} diff --git a/src/renderer/elements/Input/types/Color.tsx b/src/renderer/elements/Input/types/Color.tsx new file mode 100644 index 00000000..a63e5640 --- /dev/null +++ b/src/renderer/elements/Input/types/Color.tsx @@ -0,0 +1,33 @@ +import * as React from "react"; + +import "../index.scss"; + +export interface InputColorProps { + onChange(event: React.ChangeEvent, color: string): void; + onClick?(event: React.MouseEvent): void; + value?: string; + label?: string; + labelPos?: "left" | "right" | "top" | "bottom"; + readonlyInput?: boolean; +} + +export const InputColor: React.FunctionComponent = props => { + return ( + + props.onChange(e, e.target.value)} + onClick={props.onClick} + onAuxClick={props.onClick} + /> + {props.label ? ( + {props.label} + ) : ( + "" + )} + + ); +}; diff --git a/src/renderer/elements/Input/types/Number.tsx b/src/renderer/elements/Input/types/Number.tsx new file mode 100644 index 00000000..83329395 --- /dev/null +++ b/src/renderer/elements/Input/types/Number.tsx @@ -0,0 +1,32 @@ +import * as React from "react"; + +import "../index.scss"; + +export interface InputNumberProps { + onChange(event: React.MouseEvent | React.ChangeEvent, delta: number): void; + value?: string | number; + readonlyInput?: boolean; + suffix?: string; +} + +export const InputNumber: React.FunctionComponent = props => { + return ( + +
props.onChange(e, +props.value - 5)}> + - +
+
+ props.onChange(e, +e.target.value)} + /> + {props.suffix || "%"} +
+
props.onChange(e, +props.value + 5)}> + + +
+
+ ); +}; diff --git a/src/renderer/elements/Input/types/Range.tsx b/src/renderer/elements/Input/types/Range.tsx new file mode 100644 index 00000000..6f41be70 --- /dev/null +++ b/src/renderer/elements/Input/types/Range.tsx @@ -0,0 +1,40 @@ +import * as React from "react"; + +import "../index.scss"; + +export interface InputRangeProps { + onChange(event: React.MouseEvent | React.ChangeEvent, delta: number): void; + value?: string | number; + suffix?: string; + displayLabel?: boolean; + displayValue?: boolean; + readonlyInput?: boolean; + min?: number; + max?: number; + step?: number; +} + +export const InputRange: React.FunctionComponent = props => { + return ( + + props.onChange(e, +e.target.value)} + /> + {props.displayValue ? ( + + {props.value} + {props.suffix ? props.suffix : ""} + + ) : ( + "" + )} + + ); +}; diff --git a/src/renderer/elements/Input/types/Text.tsx b/src/renderer/elements/Input/types/Text.tsx new file mode 100644 index 00000000..e8c9b77f --- /dev/null +++ b/src/renderer/elements/Input/types/Text.tsx @@ -0,0 +1,40 @@ +import * as React from "react"; + +import "../index.scss"; + +export interface InputTextProps { + onChange(event: React.MouseEvent | React.ChangeEvent, delta: number): void; + value?: string | number; + displayLabel?: boolean; + suffix?: string; + labelPos?: "left" | "right" | "top" | "bottom"; + contentBefore?: JSX.Element; + contentAfter?: JSX.Element; + placeholder?: string; + readonlyInput?: boolean; +} + +export const InputText: React.FunctionComponent = props => { + return ( + + {props.contentBefore ?
{props.contentBefore}
: ""} + props.onChange(e, +e.target.value)} + /> + {props.displayLabel ? ( + + {props.value} + {props.suffix ? props.suffix : ""} + + ) : ( + "" + )} + {props.contentAfter ?
{props.contentAfter}
: ""} +
+ ); +}; diff --git a/src/renderer/elements/List/index.scss b/src/renderer/elements/List/index.scss new file mode 100644 index 00000000..c046133d --- /dev/null +++ b/src/renderer/elements/List/index.scss @@ -0,0 +1,72 @@ +@import '../../colors.scss'; + +.list { + height: 170px; + position: relative; + overflow-y: scroll; + padding-left: 10px; + background-color: var(--bg-panel); + + &::-webkit-scrollbar { + width: 4px; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: $gray_2; + border-radius: 5px; + } + + &_hidden_tracks { + &::-webkit-scrollbar { + width: 0px; + border: none; + background-color: transparent; + } + + &::-webkit-scrollbar-track { + width: 0px; + border: none; + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + width: 0px; + border: none; + background-color: transparent; + } + } + + &_grab { + cursor: grab; + overflow: auto; + user-select: none; + } + + &__item { + display: flex; + color: var(--text); + align-items: center; + padding: 10px 0px 10px 0px; + + &>span { + max-width: calc(100vw - 320px); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + } + + &__delete { + margin-right: 10px; + height: 16px; + + &:hover { + cursor: pointer; + } + } +} diff --git a/src/renderer/elements/List/index.tsx b/src/renderer/elements/List/index.tsx new file mode 100644 index 00000000..d5bf985a --- /dev/null +++ b/src/renderer/elements/List/index.tsx @@ -0,0 +1,80 @@ +import * as React from "react"; + +import "./index.scss"; + +export interface ListProps { + onRemove?(index: number): void; + className?: string; + style?: React.CSSProperties; + children: JSX.Element | JSX.Element[]; + grabToScroll?: boolean; +} + +export class List extends React.Component { + private area: React.RefObject; + private pos = { top: 0, left: 0, x: 0, y: 0 }; + private isMoving = false; + + constructor(props: ListProps) { + super(props); + + this.area = React.createRef(); + } + + private mouseUpHandler = (e: React.MouseEvent) => { + this.area.current.style.cursor = "grab"; + this.isMoving = false; + }; + private mouseDownHandler = (e: React.MouseEvent) => { + this.area.current.style.cursor = "grabbing"; + this.isMoving = true; + + this.pos = { + left: this.area.current.scrollLeft, + top: this.area.current.scrollTop, + x: e.clientX, + y: e.clientY, + }; + }; + private mouseMoveHandler = (e: React.MouseEvent) => { + if (!this.isMoving) { + return; + } + + const dx = e.clientX - this.pos.x; + const dy = e.clientY - this.pos.y; + + this.area.current.scrollTop = this.pos.top - dy; + this.area.current.scrollLeft = this.pos.left - dx; + }; + + render(): JSX.Element { + const classNames: string[] = ["list"]; + const isDraggable = this.props.grabToScroll; + + if (this.props.className) { + classNames.push(this.props.className); + } + if (isDraggable) { + classNames.push("list_grab"); + } + + return isDraggable ? ( +
+ {this.props.children} +
+ ) : ( +
+ {this.props.children} +
+ ); + } +} diff --git a/src/renderer/elements/Text/index.scss b/src/renderer/elements/Text/index.scss new file mode 100644 index 00000000..e99e7edb --- /dev/null +++ b/src/renderer/elements/Text/index.scss @@ -0,0 +1,33 @@ +.text { + font: { + size: var(--fontSize); + family: 'Inter', sans-serif; + } + + &_title { + display: block; + font-size: var(--fontTitleSize); + font-weight: 600; + } + &_subtitle { + color: var(--text-active); + display: block; + padding-bottom: 20px; + font-size: var(--fontSubtitleSize); + font-weight: 600; + } + + &_light { + color: var(--fg-tab-active); + } + &_dark { + color: var(--text-active); + } + &_inactive { + color: var(--text-disabled); + } + + &_nopadding { + padding: 0; + } +} diff --git a/src/renderer/elements/Text/index.tsx b/src/renderer/elements/Text/index.tsx new file mode 100644 index 00000000..813bfe9f --- /dev/null +++ b/src/renderer/elements/Text/index.tsx @@ -0,0 +1,32 @@ +import * as React from "react"; + +import "./index.scss"; + +export interface TextProps { + className?: string; + type?: "title" | "subtitle"; + color?: "light" | "dark" | "inactive"; + children: string; +} + +export class Text extends React.Component { + constructor(props: TextProps) { + super(props); + } + + render(): JSX.Element { + const classNames: string[] = ["text"]; + + if (this.props.type) { + classNames.push(`text_${this.props.type}`); + } + if (this.props.color) { + classNames.push(`text_${this.props.color}`); + } + if (this.props.className) { + classNames.push(this.props.className); + } + + return {this.props.children}; + } +} diff --git a/src/renderer/elements/index.ts b/src/renderer/elements/index.ts index 30004a52..c775eb5b 100644 --- a/src/renderer/elements/index.ts +++ b/src/renderer/elements/index.ts @@ -1,3 +1,8 @@ -export * from "./AreaList"; -export * from "./input"; +export * from "./List"; +export * from "./Text"; +export * from "./Hint"; +export * from "./Icon"; +export * from "./Input"; +export * from "./Button"; export * from "./CheckBox"; +export * from "./ComboBox"; diff --git a/src/renderer/elements/input/index.scss b/src/renderer/elements/input/index.scss deleted file mode 100644 index 4e4cfb44..00000000 --- a/src/renderer/elements/input/index.scss +++ /dev/null @@ -1,73 +0,0 @@ -@import '../../colors.scss'; - -.input.simple { - width: 100%; - - &>.body { - border: 0; - - &>input { - background-color: transparent; - border: 0px; - outline: 0; - margin: 0; - padding: 0; - width: 100%; - font: { - size: 18px; - } - } - } -} - -.input.number { - display: grid; - grid-template-columns: 30px 1fr 30px; - - &>.button { - color: $black_2; - font: { - size: 18px; - weight: 600; - } - padding: 10px 10px; - transition: all .1s ease; - user-select: none; - - &:hover { - cursor: pointer; - text-shadow: 0 0 2px $gray_1; - } - &:active {} - } - - &>.body { - display: grid; - grid-template-columns: 52% 1fr; - grid-column-gap: 2px; - align-items: center; - border: 1px solid $black_2; - border-radius: 20px; - - &:hover { - box-shadow: 0 0 2px $gray_1; - } - - &>input { - background-color: transparent; - justify-self: right; - border: 0px; - outline: 0; - margin: 0; - padding: 0; - width: 32px; - font: { - size: 18px; - } - text-align: right; - - &:active {} - } - &>.suffix {} - } -} \ No newline at end of file diff --git a/src/renderer/elements/input/index.tsx b/src/renderer/elements/input/index.tsx deleted file mode 100644 index d65e6c85..00000000 --- a/src/renderer/elements/input/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; - -import "./index.scss"; - -export enum InputTypes { - SIMPLE = "simple", - NUMBER = "number", -} - -export interface InputProps { - onChange(event: React.MouseEvent | React.ChangeEvent, delta: number): void; - type?: InputTypes; - value?: string | number; - readonlyInput?: boolean; - sufix?: string; -} - -export class Input extends React.Component { - constructor(props: InputProps) { - super(props); - } - - render() { - return ( -
- {this.props.type === InputTypes.NUMBER ? ( - -
this.props.onChange(e, +this.props.value - 5)}> - - -
-
- this.props.onChange(e, +e.target.value)} - /> - {this.props.sufix || "%"} -
-
this.props.onChange(e, +this.props.value + 5)}> - + -
-
- ) : ( -
- this.props.onChange(e, +e.target.value)} - /> -
- )} -
- ); - } -} diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index 7ad60871..87925d33 100755 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -5,13 +5,14 @@ import stores from "./stores"; import App from "./components"; import { isDev } from "Utils/Common"; -import shortcuts from "Utils/Render/shortcuts"; onError((err: any) => { console.log("Mobx error: ", err); }); -shortcuts(); +if (module.hot) { + module.hot.accept(); +} const root: string = isDev ? "app" : "react-page"; diff --git a/src/renderer/stores/Routes.ts b/src/renderer/stores/Routes.ts deleted file mode 100644 index 55713500..00000000 --- a/src/renderer/stores/Routes.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { RouterState, RouterStore } from "mobx-state-router"; - -const routes = [ - { - name: "general", - pattern: "/", - }, - { - name: "shortcuts", - pattern: "/shortcuts", - }, -]; - -class Routes { - route: RouterStore; - - constructor() { - this.route = new RouterStore(this, routes, new RouterState("general")); - } -} - -const routeStore = new Routes(); - -export default routeStore; -export { Routes }; diff --git a/src/renderer/stores/Settings.ts b/src/renderer/stores/Settings.ts index 39c6a212..8212ce1c 100644 --- a/src/renderer/stores/Settings.ts +++ b/src/renderer/stores/Settings.ts @@ -1,14 +1,16 @@ import * as E from "electron"; -import * as S from "electron-settings"; -import { observable, action, toJS, autorun } from "mobx"; - -import * as Const from "Const"; +import { storage } from "Storage"; +import { observable, action, toJS } from "mobx"; export class Settings { - @observable settings: ISettings; + @observable settings?: SettingsInterface; + + @observable isSyncDisabled: boolean; constructor() { - this.settings = S.getAll() as any; + this.settings = storage.get(); + + this.isSyncDisabled = false; this.events(); } @@ -23,7 +25,7 @@ export class Settings { this.settings.ui.scaleFigmaUI = 1; } - E.remote.app.emit("update-figma-ui-scale", d); + E.ipcRenderer.send("updateFigmaUiScale", d); }; @action public updatePanelScale = (delta: number): void => { @@ -35,34 +37,24 @@ export class Settings { this.settings.ui.scalePanel = 1; } - E.remote.app.emit("update-panel-scale", d); + E.ipcRenderer.send("updatePanelScale", d); }; - @action - public updateShowMainMenu = (show: boolean): void => { - this.settings.app.showMainMenu = show; - - E.remote.app.emit("set-hide-main-menu", show); - }; - @action - public updateDisableMainMenu = (disabled: boolean): void => { - this.settings.app.disabledMainMenu = disabled; - - E.remote.app.emit("set-disable-main-menu", disabled); - }; @action public saveLastOpenedTabs = (save: boolean): void => { this.settings.app.saveLastOpenedTabs = save; }; + @action - public updateWindowFrame = (show: boolean): void => { - this.settings.app.windowFrame = show; + public enableColorSpaceSrgb = (enabled: boolean): void => { + this.settings.app.enableColorSpaceSrgb = enabled; + + E.ipcRenderer.send("enableColorSpaceSrgbWasChanged", enabled); }; - @action - public updateDisabledFonts = (disabled: boolean): void => { - this.settings.app.disabledFonts = disabled; - E.remote.app.emit("set-disable-fonts", disabled); + @action + public visibleNewProjectBtn = (visible: boolean): void => { + this.settings.app.visibleNewProjectBtn = visible; }; @action @@ -91,24 +83,48 @@ export class Settings { this.settings.app.fontDirs = this.settings.app.fontDirs.filter((e, i) => i !== index); }; + @action + public changeTheme = (id: string): void => { + if (!this.settings.theme) { + this.settings.theme = { + currentTheme: "0", + }; + } + + this.settings.theme.currentTheme = id; + }; + + public setSettings = () => { + const settings = toJS(this.settings); + + storage.set(settings); + + E.ipcRenderer.send("updateVisibleNewProjectBtn", settings.app.visibleNewProjectBtn); + }; + private events = (): void => { - E.ipcRenderer.on(Const.UPDATEUISCALE, (sender: Event, scale: number) => { + E.ipcRenderer.on("updateUiScale", (sender, scale) => { this.settings.ui.scaleFigmaUI = scale; }); - E.ipcRenderer.on(Const.UPDATEPANELSCALE, (sender: Event, scale: number) => { + E.ipcRenderer.on("updatePanelScale", (sender, scale) => { this.settings.ui.scalePanel = scale; }); - E.ipcRenderer.on(Const.UPDATEPANELHEIGHT, (sender: Event, height: number) => { + E.ipcRenderer.on("updatePanelHeight", (sender, height) => { this.settings.app.panelHeight = height; }); - E.ipcRenderer.on(Const.UPDATEMAINMENUVIS, (sender: Event, show: boolean) => { - this.settings.app.showMainMenu = show; + E.ipcRenderer.on("updateVisibleNewProjectBtn", (sender, height) => { + this.settings.app.visibleNewProjectBtn = height; + }); + E.ipcRenderer.on("themes-change", (sender, theme) => { + this.settings.theme.currentTheme = theme.id; + }); + E.ipcRenderer.on("sync-themes-start", () => { + this.isSyncDisabled = true; + }); + E.ipcRenderer.on("sync-themes-end", () => { + this.isSyncDisabled = false; }); }; } export const settings = new Settings(); - -autorun(() => { - S.setAll(toJS(settings.settings)); -}); diff --git a/src/renderer/stores/Tabs.ts b/src/renderer/stores/Tabs.ts index 55964ba8..524a5217 100755 --- a/src/renderer/stores/Tabs.ts +++ b/src/renderer/stores/Tabs.ts @@ -1,19 +1,16 @@ import * as E from "electron"; import { observable, action, autorun, toJS } from "mobx"; -import * as Const from "Const"; -import { isComponentUrl } from "Utils/Common"; - export class Tabs implements TabsStore { @observable tabs: Tab[] = []; - @observable current = 1; + @observable current: number | undefined; constructor() { this.events(); } @action - addTab = (data: { id: number; url: string; showBackBtn: boolean; title?: string }): void => { + addTab = (data: { id: number; url: string; showBackBtn: boolean; title?: string; focused?: boolean }): void => { this.tabs.push({ id: data.id, title: data.title ? data.title : "Figma", @@ -21,6 +18,7 @@ export class Tabs implements TabsStore { moves: false, showBackBtn: data.showBackBtn, order: this.tabs.length === 0 ? 1 : this.tabs.length + 1, + focused: data.focused, }); }; @@ -30,7 +28,7 @@ export class Tabs implements TabsStore { }; @action - setFocus = (id: number): void => { + setFocus = (id?: number): void => { this.current = id; }; @@ -67,47 +65,40 @@ export class Tabs implements TabsStore { }; private events = (): void => { - E.ipcRenderer.on(Const.TABADDED, (sender: any, data: Tab) => { - if (isComponentUrl(data.url)) { - const collection: number[] = this.tabs.map(el => el.id); - - data.id = this.generateUniqueId(collection); - - this.addTab({ - id: data.id, - url: data.url, - title: data.title, - showBackBtn: data.showBackBtn, - }); - } else { - this.addTab({ - id: data.id, - url: data.url, - title: data.title ? data.title : "Recent Files", - showBackBtn: data.showBackBtn, - }); + E.ipcRenderer.on("didTabAdd", (sender, data) => { + this.addTab({ + id: data.id, + url: data.url, + title: data.title ? data.title : "Recent Files", + showBackBtn: data.showBackBtn, + focused: data.focused, + }); + + if (data.focused) { + this.setFocus(data.id); } - - this.setFocus(data.id); }); - E.ipcRenderer.on(Const.CLOSEALLTAB, () => { - this.current = 1; + E.ipcRenderer.on("closeAllTabs", () => { + this.current = undefined; this.tabs = []; }); - E.ipcRenderer.on(Const.SETTITLE, (sender: any, data: { id: number; title: string }) => { + E.ipcRenderer.on("setTitle", (sender, data) => { this.tabs = this.tabs.map(t => (t.id === data.id ? { ...t, title: data.title } : t)); }); - E.ipcRenderer.on(Const.SETTABURL, (sender: any, data: { id: number; url: string }) => { + E.ipcRenderer.on("setTabUrl", (sender, data) => { this.tabs = this.tabs.map(t => (t.id === data.id ? { ...t, url: data.url } : t)); }); - E.ipcRenderer.on(Const.UPDATEFILEKEY, (sender: any, data: { id: number; fileKey: string }) => { + E.ipcRenderer.on("updateFileKey", (sender, data) => { this.tabs = this.tabs.map(t => (t.id === data.id ? { ...t, fileKey: data.fileKey } : t)); }); + E.ipcRenderer.on("mainTabFocused", sender => { + this.setFocus(); + }); - E.ipcRenderer.on(Const.CLOSETAB, (sender: any, data: { id: number }) => { + E.ipcRenderer.on("closeTab", (sender, data) => { const index: number = this.tabs.findIndex(t => t.id === data.id); this.deleteTab(data.id); @@ -119,5 +110,5 @@ export class Tabs implements TabsStore { export const tabs: Tabs = new Tabs(); autorun(() => { - E.ipcRenderer.send(Const.RECIVETABS, toJS(tabs.tabs)); + E.ipcRenderer.send("receiveTabs", toJS(tabs.tabs)); }); diff --git a/src/renderer/stores/Themes.ts b/src/renderer/stores/Themes.ts new file mode 100644 index 00000000..cd155579 --- /dev/null +++ b/src/renderer/stores/Themes.ts @@ -0,0 +1,96 @@ +import * as E from "electron"; + +import { DEFAULT_THEME, TEST_THEME_ID } from "Const"; +import { observable, action, toJS } from "mobx"; +import { storage } from "Storage"; + +export class Themes { + @observable themes: Themes.Theme[] = []; + @observable currentTheme: string; + @observable creatorTheme: Themes.Theme; + @observable previewerZoom: number; + + constructor() { + this.currentTheme = storage.get().theme.currentTheme; + this.creatorTheme = { + ...DEFAULT_THEME, + id: TEST_THEME_ID, + }; + this.previewerZoom = 1; + + this.events(); + } + + @action + setTheme = (theme: string): void => { + this.currentTheme = theme; + }; + + @action + changeTheme = (id: string): void => { + this.currentTheme = id; + + if (id === "0") { + E.ipcRenderer.send("set-default-theme"); + } else { + const theme = toJS(this.getThemeById(id)); + E.ipcRenderer.send("themes-change", theme); + } + }; + + @action + changeCreatorThemeName = (value: string): void => { + this.creatorTheme.name = value; + }; + @action + changeCreatorThemeAuthorName = (value: string): void => { + this.creatorTheme.author = value; + }; + @action + changeCreatorThemePalette = (key: string, value: string): void => { + this.creatorTheme.palette[key] = value; + }; + @action + changeCreatorThemeZoom = (delta: number): void => { + this.previewerZoom = +(delta / 100).toFixed(2); + }; + + saveCreatorTheme = () => { + E.ipcRenderer.send("saveCreatorTheme", toJS(this.creatorTheme)); + }; + + getThemeById = (id: string): Themes.Theme | undefined => { + const theme = this.themes.find(theme => { + return theme.id === id; + }); + + if (!theme) { + return DEFAULT_THEME; + } + + return theme; + }; + private events = (): void => { + E.ipcRenderer.on("getUploadedThemes", (sender, themes) => { + this.themes = themes; + }); + E.ipcRenderer.on("themes-change", (sender, theme) => { + if (theme.id === TEST_THEME_ID) { + const testTheme = toJS(this.themes).find(t => t.id === theme.id); + + if (testTheme) { + const themes = toJS(this.themes).filter(t => t.id !== theme.id); + testTheme.palette = theme.palette; + this.themes = [...themes, testTheme]; + } + } + + this.setTheme(theme.id); + }); + E.ipcRenderer.on("loadCreatorTheme", (sender, theme) => { + this.creatorTheme = theme; + }); + }; +} + +export const themes = new Themes(); diff --git a/src/renderer/stores/Views.ts b/src/renderer/stores/Views.ts new file mode 100644 index 00000000..bfa63e63 --- /dev/null +++ b/src/renderer/stores/Views.ts @@ -0,0 +1,28 @@ +import * as E from "electron"; +import { observable, action } from "mobx"; + +export class Views { + @observable view: View = "TopPanel"; + @observable settingsView: SettingsView = "General"; + + constructor() { + this.events(); + } + + @action + setView = (view: View): void => { + this.view = view; + }; + @action + setSettingsView = (view: SettingsView): void => { + this.settingsView = view; + }; + + private events = (): void => { + E.ipcRenderer.on("renderView", (sender, view) => { + this.setView(view); + }); + }; +} + +export const views = new Views(); diff --git a/src/renderer/stores/index.ts b/src/renderer/stores/index.ts index 1ea9f03a..b3d96d5f 100755 --- a/src/renderer/stores/index.ts +++ b/src/renderer/stores/index.ts @@ -1,17 +1,20 @@ import { tabs } from "./Tabs"; -import route, { Routes } from "./Routes"; +import { Views, views } from "./Views"; import { Settings, settings } from "./Settings"; +import { Themes, themes } from "./Themes"; export interface Stores { tabs: TabsStore; settings: Settings; - route: Routes; + themes: Themes; + views: Views; } const stores: Stores = { tabs, settings, - route, + themes, + views, }; export default stores; diff --git a/src/utils/Common/app.ts b/src/utils/Common/app.ts deleted file mode 100644 index 7162f66e..00000000 --- a/src/utils/Common/app.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as E from "electron"; - -export const app = E.remote ? E.remote.app : E.app; diff --git a/src/utils/Common/extensions.ts b/src/utils/Common/extensions.ts new file mode 100644 index 00000000..db1fcae3 --- /dev/null +++ b/src/utils/Common/extensions.ts @@ -0,0 +1,14 @@ +export function sanitizeFileName(input: string): string { + const illegalRe = /[\/\?<>\\:\*\|":]/g; + const controlRe = /[\x00-\x1f\x80-\x9f]/g; + const reservedRe = /^\.+$/; + const windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; + const windowsTrailingRe = /[\. ]+$/; + + return input + .replace(illegalRe, "") + .replace(controlRe, "") + .replace(reservedRe, "") + .replace(windowsReservedRe, "") + .replace(windowsTrailingRe, ""); +} diff --git a/src/utils/Common/getComponentTitle.ts b/src/utils/Common/getComponentTitle.ts deleted file mode 100644 index 8aca293c..00000000 --- a/src/utils/Common/getComponentTitle.ts +++ /dev/null @@ -1 +0,0 @@ -export const getComponentTitle = (url: string): string => url.substr(url.search(/\/\//) + 2); diff --git a/src/utils/Common/index.ts b/src/utils/Common/index.ts index b977c97f..d0f13602 100644 --- a/src/utils/Common/index.ts +++ b/src/utils/Common/index.ts @@ -1,8 +1,9 @@ /** * Common utils */ -export * from "./app"; +export * from "./url"; +export * from "./wait"; export * from "./isDev"; export * from "./menuTypes"; -export * from "./url"; -export * from "./getComponentTitle"; +export * from "./themes"; +export * from "./extensions"; diff --git a/src/utils/Common/menuTypes.ts b/src/utils/Common/menuTypes.ts index c1fe22ad..e549cdcd 100644 --- a/src/utils/Common/menuTypes.ts +++ b/src/utils/Common/menuTypes.ts @@ -71,19 +71,39 @@ export const isPluginName = (data: any): boolean => data.type === "plugin-name" export const isActionMenuItemName = (data: Menu.Items.MenuName): boolean => isStringKeyName(data) || isPluginName(data); -export const isActionMenuItem = (data: Menu.MenuItem): boolean => - data.type === "run-menu-action" && - isActionMenuItemName(data.name) && - (data.menuAction === undefined || isMenuAction(data.menuAction)) && - (data.disabled === undefined || typeof data.disabled === "boolean"); +export const isActionMenuItem = (data: Menu.MenuItem): boolean => { + if (data.type !== "run-menu-action") { + return false; + } + + const item = data as Menu.Items.Menu; + + if ( + isActionMenuItemName(item.name) && + (item.menuAction === undefined || isMenuAction(item.menuAction)) && + (item.disabled === undefined || typeof item.disabled === "boolean") + ) { + return true; + } + + return false; +}; export const isSeparatorMenuItem = (data: Menu.MenuItem): boolean => data.type === "separator"; -export const isSubmenuMenuItem = (data: Menu.MenuItem): boolean => - data.type === "submenu" && - typeof data.name === "string" && - Array.isArray(data.submenu) && - data.submenu.every(isMenuItem); +export const isSubmenuMenuItem = (data: Menu.MenuItem): boolean => { + if (data.type !== "submenu") { + return false; + } + + const item = data as Menu.Items.Submenu; + + if (typeof item.name === "string" && Array.isArray(item.submenu) && item.submenu.every(isMenuItem)) { + return true; + } + + return false; +}; export const isMenuItem = (data: Menu.MenuItem): boolean => { return isActionMenuItem(data) || isSeparatorMenuItem(data) || isSubmenuMenuItem(data); diff --git a/src/utils/Common/themes.ts b/src/utils/Common/themes.ts new file mode 100644 index 00000000..6c72fde3 --- /dev/null +++ b/src/utils/Common/themes.ts @@ -0,0 +1,124 @@ +export const variablesColorsMap: Themes.ColorsMap = { + "rgb(255, 255, 255)": "var(--bg-panel)", + "rgb(252, 252, 252)": "var(--bg-panel)", + "rgb(248, 248, 248)": "var(--bg-panel-hover)", + "rgb(240, 240, 240)": "var(--bg-panel-hover)", + "rgb(241, 249, 255)": "var(--bg-panel-hover)", + "rgb(237, 245, 250)": "var(--bg-panel-hover)", + "rgb(229, 229, 229)": "var(--borders)", + "rgb(229, 229, 229) 1px 0px 0px 0px": `var(--borders) 1px 0px 0px 0px`, + "rgb(229, 229, 229) 0px 1px 0px 0px": `var(--borders) 0px 1px 0px 0px`, + "rgb(229, 229, 229) 0px 0px 0px 1px": `var(--borders) 0px 0px 0px 1px`, + "rgb(239, 239, 239)": "var(--borders)", + "rgb(217, 217, 217)": "var(--borders)", + "rgb(212, 212, 212)": "var(--borders)", + "rgb(218, 235, 247)": "var(--bg-panel-hover)", + "rgb(191, 186, 252)": "var(--fg-component-disabled-row-active)", + "rgb(180, 180, 250)": "var(--fg-component-disabled-row-active)", + "rgb(179, 179, 179)": "var(--text-disabled)", + "rgb(166, 172, 175)": "var(--text-disabled)", + "rgb(123, 97, 255)": "var(--fg-component)", + "rgb(68, 68, 68)": "var(--text)", + "rgb(51, 51, 51)": "var(--text)", + "rgb(44, 44, 44)": "var(--bg-toolbar)", + "rgb(5, 5, 5)": "var(--text-active)", + "rgb(0, 0, 0)": "var(--text-active)", + "rgba(0, 0, 0, 0.06)": "var(--borders)", + "rgba(0, 0, 0, 0.1)": "var(--borders)", + "rgba(0, 0, 0, 0.15)": "var(--text)", + "rgba(0, 0, 0, 0.2)": "var(--text)", + "rgba(0, 0, 0, 0.3)": "var(--text-disabled)", + "rgba(0, 0, 0, 0.4)": "var(--text)", + "rgba(0, 0, 0, 0.6)": "var(--text)", + "rgba(0, 0, 0, 0.5)": "var(--text)", + "rgba(0, 0, 0, 0.75)": "var(--text)", + "rgba(0, 0, 0, 0.8)": "var(--textActive)", + "rgba(0, 0, 0, 0.9)": "var(--text)", + "rgba(0, 0, 0, 0.95)": "var(--text)", + "rgba(44, 44, 44, 0.8)": "var(--bg-toolbar)", + "rgba(51, 51, 51, 0.3)": "var(--text-disabled)", + "rgba(123, 97, 255, 0.4)": "var(--fg-component-disabled)", + "rgba(255, 255, 255, 0)": "var(--bg-panel)", + "rgba(255, 255, 255, 0.2)": "var(--bg-panel)", + "rgba(255, 255, 255, 0.4)": "var(--bg-panel)", + "rgba(255, 255, 255, 0.05)": "var(--bg-panel)", + "rgba(255, 255, 255, 0.5)": "var(--bg-panel)", + "rgba(255, 255, 255, 0.8)": "var(--text)", + "rgba(255, 255, 255, 0.95)": "var(--bg-panel)", + "rgb(24, 160, 251)": "var(--bg-toolbar-active)", + "rgb(24, 160, 251) 0px 0px 0px 1px inset": `var(--bg-toolbar-active) 0px 0px 0px 1px inset`, + "rgb(230, 230, 230) 0px 0px 0px 1px inset": "var(--text) 0px 0px 0px 1px inset", + "rgb(230, 230, 230)": "var(--borders)", + "rgb(230, 230, 230) 0px -1px": "var(--borders) 0px -1px", + "rgb(27, 196, 125)": "var(--bg-beta-label)", +}; + +export const getColorsMap = (palette: Themes.Palette, currentPalette?: Themes.ColorsMap): Themes.ColorsMap => { + const defaultColorsMap: Themes.ColorsMap = { + "rgb(255, 255, 255)": palette["bg-panel"], + "rgb(252, 252, 252)": palette["bg-panel"], + "rgb(248, 248, 248)": palette["bg-panel-hover"], + "rgb(240, 240, 240)": palette["bg-panel-hover"], + "rgb(241, 249, 255)": palette["bg-panel-hover"], + "rgb(237, 245, 250)": palette["bg-panel-hover"], + "rgb(229, 229, 229)": palette["borders"], + "rgb(229, 229, 229) 1px 0px 0px 0px": `${palette.borders} 1px 0px 0px 0px`, + "rgb(229, 229, 229) 0px 1px 0px 0px": `${palette.borders} 0px 1px 0px 0px`, + "rgb(229, 229, 229) 0px 0px 0px 1px": `${palette.borders} 0px 0px 0px 1px`, + "rgb(239, 239, 239)": palette["borders"], + "rgb(217, 217, 217)": palette["borders"], + "rgb(212, 212, 212)": palette["borders"], + "rgb(218, 235, 247)": palette["bg-toolbar-hover"], + "rgb(191, 186, 252)": palette["fg-component-disabled-row-active"], + "rgb(180, 180, 250)": palette["fg-component-disabled-row-active"], + "rgb(179, 179, 179)": palette["text-disabled"], + "rgb(166, 172, 175)": palette["text-disabled"], + "rgb(123, 97, 255)": palette["fg-component"], + "rgb(68, 68, 68)": palette.text, + "rgb(51, 51, 51)": palette.text, + "rgb(44, 44, 44)": palette["bg-toolbar"], + "rgb(5, 5, 5)": palette["text-active"], + "rgb(0, 0, 0)": palette["text-active"], + "rgba(0, 0, 0, 0.06)": palette.borders, + "rgba(0, 0, 0, 0.1)": palette.borders, + "rgba(0, 0, 0, 0.15)": palette.text, + "rgba(0, 0, 0, 0.2)": palette.text, + "rgba(0, 0, 0, 0.3)": palette["text-disabled"], + "rgba(0, 0, 0, 0.4)": palette.text, + "rgba(0, 0, 0, 0.6)": palette.text, + "rgba(0, 0, 0, 0.5)": palette.text, + "rgba(0, 0, 0, 0.75)": palette.text, + "rgba(0, 0, 0, 0.8)": palette["text-active"], + "rgba(0, 0, 0, 0.9)": palette.text, + "rgba(0, 0, 0, 0.95)": palette.text, + "rgba(44, 44, 44, 0.8)": palette["bg-toolbar"], + "rgba(51, 51, 51, 0.3)": palette["text-disabled"], + "rgba(123, 97, 255, 0.4)": palette["fg-component-disabled"], + "rgba(255, 255, 255, 0)": palette["bg-panel"], + "rgba(255, 255, 255, 0.2)": palette["bg-panel"], + "rgba(255, 255, 255, 0.4)": palette["bg-panel"], + "rgba(255, 255, 255, 0.05)": palette["bg-panel"], + "rgba(255, 255, 255, 0.5)": palette["bg-panel"], + "rgba(255, 255, 255, 0.8)": palette.text, + "rgba(255, 255, 255, 0.95)": palette["bg-panel"], + "rgb(24, 160, 251)": palette["bg-toolbar-active"], + "rgb(24, 160, 251) 0px 0px 0px 1px inset": `${palette["bg-toolbar-active"]} 0px 0px 0px 1px inset`, + "rgb(230, 230, 230) 0px 0px 0px 1px inset": `${palette["bg-toolbar-active"]} 0px 0px 0px 1px inset`, + "rgb(230, 230, 230)": `${palette.borders}`, + "rgb(230, 230, 230) 0px -1px": `${palette.borders} 0px -1px`, + "rgb(27, 196, 125)": `${palette["bg-beta-label"]}`, + }; + + if (currentPalette) { + const updatedColorsMap: Themes.ColorsMap = {}; + const keys = Object.keys(currentPalette); + + for (const key of keys) { + updatedColorsMap[currentPalette[key]] = defaultColorsMap[key]; + } + + return updatedColorsMap; + } + + return defaultColorsMap; +}; diff --git a/src/utils/Common/url.ts b/src/utils/Common/url.ts index 1478486b..8d9361bd 100644 --- a/src/utils/Common/url.ts +++ b/src/utils/Common/url.ts @@ -1,9 +1,9 @@ import * as Url from "url"; import { PROTOCOL, HOMEPAGE } from "Const"; -export const isComponentUrl = (url: string): boolean => /^component:\/\/\w+/.test(url); +export const isPrototypeUrl = (url: string): boolean => /figma\.com\/proto\/.+\/.+?node-id=.+/.test(url); -export const isRedeemAuthUrl = (url: string): boolean => /[a-z]{4,5}:\/\/app_auth\/redeem.+/.test(url); +export const isCommunityUrl = (url: string): boolean => /figma\.com\/community\/.+/.test(url); export const isFigmaProtocolUrl = (url: string): boolean => { const regex = new RegExp(`^${PROTOCOL}://.+`); @@ -11,6 +11,13 @@ export const isFigmaProtocolUrl = (url: string): boolean => { return regex.test(url); }; +export const parseURL = (url: string): URL | undefined => { + try { + return new URL(url); + } catch (_a) {} + return undefined; +}; + export const normalizeUrl = (url: string): string => { if (!isFigmaProtocolUrl(url)) { return url; @@ -32,9 +39,13 @@ export const getParsedUrl = (data: string): Url.UrlWithStringQuery => { }; export const isAppAuthGrandLink = (url: string) => /\/app_auth\/.*\/grant/.test(url); +export const isAppAuthRedeem = (url: string) => /\/app_auth\/redeem\?g_secret=.+/.test(url); export const isAppAuthLink = (url: string) => /figma:\/\/app_auth\/redeem\?g_secret=.*/.test(url); -export const isValidProjectLink = (url: string) => /^(figma:\/\/|https?:\/\/w{0,3}?\.?figma\.com)/.test(url); +export const isRecentFilesLink = (url: string) => + /^(figma:\/\/|https?:\/\/w{0,3}?\.?figma\.com\/files\/recent)/.test(url); + +export const isValidProjectLink = (url: string) => /^(figma:\/\/|https?:\/\/w{0,3}?\.?figma\.com\/file\/)/.test(url); -export const isProtoLink = (url: string) => /^https:\/\/w{0,3}?.figma.com\/proto/.test(url); +export const isFigmaDocLink = (url: string) => /^https:\/\/w{0,3}?.figma.com\/plugin-docs/.test(url); diff --git a/src/utils/Common/wait.ts b/src/utils/Common/wait.ts new file mode 100644 index 00000000..e92481cb --- /dev/null +++ b/src/utils/Common/wait.ts @@ -0,0 +1,3 @@ +export function wait(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/src/utils/Main/Menu/menu.ts b/src/utils/Main/Menu/menu.ts index 8af13fa8..85b829bd 100644 --- a/src/utils/Main/Menu/menu.ts +++ b/src/utils/Main/Menu/menu.ts @@ -1,14 +1,17 @@ import * as E from "electron"; -import { getMenuTemlate } from "Utils/Main"; +import { getMenuTemplate } from "Utils/Main"; import { stringOfActionMenuItemName, assertNever } from "Utils/Common"; import MenuState from "Main/MenuState"; -export const handlePluginMenuAction = (item: Menu.PluginMenuItem, window: E.BrowserWindow) => { - const currentView = window.getBrowserView(); +export const handlePluginMenuAction = (item: Menu.PluginMenuItem, window: E.BrowserWindow): void => { + if (item && item.pluginMenuAction && window) { + if (item.pluginMenuAction.type === "manage") { + handleUrl(window, "/my_plugins"); + return; + } - if (item && item.pluginMenuAction && currentView) { - currentView.webContents.send("handlePluginMenuAction", item.pluginMenuAction); + window.webContents.send("handlePluginMenuAction", item.pluginMenuAction); } }; @@ -21,6 +24,7 @@ export const electronOfPluginMenuItem = (input: Menu.MenuItem): Menu.PluginMenuI label, click: handlePluginMenuAction, enabled: !input.disabled, + visible: input.visible, pluginMenuAction: input.menuAction, }; } @@ -55,7 +59,7 @@ export const setMenuFromTemplate = ( if (template) { mainMenu = E.Menu.buildFromTemplate(template as E.MenuItemConstructorOptions[]); } else { - mainMenu = E.Menu.buildFromTemplate(getMenuTemlate(pluginMenuItems) as E.MenuItemConstructorOptions[]); + mainMenu = E.Menu.buildFromTemplate(getMenuTemplate(pluginMenuItems) as E.MenuItemConstructorOptions[]); } E.Menu.setApplicationMenu(mainMenu); @@ -88,9 +92,11 @@ export const resetMenu = (pluginMenuData: Menu.MenuItem[], template?: E.MenuItem const menuItem: E.MenuItem = menuItemMap[action]; menuItem.enabled = MenuState.actionState ? !!MenuState.actionState[action] : false; } + + return mainMenu; }; -export const item = (label: string, accelerator: string, params: Menu.Params) => { +export const item = (label: string, accelerator: string, params: E.MenuItemConstructorOptions) => { const props: E.MenuItemConstructorOptions = { label, enabled: true, @@ -101,24 +107,17 @@ export const item = (label: string, accelerator: string, params: Menu.Params) => props.accelerator = accelerator; } - return new E.MenuItem(props); + return props; }; -export const commandToMainProcess = (item: E.MenuItemConstructorOptions) => { - E.app.emit("handle-command", item.id); +export const commandToMainProcess = (item: Menu.PluginMenuItem, window: E.BrowserWindow) => { + E.app.emit("handle-command", window.webContents, item.id); }; -export const handleCommandItemClick = (item: any, window: E.BrowserWindow) => { - const currentView = window.getBrowserView(); - - currentView.webContents.send("handlePageCommand", item.command); +export const handleCommandItemClick = (item: Menu.PluginMenuItem, window: E.BrowserWindow) => { + window.webContents.send("handlePageCommand", item.id); }; -export const handleItemAction = (item: any, window: E.BrowserWindow) => { - // FIXME: ugly hack - if (!item.accelerator && item.accelerator && !/ctrl|alt|shift|meta/i.test(item.accelerator)) return; - - const currentView = window.getBrowserView(); - - currentView.webContents.send("handleAction", item.action, "os-menu"); +export const handleUrl = (window: E.BrowserWindow, url: string) => { + E.app.emit("handleUrl", window.webContents.id, url); }; diff --git a/src/utils/Main/Menu/menuItems.ts b/src/utils/Main/Menu/menuItems.ts index 37e8dce9..3a742955 100644 --- a/src/utils/Main/Menu/menuItems.ts +++ b/src/utils/Main/Menu/menuItems.ts @@ -1,212 +1,21 @@ import * as E from "electron"; -import Commander from "Main/Commander"; -import { item, commandToMainProcess, handleCommandItemClick, handleItemAction } from "Utils/Main"; +import { LINKS } from "Const"; +import { item, commandToMainProcess, handleUrl, toggleDetachedDevTools } from "Utils/Main"; -const SEPARATOR = { type: "separator" }; -const FILE_MENU = { - label: "File", +const PLUGINS_MENU = { + label: "Plugins", submenu: [ - item("New File", "Ctrl+N", { id: "newFile", click: commandToMainProcess }), - item("Open File Browser", "Ctrl+O", { id: "openFileBrowser", click: commandToMainProcess }), - item("Reopen Closed Tab", "Ctrl+Shift+T", { id: "reopenClosedTab", click: commandToMainProcess }), - SEPARATOR, { - label: "Close Window", - accelerator: "Ctrl+Shift+W", - click() { - Commander.exec("close-window"); + label: "Manage plugins...", + click(item, window): void { + if (!window) { + return; + } + + handleUrl(window, "/my_plugins"); }, }, - item("Close Tab", "Ctrl+W", { id: "closeTab", click: commandToMainProcess }), - SEPARATOR, - item("Save As .fig...", "Ctrl+Shift+S", { action: "save-as", click: handleItemAction }), - item("Export...", "Ctrl+Shift+E", { action: "export-selected-exportables", click: handleItemAction }), - SEPARATOR, - item("Settings", "", { id: "openSettings", click: commandToMainProcess }), - { role: "quit" }, - ], -} as E.MenuItemConstructorOptions; -const EDIT_MENU = { - label: "Edit", - submenu: [ - item("Undo", "Ctrl+Z", { command: "undo", click: handleCommandItemClick }), - item("Redo", "Control+Y", { command: "redo", click: handleCommandItemClick }), - SEPARATOR, - { role: "cut" }, - { role: "copy" }, - { role: "paste" }, - item("Paste Over Selection", "Shift+Ctrl+V", { action: "paste-over-selection", click: handleItemAction }), - SEPARATOR, - item("Pick Color", "", { action: "toggle-dropper", click: handleItemAction }), - SEPARATOR, - item("Set Default Style", "Alt+Ctrl+X", { action: "set-default-style", click: handleItemAction }), - item("Copy Properties", "Alt+Ctrl+C", { action: "copy-properties", click: handleItemAction }), - item("Paste Properties", "Alt+Ctrl+V", { action: "paste-properties", click: handleItemAction }), - SEPARATOR, - item("Select All", "Ctrl+A", { command: "selectAll", click: handleCommandItemClick }), - item("Select None", null, { action: "deselect-all", click: handleItemAction }), - item("Select Inverse", "Shift+Ctrl+A", { action: "select-inverse", click: handleItemAction }), - SEPARATOR, - item("Select All with Same Style", null, { action: "select-same-style", click: handleItemAction }), - item("Select All with Same Fill", null, { action: "select-same-fill", click: handleItemAction }), - item("Select All with Same Stroke", null, { action: "select-same-stroke", click: handleItemAction }), - item("Select All with Same Effect", null, { action: "select-same-effect", click: handleItemAction }), - item("Select All with Same Text", null, { action: "select-same-text", click: handleItemAction }), - item("Select All with Same Font", null, { action: "select-same-font", click: handleItemAction }), - item("Select All with Same Instance", null, { action: "select-same-instance", click: handleItemAction }), - ], -} as E.MenuItemConstructorOptions; -const VIEW_MENU = { - label: "View", - submenu: [ - item("Show Pixel Grid", "Ctrl+'", { action: "toggle-grid", click: handleItemAction }), - item("Show Layout Grids", "Ctrl+Shift+4", { action: "toggle-shown-layout-grids", click: handleItemAction }), - item("Show Mask Outlines", null, { action: "toggle-show-masks", click: handleItemAction }), - item("Frame Outlines", null, { action: "toggle-show-artboard-outlines", click: handleItemAction }), - item("Show Rulers", "", { action: "toggle-rulers", click: handleItemAction }), - item("Show Layers Panel", "Ctrl+Shift+\\", { action: "toggle-sidebar", click: handleItemAction }), - item("Show UI", "Ctrl+\\", { action: "toggle-ui", click: handleItemAction }), - item("Show Outlines", "Ctrl+Shift+3", { action: "toggle-outlines", click: handleItemAction }), - SEPARATOR, - item("Switch to Layers", "Alt+1", { action: "toggle-layers", click: handleItemAction }), - item("Switch to Components", "Alt+2", { action: "toggle-publish", click: handleItemAction }), - item("Switch to Team Library", "Alt+3", { action: "toggle-library", click: handleItemAction }), - SEPARATOR, - item("Pixel Preview", "Control+Alt+Y", { action: "toggle-pixel-preview", click: handleItemAction }), - item("Show Transparency Checkerboard", "Alt+Shift+'", { action: "toggle-checkerboard", click: handleItemAction }), - SEPARATOR, - item("Zoom In", "", { action: "zoom-in", click: handleItemAction }), - item("Zoom Out", "", { action: "zoom-out", click: handleItemAction }), - item("Zoom to 100%", "", { action: "zoom-reset", click: handleItemAction }), - item("Zoom to Fit", "", { action: "zoom-to-fit", click: handleItemAction }), - item("Zoom to Selection", "", { action: "zoom-to-selection", click: handleItemAction }), - SEPARATOR, - item("Scale UI Normal", "Ctrl+Shift+Backspace", { id: "scale-normal", click: commandToMainProcess }), - item("Scale UI + 10%", "Ctrl+=", { id: "scale-inc0.1", click: commandToMainProcess }), - item("Scale UI - 10%", "Ctrl+-", { id: "scale-dic0.1", click: commandToMainProcess }), - item("Scale UI + 5%", "Ctrl+Shift+=", { id: "scale-inc0.05", click: commandToMainProcess }), - item("Scale UI - 5%", "Ctrl+Shift+-", { id: "scale-dic0.05", click: commandToMainProcess }), - SEPARATOR, - item("Find Next Frame", "", { action: "next-artboard", click: handleItemAction }), - item("Find Previous Frame", "", { action: "previous-artboard", click: handleItemAction }), - SEPARATOR, - { role: "togglefullscreen" }, - ], -} as E.MenuItemConstructorOptions; -const OBJECT_MENU = { - label: "Object", - submenu: [ - item("Group Selection", "Ctrl+G", { action: "group-selection", click: handleItemAction }), - item("Ungroup Selection", "Shift+Ctrl+G", { action: "ungroup-selection", click: handleItemAction }), - item("Frame Selection", "Ctrl+Alt+G", { action: "frame-selection", click: handleItemAction }), - item("Use as Mask", "Alt+Ctrl+M", { action: "mask-selection", click: handleItemAction }), - SEPARATOR, - item("Create Component", "Ctrl+Alt+K", { action: "create-symbol", click: handleItemAction }), - item("Go to Master Component", null, { action: "find-symbol", click: handleItemAction }), - item("Reset Instance", null, { action: "reset-symbol", click: handleItemAction }), - item("Detach Instance", "Ctrl+Alt+B", { action: "detach-instance", click: handleItemAction }), - item("Resize to Fit", null, { action: "resize-to-fit", click: handleItemAction }), - item("Toggle Clipping", null, { action: "toggle-frame-clipping", click: handleItemAction }), - SEPARATOR, - item("Bring to Front", "Ctrl+Shift+]", { action: "bring-to-front", click: handleItemAction }), - item("Bring Forward", "Ctrl+]", { action: "bring-forward", click: handleItemAction }), - item("Send Backward", "Ctrl+[", { action: "send-backward", click: handleItemAction }), - item("Send to Back", "Ctrl+Shift+[", { action: "send-to-back", click: handleItemAction }), - SEPARATOR, - item("Flip Horizontal", "", { action: "flip-horizontal", click: handleItemAction }), - item("Flip Vertical", "", { action: "flip-vertical", click: handleItemAction }), - // item('Flip Horizontal', 'Shift+H', { action: 'flip-horizontal', click: handleItemAction }), - // item('Flip Vertical', 'Shift+V', { action: 'flip-vertical', click: handleItemAction }), - SEPARATOR, - item("Rotate 180˚", null, { action: "rotate-180", click: handleItemAction }), - item("Rotate 90˚ Left", null, { action: "rotate-90-counterclockwise", click: handleItemAction }), - item("Rotate 90˚ Right", null, { action: "rotate-90-clockwise", click: handleItemAction }), - SEPARATOR, - item("Flatten Selection", "Ctrl+E", { action: "flatten-selection", click: handleItemAction }), - item("Outline Stroke", "Shift+Ctrl+O", { action: "outline-stroke", click: handleItemAction }), - { - label: "Boolean Groups", - submenu: [ - item("Union Selection", null, { action: "live-boolean-union", click: handleItemAction }), - item("Subtract Selection", null, { action: "live-boolean-subtract", click: handleItemAction }), - item("Intersect Selection", null, { action: "live-boolean-intersect", click: handleItemAction }), - item("Exclude Selection", null, { action: "live-boolean-xor", click: handleItemAction }), - ], - }, - SEPARATOR, - item("Duplicate Selection in Place", "Ctrl+D", { action: "duplicate-in-place", click: handleItemAction }), - item("Delete Selection", "Backspace", { action: "delete-selection", click: handleItemAction }), - item("Rasterize Selection", null, { action: "convert-to-raster", click: handleItemAction }), - SEPARATOR, - item("Show/Hide Selection", "Shift+Ctrl+H", { action: "toggle-shown-for-selected-nodes", click: handleItemAction }), - item("Lock/Unlock Selection", "Shift+Ctrl+L", { - action: "toggle-locked-for-selected-nodes", - click: handleItemAction, - }), - item("Hide Other Layers", null, { action: "hide-sibling-layers", click: handleItemAction }), - item("Collapse Layers", "Alt+L", { action: "collapse-layers", click: handleItemAction }), - SEPARATOR, - item("Remove Fill", "Alt+/", { action: "remove-fill", click: handleItemAction }), - item("Remove Stroke", "/", { action: "remove-stroke", click: handleItemAction }), - item("Swap Fill and Stroke", "", { action: "swap-fill-and-stroke", click: handleItemAction }), - // item('Swap Fill and Stroke', 'Shift+X', { action: 'swap-fill-and-stroke', click: handleItemAction }), - ], -} as E.MenuItemConstructorOptions; -const VECTOR_MENU = { - label: "Vector", - submenu: [ - item("Join Selection", "Ctrl+J", { action: "join-selection", click: handleItemAction }), - item("Smooth Join Selection", null, { action: "smooth-join-selection", click: handleItemAction }), - item("Delete and Heal Selection", "Shift+Backspace", { - action: "delete-and-heal-selection", - click: handleItemAction, - }), - ], -} as E.MenuItemConstructorOptions; -const TEXT_MENU = { - label: "Text", - submenu: [ - item("Toggle Bold", "Ctrl+B", { action: "text-toggle-bold", click: handleItemAction }), - item("Toggle Italic", "Ctrl+I", { action: "text-toggle-italic", click: handleItemAction }), - item("Toggle Underline", "Ctrl+U", { action: "text-toggle-underline", click: handleItemAction }), - item("Toggle Strikethrough", null, { action: "text-toggle-strikethrough", click: handleItemAction }), - SEPARATOR, - item("Text Original Case", null, { action: "text-original-case", click: handleItemAction }), - item("Text Upper Case", null, { action: "text-upper-case", click: handleItemAction }), - item("Text Lower Case", null, { action: "text-lower-case", click: handleItemAction }), - ], -} as E.MenuItemConstructorOptions; -const ARRANGE_MENU = { - label: "Arrange", - submenu: [ - item("Round to Pixels", null, { action: "round-to-pixels", click: handleItemAction }), - SEPARATOR, - item("Align Left", null, { action: "align-left", click: handleItemAction }), - item("Align Horizontal Centers", null, { action: "align-horizontal-center", click: handleItemAction }), - item("Align Right", null, { action: "align-right", click: handleItemAction }), - item("Align Top", null, { action: "align-top", click: handleItemAction }), - item("Align Vertical Centers", null, { action: "align-vertical-center", click: handleItemAction }), - item("Align Bottom", null, { action: "align-bottom", click: handleItemAction }), - SEPARATOR, - item("Pack Horizontal", null, { action: "pack-horizontal", click: handleItemAction }), - item("Pack Vertical", null, { action: "pack-vertical", click: handleItemAction }), - SEPARATOR, - item("Distribute Horizontal Spacing", "Ctrl+Alt+Control+H", { - action: "distribute-horizontal-spacing", - click: handleItemAction, - }), - item("Distribute Vertical Spacing", "Ctrl+Alt+Control+V", { - action: "distribute-vertical-spacing", - click: handleItemAction, - }), - SEPARATOR, - item("Distribute Left", null, { action: "distribute-left", click: handleItemAction }), - item("Distribute Horizontal Centers", null, { action: "distribute-horizontal-center", click: handleItemAction }), - item("Distribute Right", null, { action: "distribute-right", click: handleItemAction }), - item("Distribute Top", null, { action: "distribute-top", click: handleItemAction }), - item("Distribute Vertical Centers", null, { action: "distribute-vertical-center", click: handleItemAction }), - item("Distribute Bottom", null, { action: "distribute-bottom", click: handleItemAction }), ], } as E.MenuItemConstructorOptions; @@ -215,69 +24,108 @@ const HELP_MENU = { submenu: [ { label: "Help Page", - click() { - E.shell.openExternal("https://help.figma.com"); + click(): void { + E.shell.openExternal(LINKS.HELP_PAGE); + }, + }, + { + label: "Plugins documentation", + click(item, window): void { + if (!window) { + return; + } + + E.shell.openExternal(LINKS.PLUGINS_DOCS); }, }, { label: "Community Forum", - click() { - E.shell.openExternal("https://spectrum.chat/figma"); + click(): void { + E.shell.openExternal(LINKS.FIGMA_COMMUNITY_FORUM); + }, + }, + { + label: "Figma Linux Community Forum", + click(): void { + E.shell.openExternal(LINKS.FIGMA_LINUX_COMMUNITY_FORUM); + }, + }, + { + label: "Figma Linux in Telegram", + click(): void { + E.shell.openExternal(LINKS.FIGMA_LINUX_TELEGRAM); + }, + }, + { + label: "Figma Linux Themes", + click(): void { + E.shell.openExternal(LINKS.THEMES_REPO); }, }, { label: "Video Tutorials", - click() { - E.shell.openExternal("https://www.youtube.com/playlist?list=PLXDU_eVOJTx4HJKh8tQkQRtIe5YlP5smB"); + click(): void { + E.shell.openExternal(LINKS.VIDEO_TUTORIALS); }, }, { label: "Release Notes", - click() { - E.shell.openExternal("http://releases.figma.com"); + click(): void { + E.shell.openExternal(LINKS.RELEASE_NOTES); }, }, { label: "Legal Summary", - click() { - E.shell.openExternal("https://www.figma.com/summary-of-policy"); + click(): void { + E.shell.openExternal(LINKS.LEGAL_SUMMARY); }, }, - SEPARATOR, + { type: "separator" }, { label: "Sign Out", - click() { - Commander.exec("sign-out"); + click(): void { + E.app.emit("sign-out"); }, }, - SEPARATOR, + { type: "separator" }, { label: "Toggle Developer Tools", accelerator: "Ctrl+Alt+I", - click(item, window) { - Commander.exec("toggle-developer-tools", item, window); + click(): void { + E.app.emit("toggle-current-tab-devtools"); }, }, { label: "Toggle Window Developer Tools", accelerator: "Shift+Ctrl+Alt+I", - click(item, window) { - Commander.exec("toggle-window-developer-tools", item, window); + click(_, window): void { + if (!window) { + return; + } + + toggleDetachedDevTools(window.webContents); + }, + }, + { + label: "Toggle Additional Developer Tools", + accelerator: "Shift+Ctrl+Alt+S", + click(): void { + E.app.emit("toggle-settings-developer-tools"); }, }, item("GPU", "", { id: "chrome://gpu", click: commandToMainProcess }), ], } as E.MenuItemConstructorOptions; -export const getMenuTemlate = (pluginMenuItems?: any[]) => { +export const getMenuTemplate = (pluginMenuItems?: any[]): E.MenuItemConstructorOptions[] => { const menu: E.MenuItemConstructorOptions[] = [ - FILE_MENU, - EDIT_MENU, - VIEW_MENU, - OBJECT_MENU, - VECTOR_MENU, - TEXT_MENU, - ARRANGE_MENU, + item("New File", "Ctrl+N", { id: "newFile", click: commandToMainProcess }), + item("Open File Browser", "Ctrl+O", { id: "openFileBrowser", click: commandToMainProcess }), + item("Open File URL from Clipboard", "Ctrl+Shift+O", { id: "openFileUrlClipboard", click: commandToMainProcess }), + { type: "separator" }, + item("Close Tab", "Ctrl+W", { id: "closeTab", click: commandToMainProcess }), + item("Reopen Closed Tab", "Ctrl+Shift+T", { id: "reopenClosedTab", click: commandToMainProcess }), + { type: "separator" }, ]; if (pluginMenuItems && pluginMenuItems.length > 0) { @@ -285,9 +133,32 @@ export const getMenuTemlate = (pluginMenuItems?: any[]) => { label: "Plugins", submenu: pluginMenuItems, }); + } else { + menu.push(PLUGINS_MENU); + menu.push({ type: "separator" }); } + menu.push({ + label: "Theme Creator", + click: () => { + E.app.emit("openThemeCreatorView"); + }, + }); + menu.push({ + label: "Settings", + click: () => { + E.app.emit("openSettingsView"); + }, + }); menu.push(HELP_MENU); + menu.push({ type: "separator" }); + menu.push({ + label: "Exit", + click: () => { + E.app.quit(); + }, + }); + return menu; }; diff --git a/src/utils/Main/cmd.ts b/src/utils/Main/cmd.ts deleted file mode 100755 index 09f17603..00000000 --- a/src/utils/Main/cmd.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { exec } from "child_process"; - -export const cmd = (command: string): Promise => - new Promise((res, rej) => { - exec(command, (err, stdout, stderr) => { - if (err) rej(err); - - res(stdout); - }); - }); diff --git a/src/utils/Main/commands.ts b/src/utils/Main/commands.ts deleted file mode 100644 index 6d44f603..00000000 --- a/src/utils/Main/commands.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as E from "electron"; - -import { toggleDetachedDevTools } from "Utils/Main"; -import { app } from "Utils/Common"; - -export const commands = (): Map => { - const map = new Map(); - - map.set("toggle-developer-tools", (item: E.MenuItemConstructorOptions, window: E.BrowserWindow) => { - const browserView = window.getBrowserView(); - - if (browserView && browserView.webContents) { - toggleDetachedDevTools(browserView.webContents); - } - }); - map.set("toggle-window-developer-tools", (item: E.MenuItemConstructorOptions, window: E.BrowserWindow) => { - toggleDetachedDevTools(window.webContents); - }); - - map.set("close-window", () => { - app.exit(); - }); - - map.set("sign-out", () => { - app.emit("sign-out"); - }); - - return map; -}; diff --git a/src/utils/Main/devTools.ts b/src/utils/Main/devTools.ts index d44c1733..5a3e63bc 100644 --- a/src/utils/Main/devTools.ts +++ b/src/utils/Main/devTools.ts @@ -1,7 +1,7 @@ import * as E from "electron"; export const toggleDetachedDevTools = (webContents: E.WebContents) => { - if (webContents.isDevToolsOpened()) { + if (!webContents || webContents.isDevToolsOpened()) { webContents.closeDevTools(); return; diff --git a/src/utils/Main/dialogs.ts b/src/utils/Main/dialogs.ts new file mode 100755 index 00000000..adc5a509 --- /dev/null +++ b/src/utils/Main/dialogs.ts @@ -0,0 +1,20 @@ +import * as E from "electron"; + +export async function showMessageBox(view: E.BrowserWindow, options: E.MessageBoxOptions) { + const result = await E.dialog.showMessageBox(view, options); + return result.response; +} +export function showMessageBoxSync(view: E.BrowserWindow, options: E.MessageBoxOptions) { + const result = E.dialog.showMessageBoxSync(view, options); + return result; +} + +export async function showOpenDialog(view: E.BrowserWindow, options: E.OpenDialogOptions) { + const result = await E.dialog.showOpenDialog(view, options); + return !result.canceled ? result.filePaths : null; +} + +export async function showSaveDialog(view: E.BrowserWindow, options: E.SaveDialogOptions) { + const result = await E.dialog.showSaveDialog(view, options); + return !result.canceled && result.filePath ? result.filePath : null; +} diff --git a/src/utils/Main/fs.ts b/src/utils/Main/fs.ts new file mode 100755 index 00000000..aa843536 --- /dev/null +++ b/src/utils/Main/fs.ts @@ -0,0 +1,22 @@ +import * as fs from "fs"; + +export async function mkdirIfNotExists(path: string) { + fs.mkdir(path, error => { + if (error && error.code !== "EEXIST") { + throw error; + } + }); +} + +export async function access(path: string): Promise { + try { + await fs.promises.access(path); + return true; + } catch (error) { + return false; + } +} + +export async function mkPath(path: string): Promise { + return fs.promises.mkdir(path, { recursive: true }); +} diff --git a/src/utils/Main/index.ts b/src/utils/Main/index.ts index f4002264..35685bef 100644 --- a/src/utils/Main/index.ts +++ b/src/utils/Main/index.ts @@ -1,12 +1,13 @@ /** * Utils only for Main process */ +export * from "./fs"; export * from "./net"; export * from "./url"; -export * from "./cmd"; +export * from "./themes"; +export * from "./dialogs"; export * from "./cookies"; export * from "./devTools"; export * from "./Menu/menu"; -export * from "./commands"; export * from "./Menu/menuItems"; export * from "./ipcMainHelpers"; diff --git a/src/utils/Main/ipcMainHelpers.ts b/src/utils/Main/ipcMainHelpers.ts index 842799cf..373a00fd 100644 --- a/src/utils/Main/ipcMainHelpers.ts +++ b/src/utils/Main/ipcMainHelpers.ts @@ -3,7 +3,7 @@ import * as E from "electron"; import Tab from "Main/window/Tabs"; import { isDev } from "Utils/Common"; -export function listenToWebBinding(channel: string, listener: Function): void { +export function listenToWebBinding(channel: string, listener: (sender: E.WebContents, ...args: any[]) => void): void { E.ipcMain.on(`web:${channel}`, (event: E.IpcMainEvent, ...args: any[]) => { isDev && console.log(`[ipc] from web: ${channel}`); @@ -11,7 +11,10 @@ export function listenToWebBinding(channel: string, listener: Function): void { }); } -export function listenToWebBindingPromise(channel: string, listener: Function): void { +export function listenToWebBindingPromise( + channel: string, + listener: (sender: E.WebContents, ...args: any[]) => void, +): void { E.ipcMain.on(`web-promise:${channel}`, async (event: E.IpcMainEvent, promiseID: number, ...args: any[]) => { isDev && console.log(`[ipc] from web: ${channel} (promise ${promiseID})`); @@ -36,7 +39,10 @@ export function listenToWebBindingPromise(channel: string, listener: Function): }); } -export function listenToWebRegisterCallback(channel: string, listener: Function): void { +export function listenToWebRegisterCallback( + channel: string, + listener: (sender: E.WebContents, ...args: any[]) => () => void, +): void { E.ipcMain.on(`web-callback:${channel}`, (event: E.IpcMainEvent, args: any, callbackID: number) => { isDev && console.log(`[ipc] from web: ${channel} (callback ${callbackID})`); diff --git a/src/utils/Main/themes.ts b/src/utils/Main/themes.ts new file mode 100644 index 00000000..b7d3fc47 --- /dev/null +++ b/src/utils/Main/themes.ts @@ -0,0 +1,278 @@ +import { app, net } from "electron"; +import * as Azip from "adm-zip"; +import * as fs from "fs"; +import * as path from "path"; +import { v4 } from "uuid"; + +import { + AVAILABLE_THEME_FIELDS, + AVAILABLE_THEME_FIELDS_COUNT, + AVAILABLE_THEME_COLOR_VALUE, + DEFAULT_THEME, + TEST_THEME_ID, + DOWNLOAD_ZIP_URI, + DOWNLOAD_ZIP_PATH, +} from "Const"; +import { storage } from "Main/Storage"; +import WindowManager from "Main/window/WindowManager"; +import { mkPath, access, showSaveDialog } from "Utils/Main"; +import { logger } from "Main/Logger"; + +export const themesDirectory = path.resolve(app.getPath("userData"), "Themes"); +export const creatorThemeDirectory = path.resolve(app.getPath("userData"), "ThemeCreator"); +export const creatorThemeFileName = "theme.json"; + +export function checkThemeColorValue(value: string): boolean { + return AVAILABLE_THEME_COLOR_VALUE.test(value); +} + +function translatePaletteToKebabCase(themeFile: Themes.Theme): Themes.Theme { + const theme = { + id: themeFile.id, + name: themeFile.name, + author: themeFile.author, + } as Themes.Theme; + + const palette = Object.keys(themeFile.palette); + const newPalette = {} as Themes.Palette; + + for (const paletteKey of palette) { + const paletteValue = themeFile.palette[paletteKey]; + const newPaletteKey = paletteKey.replace(/([A-Z])/gm, "-$1").toLowerCase(); + + newPalette[newPaletteKey] = paletteValue; + } + + theme.palette = newPalette; + + return theme; +} + +function translatePaletteToCamelCase(themeFile: Themes.Theme): Themes.Theme { + const theme = { + id: themeFile.id, + name: themeFile.name, + author: themeFile.author, + } as Themes.Theme; + + const palette = Object.keys(themeFile.palette); + const newPalette = {} as Themes.Palette; + + for (const paletteKey of palette) { + const paletteValue = themeFile.palette[paletteKey]; + const newPaletteKey = paletteKey.replace(/-([a-z])/g, s => s.replace("-", "").toUpperCase()); + + newPalette[newPaletteKey] = paletteValue; + } + + theme.palette = newPalette; + + return theme; +} + +export async function readThemeFile(filePath: string): Promise { + const buffer = await fs.promises.readFile(filePath); + const fileText = buffer.toString(); + const theme: Themes.Theme = JSON.parse(fileText); + + return theme; +} + +export function isValidThemePalette(theme: Themes.Theme, fileName?: string): boolean { + if (!theme.palette) { + return false; + } + + if (!fileName) { + fileName = theme.name; + } + + const palette = Object.keys(theme.palette); + + if (palette.length !== AVAILABLE_THEME_FIELDS_COUNT) { + logger.error(`The file "${fileName}" has invalid count of palette colors`); + return false; + } + + for (const paletteKey of palette) { + const paletteValue = theme.palette[paletteKey]; + + if (!AVAILABLE_THEME_FIELDS.includes(paletteKey)) { + logger.error(`Theme "${fileName}" has unavailable color field "${paletteKey}"`); + return false; + } + + if (!checkThemeColorValue(paletteValue)) { + logger.error(`Theme "${fileName}" has incorrect color value: "${paletteValue}" for "${paletteKey}" field`); + return false; + } + } + + return true; +} + +export async function writeThemeFile(filePath: string, theme: Themes.Theme): Promise { + return fs.promises.writeFile(filePath, JSON.stringify(translatePaletteToCamelCase(theme))); +} + +export async function isValidThemeFile(filePath: string, theme: Themes.Theme): Promise { + const extname = path.extname(filePath); + + if (extname !== ".json") { + logger.error(`The file "${filePath}" has not .json extension`); + return false; + } + + if (!theme.author || !theme.name || !theme.palette) { + logger.error(`The file "${filePath}" has not the author or name or palette fields`); + return false; + } + + if (!isValidThemePalette(theme, filePath)) { + return false; + } + + return true; +} + +export async function loadCreatorTheme(): Promise { + await mkPath(creatorThemeDirectory); + + const filePath = path.resolve(creatorThemeDirectory, creatorThemeFileName); + const defaultTheme: Themes.Theme = { + ...DEFAULT_THEME, + id: TEST_THEME_ID, + }; + + if (!(await access(filePath))) { + return defaultTheme; + } + + const themeFile = await fs.promises.readFile(filePath).catch(error => { + logger.error("Cannot read theme creator file: '${filePath}', error: ", error); + + return defaultTheme; + }); + + const theme = JSON.parse(themeFile.toString()) as Themes.Theme; + const data = translatePaletteToCamelCase(theme); + + if (!isValidThemePalette(data, filePath)) { + return defaultTheme; + } + + return { + ...translatePaletteToKebabCase(data), + id: TEST_THEME_ID, + }; +} +export async function saveCreatorTheme(theme: Themes.Theme): Promise { + await mkPath(creatorThemeDirectory); + + const filePath = path.resolve(creatorThemeDirectory, creatorThemeFileName); + + return writeThemeFile(filePath, theme); +} + +export async function exportCreatorTheme(theme: Themes.Theme): Promise { + const themeData = translatePaletteToCamelCase(theme); + + if (!isValidThemePalette(themeData)) { + return; + } + + delete themeData.id; + + const wm = WindowManager.instance; + const themeName = `${theme.name.replace(/\s/, "_")}.json`; + const lastDir = storage.get().app.exportDir; + const dir = lastDir ? `${lastDir}/${themeName}` : themeName; + + const filePath = await showSaveDialog(wm.mainWindow, { + title: "Choose theme export directory location", + defaultPath: dir, + }); + if (!filePath) { + return; + } + + return writeThemeFile(filePath, themeData); +} + +export async function getThemesFromDirectory(): Promise { + const files = await fs.promises.readdir(themesDirectory); + const creatorTheme = await loadCreatorTheme(); + const themes: Themes.Theme[] = [creatorTheme]; + + for (const fileName of files) { + const fullFilePath = path.resolve(themesDirectory, fileName); + const themeFile = await readThemeFile(fullFilePath); + + if (await isValidThemeFile(fullFilePath, themeFile)) { + const theme: Themes.Theme = translatePaletteToKebabCase(themeFile); + + if (!theme.id) { + theme.id = v4(); + + await writeThemeFile(fullFilePath, theme); + } + + themes.push(theme); + } + } + + return themes; +} + +export async function getThemesCount(): Promise { + const files = await fs.promises.readdir(themesDirectory); + + return files.length; +} + +export function updateThemesFromRepository(): Promise { + return new Promise((res, rej) => { + net + .request(DOWNLOAD_ZIP_URI) + .on("response", response => { + const buffers: Uint8Array[] = []; + let length = 0; + + response.on("error", (error: Error) => { + logger.error("Cannot download themes, error: ", error); + rej(error); + }); + response.on("data", data => { + buffers.push(data); + length += data.length; + }); + response.on("end", async () => { + const buffer = Buffer.concat(buffers); + + await fs.promises.writeFile(DOWNLOAD_ZIP_PATH, buffer).catch(error => { + rej(error); + }); + + const zip = new Azip(DOWNLOAD_ZIP_PATH); + + for (const entry of zip.getEntries()) { + if (/\.json/.test(entry.entryName) && !entry.isDirectory) { + const themeData = entry.getData().toString("utf8"); + const themeFileName = path.parse(entry.entryName).base; + const filePath = path.resolve(themesDirectory, themeFileName); + + try { + const theme = JSON.parse(themeData) as Themes.Theme; + await writeThemeFile(filePath, theme); + } catch (error) { + logger.error("Cannot parse JSON file: ", filePath, error); + } + } + } + + res(); + }); + }) + .end(); + }); +} diff --git a/src/utils/Main/url.ts b/src/utils/Main/url.ts index 4eaf06d3..0d0561b6 100755 --- a/src/utils/Main/url.ts +++ b/src/utils/Main/url.ts @@ -12,3 +12,7 @@ export const winUrlProd = formatUrl({ export const isFileBrowser = (url: string): boolean => { return !/file\/.+/.test(url); }; + +export const isFigmaValidUrl = (url: string): boolean => { + return /^(figma:\/\/|https?:\/\/w{0,3}?\.?figma\.com)/.test(url); +}; diff --git a/src/utils/Render/ShortcutsMap.ts b/src/utils/Render/ShortcutsMap.ts deleted file mode 100755 index ba1745b4..00000000 --- a/src/utils/Render/ShortcutsMap.ts +++ /dev/null @@ -1,120 +0,0 @@ -export const shortcutsMap: ShortcutsMap[] = [ - { accelerator: "Ctrl+N", value: "newFile", type: "id" }, - { accelerator: "Ctrl+O", value: "openFileBrowser", type: "id" }, - { accelerator: "Ctrl+Shift+T", value: "reopenClosedTab", type: "id" }, - { accelerator: "Ctrl+W", value: "closeTab", type: "id" }, - { accelerator: "Ctrl+Shift+S", value: "save-as", type: "action" }, - { accelerator: "Ctrl+Shift+E", value: "export-selected-exportables", type: "action" }, - { accelerator: "Ctrl+Z", value: "undo", type: "command" }, - { accelerator: "Ctrl+Y", value: "redo", type: "command" }, - { accelerator: "Shift+Ctrl+V", value: "paste-over-selection", type: "action" }, - { accelerator: "I", value: "toggle-dropper", type: "action" }, - { accelerator: "Alt+Ctrl+X", value: "set-default-style", type: "action" }, - { accelerator: "Alt+Ctrl+C", value: "copy-properties", type: "action" }, - { accelerator: "Alt+Ctrl+V", value: "paste-properties", type: "action" }, - { accelerator: "Ctrl+A", value: "selectAll", type: "command" }, - { accelerator: "", value: "deselect-all", type: "action" }, - { accelerator: "Shift+Ctrl+A", value: "select-inverse", type: "action" }, - { accelerator: "", value: "select-same-style", type: "action" }, - { accelerator: "", value: "select-same-fill", type: "action" }, - { accelerator: "", value: "select-same-stroke", type: "action" }, - { accelerator: "", value: "select-same-effect", type: "action" }, - { accelerator: "", value: "select-same-text", type: "action" }, - { accelerator: "", value: "select-same-font", type: "action" }, - { accelerator: "", value: "select-same-instance", type: "action" }, - { accelerator: "Ctrl+'", value: "toggle-grid", type: "action" }, - { accelerator: "Ctrl+Shift+4", value: "toggle-shown-layout-grids", type: "action" }, - { accelerator: "", value: "toggle-show-masks", type: "action" }, - { accelerator: "", value: "toggle-show-artboard-outlines", type: "action" }, - { accelerator: "Shift+R", value: "toggle-rulers", type: "action" }, - { accelerator: "Ctrl+Shift+\\", value: "toggle-sidebar", type: "action" }, - { accelerator: "Ctrl+\\", value: "toggle-ui", type: "action" }, - { accelerator: "Ctrl+Shift+3", value: "toggle-outlines", type: "action" }, - { accelerator: "Alt+1", value: "toggle-layers", type: "action" }, - { accelerator: "Alt+2", value: "toggle-publish", type: "action" }, - { accelerator: "Alt+3", value: "toggle-library", type: "action" }, - { accelerator: "Ctrl+Alt+Y", value: "toggle-pixel-preview", type: "action" }, - { accelerator: "Alt+Shift+'", value: "toggle-checkerboard", type: "action" }, - { accelerator: "", value: "zoom-in", type: "action" }, - { accelerator: "", value: "zoom-out", type: "action" }, - { accelerator: "Shift+0", value: "zoom-reset", type: "action" }, - { accelerator: "Shift+1", value: "zoom-to-fit", type: "action" }, - { accelerator: "Shift+2", value: "zoom-to-selection", type: "action" }, - { accelerator: "Ctrl+Shift+Backspace", value: "scale-normal", type: "id" }, - { accelerator: "Ctrl+=", value: "scale-inc0.1", type: "id" }, - { accelerator: "Ctrl+-", value: "scale-dic0.1", type: "id" }, - { accelerator: "Ctrl+Shift+=", value: "scale-inc0.05", type: "id" }, - { accelerator: "Ctrl+Shift+-", value: "scale-dic0.05", type: "id" }, - { accelerator: "N", value: "next-artboard", type: "action" }, - { accelerator: "Shift+N", value: "previous-artboard", type: "action" }, - { accelerator: "Ctrl+G", value: "group-selection", type: "action" }, - { accelerator: "Shift+Ctrl+G", value: "ungroup-selection", type: "action" }, - { accelerator: "Ctrl+Alt+G", value: "frame-selection", type: "action" }, - { accelerator: "Alt+Ctrl+M", value: "mask-selection", type: "action" }, - { accelerator: "Ctrl+Alt+K", value: "create-symbol", type: "action" }, - { accelerator: "", value: "find-symbol", type: "action" }, - { accelerator: "", value: "reset-symbol", type: "action" }, - { accelerator: "Ctrl+Alt+B", value: "detach-instance", type: "action" }, - { accelerator: "", value: "resize-to-fit", type: "action" }, - { accelerator: "", value: "toggle-frame-clipping", type: "action" }, - { accelerator: "Ctrl+Shift+]", value: "bring-to-front", type: "action" }, - { accelerator: "Ctrl+]", value: "bring-forward", type: "action" }, - { accelerator: "Ctrl+[", value: "send-backward", type: "action" }, - { accelerator: "Ctrl+Shift+[", value: "send-to-back", type: "action" }, - { accelerator: "", value: "flip-horizontal", type: "action" }, - { accelerator: "", value: "flip-vertical", type: "action" }, - // { accelerator: 'Shift+H', value: 'flip-horizontal', type: 'action' }, - // { accelerator: 'Shift+V', value: 'flip-vertical', type: 'action' }, - { accelerator: "", value: "rotate-180", type: "action" }, - { accelerator: "", value: "rotate-90-counterclockwise", type: "action" }, - { accelerator: "", value: "rotate-90-clockwise", type: "action" }, - { accelerator: "Ctrl+E", value: "flatten-selection", type: "action" }, - { accelerator: "Shift+Ctrl+O", value: "outline-stroke", type: "action" }, - { accelerator: "", value: "live-boolean-union", type: "action" }, - { accelerator: "", value: "live-boolean-subtract", type: "action" }, - { accelerator: "", value: "live-boolean-intersect", type: "action" }, - { accelerator: "", value: "live-boolean-xor", type: "action" }, - { accelerator: "Ctrl+D", value: "duplicate-in-place", type: "action" }, - { accelerator: "Backspace", value: "delete-selection", type: "action" }, - { accelerator: "", value: "convert-to-raster", type: "action" }, - { accelerator: "Shift+Ctrl+H", value: "toggle-shown-for-selected-nodes", type: "action" }, - { accelerator: "Shift+Ctrl+L", value: "toggle-locked-for-selected-nodes", type: "action" }, - { accelerator: "", value: "hide-sibling-layers", type: "action" }, - { accelerator: "Alt+L", value: "collapse-layers", type: "action" }, - { accelerator: "Alt+/", value: "remove-fill", type: "action" }, - { accelerator: "/", value: "remove-stroke", type: "action" }, - { accelerator: "", value: "swap-fill-and-stroke", type: "action" }, - // { accelerator: 'Shift+X', value: 'swap-fill-and-stroke', type: 'action' }, - { accelerator: "Ctrl+J", value: "join-selection", type: "action" }, - { accelerator: "", value: "smooth-join-selection", type: "action" }, - { accelerator: "Shift+Backspace", value: "delete-and-heal-selection", type: "action" }, - { accelerator: "Ctrl+B", value: "text-toggle-bold", type: "action" }, - { accelerator: "Ctrl+I", value: "text-toggle-italic", type: "action" }, - { accelerator: "Ctrl+U", value: "text-toggle-underline", type: "action" }, - { accelerator: "", value: "text-toggle-strikethrough", type: "action" }, - { accelerator: "", value: "text-original-case", type: "action" }, - { accelerator: "", value: "text-upper-case", type: "action" }, - { accelerator: "", value: "text-lower-case", type: "action" }, - { accelerator: "", value: "round-to-pixels", type: "action" }, - { accelerator: "", value: "align-left", type: "action" }, - { accelerator: "", value: "align-horizontal-center", type: "action" }, - { accelerator: "", value: "align-right", type: "action" }, - { accelerator: "", value: "align-top", type: "action" }, - { accelerator: "", value: "align-vertical-center", type: "action" }, - { accelerator: "", value: "align-bottom", type: "action" }, - { accelerator: "", value: "pack-horizontal", type: "action" }, - { accelerator: "", value: "pack-vertical", type: "action" }, - { accelerator: "Shift+Alt+Ctrl+H", value: "distribute-horizontal-spacing", type: "action" }, - { accelerator: "Shift+Alt+Ctrl+V", value: "distribute-vertical-spacing", type: "action" }, - { accelerator: "", value: "distribute-left", type: "action" }, - { accelerator: "", value: "distribute-horizontal-center", type: "action" }, - { accelerator: "", value: "distribute-right", type: "action" }, - { accelerator: "", value: "distribute-top", type: "action" }, - { accelerator: "", value: "distribute-vertical-center", type: "action" }, - { accelerator: "", value: "distribute-bottom", type: "action" }, - - { accelerator: "Ctrl+Shift+W", value: "close-window", type: "id" }, - - { accelerator: "Ctrl+Alt+I", value: "toggle-developer-tools", type: "id" }, - { accelerator: "Shift+Ctrl+Alt+I", value: "toggle-window-developer-tools", type: "id" }, -]; diff --git a/src/utils/Render/index.ts b/src/utils/Render/index.ts index 54bcc89e..6d6c09a6 100644 --- a/src/utils/Render/index.ts +++ b/src/utils/Render/index.ts @@ -1,4 +1,2 @@ -/** - * Utils only for Renderer process - */ +export * from "./themes"; export * from "./webBindingsHelpers"; diff --git a/src/utils/Render/shortcuts.ts b/src/utils/Render/shortcuts.ts deleted file mode 100755 index bf281267..00000000 --- a/src/utils/Render/shortcuts.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as E from "electron"; -import * as Settings from "electron-settings"; - -import { app } from "Utils/Common"; -import { shortcutsMap } from "./ShortcutsMap"; -import shortcutMan from "Middleware/ShortcutMan"; - -export default () => { - const currentWindow = E.remote.BrowserWindow.getAllWindows()[0]; - - for (const shortcut of shortcutsMap) { - if (shortcut.accelerator === "") continue; - - switch (shortcut.type) { - case "command": - { - shortcutMan.bind(shortcut.accelerator.toLocaleLowerCase(), () => { - if (!Settings.get("app.disabledMainMenu")) return; - - console.log("command: ", !Settings.get("app.disabledMainMenu"), shortcut); - - // TODO: Replce on Event Emitter. Send the event to Main process - // MenuHelper.handleCommandItemClick({ command: shortcut.value, accelerator: shortcut.accelerator }, currentWindow); - app.emit( - "handle-page-command", - { command: shortcut.value, accelerator: shortcut.accelerator }, - currentWindow, - ); - }); - } - break; - case "id": - { - shortcutMan.bind(shortcut.accelerator.toLocaleLowerCase(), () => { - if (!Settings.get("app.disabledMainMenu")) return; - - console.log("id: ", !Settings.get("app.disabledMainMenu"), shortcut); - - app.emit("handle-command", shortcut.value); - }); - } - break; - - default: { - } - } - } -}; diff --git a/src/utils/Render/themes.ts b/src/utils/Render/themes.ts new file mode 100644 index 00000000..ce559cc8 --- /dev/null +++ b/src/utils/Render/themes.ts @@ -0,0 +1,10 @@ +export const getColorPallet = (theme: Themes.Theme): React.CSSProperties => { + const props = {} as CSSStyleDeclaration; + + for (const key of Object.keys(theme.palette)) { + const prop = theme.palette[key]; + props[`--${key}`] = prop; + } + + return props as React.CSSProperties; +}; diff --git a/src/utils/Render/webBindingsHelpers.ts b/src/utils/Render/webBindingsHelpers.ts index 82ebf8c7..b23cdbe9 100644 --- a/src/utils/Render/webBindingsHelpers.ts +++ b/src/utils/Render/webBindingsHelpers.ts @@ -1,47 +1,5 @@ import * as E from "electron"; -export const postPromiseMessageToMainProcess = (function() { - let nextPromiseID = 0; - const pendingPromises = new Map(); - - E.ipcRenderer.on("handlePromiseResolve", (event: E.Event, promiseID: number, result: any) => { - const pendingPromise = pendingPromises.get(promiseID); - if (pendingPromise) { - pendingPromises.delete(promiseID); - pendingPromise.resolve(result); - } else { - console.error("[desktop] unexpected resolve for promise", promiseID); - } - }); - E.ipcRenderer.on("handlePromiseReject", (event: E.Event, promiseID: number, error: any) => { - const pendingPromise = pendingPromises.get(promiseID); - if (pendingPromise) { - pendingPromises.delete(promiseID); - pendingPromise.reject(error); - } else { - console.error("[desktop] unexpected reject for promise", promiseID); - } - }); - - return function(channel: string, ...args: any[]) { - return new Promise(function(resolve, reject) { - const promiseID = nextPromiseID++; - const noResp = setTimeout(() => console.log("pPMTMP no response:", promiseID, channel), 1000); - pendingPromises.set(promiseID, { - resolve: (r: any) => { - clearTimeout(noResp); - resolve(r); - }, - reject: (r: any) => { - clearTimeout(noResp); - reject(r); - }, - }); - E.ipcRenderer.send("web-promise:" + channel, promiseID, ...args); - }); - }; -})(); - export const postCallbackMessageToMainProcess = (channel: string, ...args: any[]) => { E.ipcRenderer.send(`web-callback:${channel}`, ...args); }; @@ -63,7 +21,7 @@ export const registerCallbackWithMainProcess = (() => { } }); - return function(channel: string, args: any, callback: Function) { + return function(channel: string, args: any, callback: (result: any) => void) { const callbackID = nextCallbackID++; registeredCallbacks.set(callbackID, callback); diff --git a/tsconfig.json b/tsconfig.json index 85ea85cd..1565fe41 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,62 +1,64 @@ { - "extends": "./node_modules/electron-webpack/tsconfig-base.json", - "compilerOptions": { - "jsx": "react", - "outDir": "./dist", - "baseUrl": "./", - "noImplicitAny": true, - "allowJs": false, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "preserveConstEnums": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "strictPropertyInitialization": false, - "noImplicitThis": false, - "allowUnusedLabels": true, - "noUnusedLocals": false, - "strictNullChecks": false, - "lib": [ - "dom", - "es7", - "esnext" - ], - "typeRoots": [ - "node_modules/@types", - "@types/**/*.d.ts" - ], - "paths": { - "Main": ["src/main"], - "Main/*": ["src/main/*"], - "Components": ["src/renderer/components"], - "Components/*": ["src/renderer/components/*"], - "Elements/*": ["src/renderer/elements/*"], - "Elements": ["src/renderer/elements"], - "Store": ["src/renderer/stores"], - "Store/*": ["src/renderer/stores/*"], - "Middleware": ["src/middleware"], - "Middleware/*": ["src/middleware/*"], - "Const": ["src/constants"], - "Utils": ["src/utils"], - "Utils/*": ["src/utils/*"], - "*": ["node_modules/@types/*"] - }, - }, - "include": [ - "@types/**/*", - "src/main/index.ts", - "src/renderer/index.tsx", - "src/middleware/loadMainContent.ts", - "src/middleware/loadContent.ts", - "src/middleware/*.ts" + "extends": "./node_modules/electron-webpack/tsconfig-base.json", + "compilerOptions": { + "jsx": "react", + "outDir": "./dist", + "baseUrl": "./", + "noImplicitAny": true, + "allowJs": false, + "target": "es6", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "preserveConstEnums": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "strictPropertyInitialization": false, + "noImplicitThis": false, + "allowUnusedLabels": true, + "noUnusedLocals": false, + "strictNullChecks": false, + "lib": [ + "dom", + "es7", + "esnext" + ], + "typeRoots": [ + "node_modules/@types", + "@types/**/*.d.ts" ], - "exclude": [ - "node_modules", - "biuld", - "*.sass" - ] + "paths": { + "Main": ["src/main"], + "Main/*": ["src/main/*"], + "Components": ["src/renderer/components"], + "Components/*": ["src/renderer/components/*"], + "Elements/*": ["src/renderer/elements/*"], + "Elements": ["src/renderer/elements"], + "Store": ["src/renderer/stores"], + "Store/*": ["src/renderer/stores/*"], + "Middleware": ["src/middleware"], + "Middleware/*": ["src/middleware/*"], + "Const": ["src/constants"], + "Utils": ["src/utils"], + "Utils/*": ["src/utils/*"], + "Enums": ["@types/enums.ts"], + "Storage": ["src/main/Storage.ts"], + "*": ["node_modules/@types/*"] + }, + }, + "include": [ + "@types/**/*", + "src/main/index.ts", + "src/renderer/index.tsx", + "src/middleware/loadMainContent.ts", + "src/middleware/loadContent.ts", + "src/middleware/*.ts" + ], + "exclude": [ + "node_modules", + "build", + "*.sass" + ] }