From d21f90672bd26192a4e74946b61c48a8e38abadf Mon Sep 17 00:00:00 2001 From: Jane <272005125@qq.com> Date: Mon, 19 Feb 2024 17:25:32 +0800 Subject: [PATCH] first commit --- .babelrc | 14 + .dockerignore | 9 + .editorconfig | 9 + .eslintignore | 3 + .eslintrc.js | 44 + .gitignore | 10 + .postcssrc.js | 8 + .stylelintrc | 7 + .travis.yml | 22 + LICENSE | 201 + README.md | 0 build/build.js | 35 + build/check-versions.js | 48 + build/deploy.sh | 24 + build/dev-client.js | 9 + build/dev-server.js | 94 + build/utils.js | 71 + build/vue-loader.conf.js | 12 + build/webpack.base.conf.js | 109 + build/webpack.dev.conf.js | 35 + build/webpack.prod.conf.js | 154 + build/webpack.style.conf.js | 56 + chart/.helmignore | 22 + chart/Chart.yaml | 5 + chart/templates/NOTES.txt | 21 + chart/templates/_helpers.tpl | 45 + chart/templates/deployment.yaml | 87 + chart/templates/ingress.yaml | 39 + chart/templates/service.yaml | 16 + chart/templates/tests/test-connection.yaml | 15 + chart/values.yaml | 71 + chrome-app/icon-128.png | Bin 0 -> 3888 bytes chrome-app/icon-16.png | Bin 0 -> 491 bytes chrome-app/icon-256.png | Bin 0 -> 7881 bytes chrome-app/icon-32.png | Bin 0 -> 960 bytes chrome-app/icon-512.png | Bin 0 -> 16169 bytes chrome-app/icon-64.png | Bin 0 -> 1982 bytes chrome-app/manifest.json | 28 + config/dev.env.js | 18 + config/index.js | 39 + config/prod.env.js | 3 + gulpfile.js | 20 + index.html | 28 + index.js | 27 + package-lock.json | 22028 ++++++++++++++++ package.json | 141 + server/conf.js | 54 + server/gitea.js | 40 + server/gitee.js | 42 + server/github.js | 37 + server/gitlab.js | 40 + server/index.js | 89 + server/pandoc.js | 141 + server/pdf.js | 178 + src/assets/favicon.png | Bin 0 -> 16169 bytes src/assets/fonts/RobotoMono-Bold.woff | Bin 0 -> 19572 bytes src/assets/fonts/RobotoMono-Regular.woff | Bin 0 -> 19592 bytes src/assets/fonts/lato-black-italic.woff | Bin 0 -> 310776 bytes src/assets/fonts/lato-black.woff | Bin 0 -> 297272 bytes src/assets/fonts/lato-normal-italic.woff | Bin 0 -> 328412 bytes src/assets/fonts/lato-normal.woff | Bin 0 -> 309192 bytes src/assets/iconBlogger.svg | 1 + src/assets/iconCouchdb.svg | 4 + src/assets/iconCustom.svg | 3 + src/assets/iconDropbox.svg | 9 + src/assets/iconGitea.svg | 1 + src/assets/iconGitee.svg | 5 + src/assets/iconGithub.svg | 6 + src/assets/iconGithubDark.svg | 6 + src/assets/iconGitlab.svg | 12 + src/assets/iconGoogle.svg | 13 + src/assets/iconGoogleDrive.svg | 8 + src/assets/iconGooglePhotos.svg | 12 + src/assets/iconSmms.svg | 25 + src/assets/iconStackedit.svg | 1 + src/assets/iconWordpress.svg | 10 + src/assets/iconZendesk.svg | 10 + src/assets/logo.svg | 1 + src/components/App.vue | 109 + src/components/ButtonBar.vue | 109 + src/components/CodeEditor.vue | 56 + src/components/ContextMenu.vue | 79 + src/components/Editor.vue | 171 + src/components/EditorInPageButtons.vue | 197 + src/components/Explorer.vue | 225 + src/components/ExplorerNode.vue | 292 + src/components/FindReplace.vue | 395 + src/components/Layout.vue | 245 + src/components/Modal.vue | 489 + src/components/NavigationBar.vue | 543 + src/components/Notification.vue | 72 + src/components/Preview.vue | 181 + src/components/PreviewInPageButtons.vue | 212 + src/components/SideBar.vue | 191 + src/components/SplashScreen.vue | 22 + src/components/StatusBar.vue | 132 + src/components/Toc.vue | 162 + src/components/Tour.vue | 254 + src/components/UserImage.vue | 39 + src/components/UserName.vue | 27 + src/components/common/DropdownMenu.vue | 137 + src/components/common/EditorClassApplier.js | 89 + src/components/common/PreviewClassApplier.js | 82 + src/components/common/vueGlobals.js | 80 + src/components/gutters/Comment.vue | 83 + src/components/gutters/CommentList.vue | 362 + src/components/gutters/CurrentDiscussion.vue | 177 + .../gutters/EditorNewDiscussionButton.vue | 55 + src/components/gutters/NewComment.vue | 168 + .../gutters/PreviewNewDiscussionButton.vue | 56 + src/components/gutters/StickyComment.vue | 48 + src/components/menus/EditThemeMenu.vue | 116 + src/components/menus/HistoryMenu.vue | 474 + src/components/menus/ImportExportMenu.vue | 127 + src/components/menus/MainMenu.vue | 263 + src/components/menus/PreviewThemeMenu.vue | 116 + src/components/menus/PublishMenu.vue | 307 + src/components/menus/SyncMenu.vue | 388 + src/components/menus/WorkspaceBackupMenu.vue | 64 + src/components/menus/WorkspacesMenu.vue | 137 + src/components/menus/common/MenuEntry.vue | 97 + src/components/menus/common/MenuItem.vue | 93 + src/components/modals/AboutModal.vue | 76 + .../modals/AccountManagementModal.vue | 369 + .../modals/BadgeManagementModal.vue | 124 + src/components/modals/ChatGptModal.vue | 131 + src/components/modals/CommitMessageModal.vue | 43 + src/components/modals/FilePropertiesModal.vue | 253 + src/components/modals/HtmlExportModal.vue | 67 + src/components/modals/ImageModal.vue | 314 + src/components/modals/LinkModal.vue | 41 + src/components/modals/PandocExportModal.vue | 70 + src/components/modals/PdfExportModal.vue | 67 + .../modals/PublishManagementModal.vue | 178 + src/components/modals/SettingsModal.vue | 114 + src/components/modals/SponsorModal.vue | 101 + src/components/modals/SyncManagementModal.vue | 159 + src/components/modals/TemplatesModal.vue | 186 + .../modals/WorkspaceImgPathModal.vue | 48 + .../modals/WorkspaceManagementModal.vue | 284 + src/components/modals/common/FormEntry.vue | 23 + src/components/modals/common/ModalInner.vue | 42 + src/components/modals/common/Tab.vue | 13 + src/components/modals/common/modalTemplate.js | 79 + .../providers/BloggerPagePublishModal.vue | 67 + .../modals/providers/BloggerPublishModal.vue | 68 + .../providers/CouchdbCredentialsModal.vue | 55 + .../providers/CouchdbWorkspaceModal.vue | 55 + .../modals/providers/CustomAccountModal.vue | 109 + .../modals/providers/DropboxAccountModal.vue | 34 + .../modals/providers/DropboxPublishModal.vue | 60 + .../modals/providers/DropboxSaveModal.vue | 46 + .../modals/providers/GistPublishModal.vue | 79 + .../modals/providers/GistSyncModal.vue | 64 + .../modals/providers/GiteaAccountModal.vue | 103 + .../modals/providers/GiteaImgStorageModal.vue | 77 + .../modals/providers/GiteaOpenModal.vue | 69 + .../modals/providers/GiteaPublishModal.vue | 85 + .../modals/providers/GiteaSaveModal.vue | 72 + .../modals/providers/GiteaWorkspaceModal.vue | 67 + .../modals/providers/GiteeAccountModal.vue | 21 + .../providers/GiteeGistPublishModal.vue | 79 + .../modals/providers/GiteeGistSyncModal.vue | 64 + .../modals/providers/GiteeOpenModal.vue | 70 + .../modals/providers/GiteePublishModal.vue | 86 + .../modals/providers/GiteeSaveModal.vue | 73 + .../modals/providers/GiteeWorkspaceModal.vue | 65 + .../modals/providers/GithubAccountModal.vue | 31 + .../providers/GithubImgStorageModal.vue | 78 + .../modals/providers/GithubOpenModal.vue | 70 + .../modals/providers/GithubPublishModal.vue | 86 + .../modals/providers/GithubSaveModal.vue | 73 + .../modals/providers/GithubWorkspaceModal.vue | 65 + .../modals/providers/GitlabAccountModal.vue | 103 + .../modals/providers/GitlabOpenModal.vue | 69 + .../modals/providers/GitlabPublishModal.vue | 85 + .../modals/providers/GitlabSaveModal.vue | 72 + .../modals/providers/GitlabWorkspaceModal.vue | 67 + .../providers/GoogleDriveAccountModal.vue | 34 + .../providers/GoogleDrivePublishModal.vue | 95 + .../modals/providers/GoogleDriveSaveModal.vue | 69 + .../providers/GoogleDriveWorkspaceModal.vue | 60 + .../modals/providers/GooglePhotoModal.vue | 73 + .../modals/providers/SmmsAccountModal.vue | 54 + .../providers/WordpressPublishModal.vue | 70 + .../modals/providers/ZendeskAccountModal.vue | 65 + .../modals/providers/ZendeskPublishModal.vue | 76 + src/data/constants.js | 27 + src/data/defaults/defaultLayoutSettings.js | 14 + src/data/defaults/defaultLocalSettings.js | 44 + src/data/defaults/defaultSettings.yml | 131 + src/data/defaults/defaultWorkspaces.js | 7 + src/data/empties/emptyContent.js | 9 + src/data/empties/emptyContentState.js | 8 + src/data/empties/emptyFile.js | 7 + src/data/empties/emptyFolder.js | 7 + src/data/empties/emptyPublishLocation.js | 8 + src/data/empties/emptySyncLocation.js | 7 + src/data/empties/emptySyncedContent.js | 8 + src/data/empties/emptyTemplateHelpers.js | 16 + src/data/empties/emptyTemplateValue.html | 38 + src/data/faq.md | 9 + src/data/features.js | 622 + src/data/markdownSample.md | 129 + src/data/pagedownButtons.js | 56 + src/data/presets.js | 114 + src/data/simpleModals.js | 136 + src/data/templates/jekyllSiteTemplate.html | 5 + src/data/templates/plainHtmlTemplate.html | 1 + src/data/templates/styledHtmlTemplate.html | 19 + .../styledHtmlWithThemeAndTocTemplate.html | 43 + .../styledHtmlWithThemeTemplate.html | 36 + .../templates/styledHtmlWithTocTemplate.html | 28 + src/data/welcomeFile.md | 145 + src/extensions/abcExtension.js | 21 + src/extensions/emojiExtension.js | 13 + src/extensions/index.js | 5 + src/extensions/katexExtension.js | 32 + src/extensions/libs/markdownItAnchor.js | 133 + src/extensions/libs/markdownItMath.js | 69 + src/extensions/libs/markdownItTasklist.js | 40 + src/extensions/markdownExtension.js | 163 + src/extensions/mermaidExtension.js | 73 + src/icons/Alert.vue | 5 + src/icons/ArrowLeft.vue | 5 + src/icons/ChatGpt.vue | 3 + src/icons/CheckCircle.vue | 5 + src/icons/CheckCircleUn.vue | 5 + src/icons/Close.vue | 5 + src/icons/CodeBraces.vue | 5 + src/icons/CodeTags.vue | 5 + src/icons/ContentCopy.vue | 5 + src/icons/ContentSave.vue | 5 + src/icons/Copy.vue | 3 + src/icons/Database.vue | 5 + src/icons/Delete.vue | 5 + src/icons/DotsHorizontal.vue | 5 + src/icons/Download.vue | 5 + src/icons/Ellipsis.vue | 3 + src/icons/Eye.vue | 5 + src/icons/FileImage.vue | 5 + src/icons/FileMultiple.vue | 5 + src/icons/FilePlus.vue | 5 + src/icons/FileSearch.vue | 5 + src/icons/FindReplace.vue | 3 + src/icons/Folder.vue | 5 + src/icons/FolderMultiple.vue | 5 + src/icons/FolderPlus.vue | 5 + src/icons/FormatBold.vue | 5 + src/icons/FormatItalic.vue | 5 + src/icons/FormatListBulleted.vue | 5 + src/icons/FormatListChecks.vue | 5 + src/icons/FormatListNumbers.vue | 5 + src/icons/FormatQuoteClose.vue | 5 + src/icons/FormatSize.vue | 5 + src/icons/FormatStrikethrough.vue | 5 + src/icons/HelpCircle.vue | 5 + src/icons/History.vue | 5 + src/icons/Information.vue | 5 + src/icons/Key.vue | 5 + src/icons/LinkVariant.vue | 5 + src/icons/Login.vue | 5 + src/icons/Logout.vue | 5 + src/icons/Magnify.vue | 5 + src/icons/Menu.vue | 5 + src/icons/Message.vue | 5 + src/icons/NavigationBar.vue | 6 + src/icons/OpenInNew.vue | 5 + src/icons/Pen.vue | 5 + src/icons/Printer.vue | 5 + src/icons/Provider.vue | 117 + src/icons/Redo.vue | 5 + src/icons/ScrollSync.vue | 5 + src/icons/Seal.vue | 5 + src/icons/Search.vue | 3 + src/icons/SelectTheme.vue | 3 + src/icons/Settings.vue | 5 + src/icons/Share.vue | 3 + src/icons/SidePreview.vue | 5 + src/icons/SignalOff.vue | 5 + src/icons/StatusBar.vue | 6 + src/icons/SwitchTheme.vue | 3 + src/icons/Sync.vue | 5 + src/icons/SyncAuto.vue | 5 + src/icons/SyncOff.vue | 5 + src/icons/SyncStop.vue | 5 + src/icons/Table.vue | 5 + src/icons/Target.vue | 5 + src/icons/Toc.vue | 5 + src/icons/Undo.vue | 5 + src/icons/Upload.vue | 5 + src/icons/ViewList.vue | 5 + src/icons/index.js | 136 + src/index.js | 59 + src/libs/clunderscore.js | 171 + src/libs/htmlSanitizer.js | 424 + src/libs/pagedown.js | 1423 + src/services/animationSvc.js | 237 + src/services/backupSvc.js | 74 + src/services/badgeSvc.js | 37 + src/services/chatGptSvc.js | 42 + src/services/diffUtils.js | 201 + src/services/editor/cledit/cleditCore.js | 445 + .../editor/cledit/cleditHighlighter.js | 199 + src/services/editor/cledit/cleditKeystroke.js | 188 + src/services/editor/cledit/cleditMarker.js | 49 + .../editor/cledit/cleditSelectionMgr.js | 431 + src/services/editor/cledit/cleditUndoMgr.js | 176 + src/services/editor/cledit/cleditUtils.js | 129 + src/services/editor/cledit/cleditWatcher.js | 34 + src/services/editor/cledit/index.js | 11 + src/services/editor/editorSvcDiscussions.js | 256 + src/services/editor/editorSvcUtils.js | 151 + src/services/editor/sectionUtils.js | 114 + src/services/editorSvc.js | 685 + src/services/explorerSvc.js | 98 + src/services/exportSvc.js | 193 + src/services/extensionSvc.js | 37 + src/services/gitWorkspaceSvc.js | 236 + src/services/imageSvc.js | 94 + src/services/localDbSvc.js | 510 + src/services/markdownConversionSvc.js | 273 + src/services/markdownGrammarSvc.js | 435 + src/services/networkSvc.js | 342 + src/services/optional/index.js | 4 + src/services/optional/keystrokes.js | 188 + src/services/optional/scrollSync.js | 180 + src/services/optional/shortcuts.js | 109 + src/services/optional/taskChange.js | 47 + src/services/providers/bloggerPageProvider.js | 45 + src/services/providers/bloggerProvider.js | 45 + src/services/providers/common/Provider.js | 102 + .../providers/common/providerRegistry.js | 7 + .../providers/couchdbWorkspaceProvider.js | 229 + src/services/providers/dropboxProvider.js | 153 + src/services/providers/gistProvider.js | 95 + src/services/providers/giteaProvider.js | 180 + .../providers/giteaWorkspaceProvider.js | 331 + .../providers/giteeAppDataProvider.js | 292 + src/services/providers/giteeGistProvider.js | 95 + src/services/providers/giteeProvider.js | 170 + .../providers/giteeWorkspaceProvider.js | 315 + .../providers/githubAppDataProvider.js | 292 + src/services/providers/githubProvider.js | 169 + .../providers/githubWorkspaceProvider.js | 313 + src/services/providers/gitlabProvider.js | 173 + .../providers/gitlabWorkspaceProvider.js | 317 + .../providers/googleDriveAppDataProvider.js | 187 + src/services/providers/googleDriveProvider.js | 216 + .../providers/googleDriveWorkspaceProvider.js | 534 + .../providers/helpers/couchdbHelper.js | 194 + .../providers/helpers/customHelper.js | 69 + .../providers/helpers/dropboxHelper.js | 190 + src/services/providers/helpers/giteaHelper.js | 385 + src/services/providers/helpers/giteeHelper.js | 423 + .../providers/helpers/githubHelper.js | 441 + .../providers/helpers/gitlabHelper.js | 347 + .../providers/helpers/googleHelper.js | 701 + src/services/providers/helpers/smmsHelper.js | 76 + .../providers/helpers/wordpressHelper.js | 112 + .../providers/helpers/zendeskHelper.js | 114 + src/services/providers/wordpressProvider.js | 41 + src/services/providers/zendeskProvider.js | 44 + src/services/publishSvc.js | 179 + src/services/syncSvc.js | 1060 + src/services/tempFileSvc.js | 99 + src/services/templateWorker.js | 99 + src/services/timeSvc.js | 113 + src/services/userSvc.js | 91 + src/services/utils.js | 439 + src/services/workspaceSvc.js | 312 + src/store/content.js | 114 + src/store/contentState.js | 22 + src/store/contextMenu.js | 55 + src/store/data.js | 338 + src/store/discussion.js | 187 + src/store/explorer.js | 217 + src/store/file.js | 36 + src/store/findReplace.js | 32 + src/store/folder.js | 6 + src/store/img.js | 89 + src/store/index.js | 195 + src/store/layout.js | 187 + src/store/locationTemplate.js | 86 + src/store/modal.js | 40 + src/store/moduleTemplate.js | 40 + src/store/notification.js | 90 + src/store/queue.js | 83 + src/store/syncedContent.js | 12 + src/store/theme.js | 138 + src/store/userInfo.js | 25 + src/store/workspace.js | 150 + src/styles/app.scss | 435 + src/styles/base.scss | 310 + src/styles/fonts.scss | 41 + src/styles/index.js | 4 + src/styles/markdownHighlighting.scss | 355 + src/styles/prism.scss | 73 + src/styles/variables.scss | 38 + static/landing/abc.png | Bin 0 -> 19878 bytes static/landing/discussion.png | Bin 0 -> 36410 bytes static/landing/favicon.ico | Bin 0 -> 16958 bytes static/landing/gfm.png | Bin 0 -> 16128 bytes static/landing/gistshare.html | 165 + static/landing/index.html | 539 + static/landing/katex.gif | Bin 0 -> 5812 bytes static/landing/logo.svg | 1 + static/landing/mermaid.gif | Bin 0 -> 13545 bytes static/landing/navigation-bar.png | Bin 0 -> 4425 bytes static/landing/privacy_policy.html | 96 + static/landing/providers.png | Bin 0 -> 40371 bytes static/landing/scroll-sync.gif | Bin 0 -> 57425 bytes static/landing/share.html | 177 + static/landing/smart-layout.png | Bin 0 -> 9013 bytes static/landing/syntax-highlighting.gif | Bin 0 -> 19260 bytes static/landing/twemoji.png | Bin 0 -> 12872 bytes static/landing/workspace.png | Bin 0 -> 16056 bytes static/oauth2/callback.html | 9 + static/sitemap.xml | 23 + static/themes/edit-theme-azure.js | 72 + static/themes/edit-theme-carbonight.js | 72 + static/themes/edit-theme-clouds.js | 72 + static/themes/edit-theme-clouds_midnight.js | 72 + static/themes/edit-theme-dawn.js | 72 + static/themes/edit-theme-espresso_libre.js | 72 + static/themes/edit-theme-github.js | 73 + static/themes/edit-theme-iceberg_contrast.js | 72 + static/themes/edit-theme-lavender.js | 72 + static/themes/edit-theme-mintchoc.js | 72 + static/themes/edit-theme-peacock.js | 72 + static/themes/edit-theme-slate.js | 72 + static/themes/edit-theme-solarflare.js | 72 + static/themes/edit-theme-solarized_light.js | 72 + static/themes/edit-theme-spearmint.js | 72 + static/themes/preview-theme-activeblue.js | 216 + static/themes/preview-theme-allblue.js | 426 + static/themes/preview-theme-caoyuangreen.js | 382 + static/themes/preview-theme-jikebrack.js | 273 + static/themes/preview-theme-ningyezi.js | 269 + static/themes/preview-theme-simplebrack.js | 340 + static/themes/preview-theme-yanqihu.js | 305 + test/unit/.eslintrc | 8 + test/unit/jest.conf.js | 33 + test/unit/mocks/cryptoMock.js | 7 + test/unit/mocks/localStorageMock.js | 9 + test/unit/mocks/mutationObserverMock.js | 6 + test/unit/mocks/templateWorkerMock.js | 1 + test/unit/setup.js | 5 + test/unit/specs/components/ButtonBar.spec.js | 47 + .../unit/specs/components/ContextMenu.spec.js | 32 + test/unit/specs/components/Explorer.spec.js | 194 + .../specs/components/ExplorerNode.spec.js | 307 + .../specs/components/NavigationBar.spec.js | 19 + .../specs/components/Notification.spec.js | 38 + test/unit/specs/specUtils.js | 58 + 455 files changed, 67178 insertions(+) create mode 100644 .babelrc create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .postcssrc.js create mode 100644 .stylelintrc create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build/build.js create mode 100644 build/check-versions.js create mode 100644 build/deploy.sh create mode 100644 build/dev-client.js create mode 100644 build/dev-server.js create mode 100644 build/utils.js create mode 100644 build/vue-loader.conf.js create mode 100644 build/webpack.base.conf.js create mode 100644 build/webpack.dev.conf.js create mode 100644 build/webpack.prod.conf.js create mode 100644 build/webpack.style.conf.js create mode 100644 chart/.helmignore create mode 100644 chart/Chart.yaml create mode 100644 chart/templates/NOTES.txt create mode 100644 chart/templates/_helpers.tpl create mode 100644 chart/templates/deployment.yaml create mode 100644 chart/templates/ingress.yaml create mode 100644 chart/templates/service.yaml create mode 100644 chart/templates/tests/test-connection.yaml create mode 100644 chart/values.yaml create mode 100644 chrome-app/icon-128.png create mode 100644 chrome-app/icon-16.png create mode 100644 chrome-app/icon-256.png create mode 100644 chrome-app/icon-32.png create mode 100644 chrome-app/icon-512.png create mode 100644 chrome-app/icon-64.png create mode 100644 chrome-app/manifest.json create mode 100644 config/dev.env.js create mode 100644 config/index.js create mode 100644 config/prod.env.js create mode 100644 gulpfile.js create mode 100644 index.html create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server/conf.js create mode 100644 server/gitea.js create mode 100644 server/gitee.js create mode 100644 server/github.js create mode 100644 server/gitlab.js create mode 100644 server/index.js create mode 100644 server/pandoc.js create mode 100644 server/pdf.js create mode 100644 src/assets/favicon.png create mode 100644 src/assets/fonts/RobotoMono-Bold.woff create mode 100644 src/assets/fonts/RobotoMono-Regular.woff create mode 100644 src/assets/fonts/lato-black-italic.woff create mode 100644 src/assets/fonts/lato-black.woff create mode 100644 src/assets/fonts/lato-normal-italic.woff create mode 100644 src/assets/fonts/lato-normal.woff create mode 100644 src/assets/iconBlogger.svg create mode 100644 src/assets/iconCouchdb.svg create mode 100644 src/assets/iconCustom.svg create mode 100644 src/assets/iconDropbox.svg create mode 100644 src/assets/iconGitea.svg create mode 100644 src/assets/iconGitee.svg create mode 100644 src/assets/iconGithub.svg create mode 100644 src/assets/iconGithubDark.svg create mode 100644 src/assets/iconGitlab.svg create mode 100644 src/assets/iconGoogle.svg create mode 100644 src/assets/iconGoogleDrive.svg create mode 100644 src/assets/iconGooglePhotos.svg create mode 100644 src/assets/iconSmms.svg create mode 100644 src/assets/iconStackedit.svg create mode 100644 src/assets/iconWordpress.svg create mode 100644 src/assets/iconZendesk.svg create mode 100644 src/assets/logo.svg create mode 100644 src/components/App.vue create mode 100644 src/components/ButtonBar.vue create mode 100644 src/components/CodeEditor.vue create mode 100644 src/components/ContextMenu.vue create mode 100644 src/components/Editor.vue create mode 100644 src/components/EditorInPageButtons.vue create mode 100644 src/components/Explorer.vue create mode 100644 src/components/ExplorerNode.vue create mode 100644 src/components/FindReplace.vue create mode 100644 src/components/Layout.vue create mode 100644 src/components/Modal.vue create mode 100644 src/components/NavigationBar.vue create mode 100644 src/components/Notification.vue create mode 100644 src/components/Preview.vue create mode 100644 src/components/PreviewInPageButtons.vue create mode 100644 src/components/SideBar.vue create mode 100644 src/components/SplashScreen.vue create mode 100644 src/components/StatusBar.vue create mode 100644 src/components/Toc.vue create mode 100644 src/components/Tour.vue create mode 100644 src/components/UserImage.vue create mode 100644 src/components/UserName.vue create mode 100644 src/components/common/DropdownMenu.vue create mode 100644 src/components/common/EditorClassApplier.js create mode 100644 src/components/common/PreviewClassApplier.js create mode 100644 src/components/common/vueGlobals.js create mode 100644 src/components/gutters/Comment.vue create mode 100644 src/components/gutters/CommentList.vue create mode 100644 src/components/gutters/CurrentDiscussion.vue create mode 100644 src/components/gutters/EditorNewDiscussionButton.vue create mode 100644 src/components/gutters/NewComment.vue create mode 100644 src/components/gutters/PreviewNewDiscussionButton.vue create mode 100644 src/components/gutters/StickyComment.vue create mode 100644 src/components/menus/EditThemeMenu.vue create mode 100644 src/components/menus/HistoryMenu.vue create mode 100644 src/components/menus/ImportExportMenu.vue create mode 100644 src/components/menus/MainMenu.vue create mode 100644 src/components/menus/PreviewThemeMenu.vue create mode 100644 src/components/menus/PublishMenu.vue create mode 100644 src/components/menus/SyncMenu.vue create mode 100644 src/components/menus/WorkspaceBackupMenu.vue create mode 100644 src/components/menus/WorkspacesMenu.vue create mode 100644 src/components/menus/common/MenuEntry.vue create mode 100644 src/components/menus/common/MenuItem.vue create mode 100644 src/components/modals/AboutModal.vue create mode 100644 src/components/modals/AccountManagementModal.vue create mode 100644 src/components/modals/BadgeManagementModal.vue create mode 100644 src/components/modals/ChatGptModal.vue create mode 100644 src/components/modals/CommitMessageModal.vue create mode 100644 src/components/modals/FilePropertiesModal.vue create mode 100644 src/components/modals/HtmlExportModal.vue create mode 100644 src/components/modals/ImageModal.vue create mode 100644 src/components/modals/LinkModal.vue create mode 100644 src/components/modals/PandocExportModal.vue create mode 100644 src/components/modals/PdfExportModal.vue create mode 100644 src/components/modals/PublishManagementModal.vue create mode 100644 src/components/modals/SettingsModal.vue create mode 100644 src/components/modals/SponsorModal.vue create mode 100644 src/components/modals/SyncManagementModal.vue create mode 100644 src/components/modals/TemplatesModal.vue create mode 100644 src/components/modals/WorkspaceImgPathModal.vue create mode 100644 src/components/modals/WorkspaceManagementModal.vue create mode 100644 src/components/modals/common/FormEntry.vue create mode 100644 src/components/modals/common/ModalInner.vue create mode 100644 src/components/modals/common/Tab.vue create mode 100644 src/components/modals/common/modalTemplate.js create mode 100644 src/components/modals/providers/BloggerPagePublishModal.vue create mode 100644 src/components/modals/providers/BloggerPublishModal.vue create mode 100644 src/components/modals/providers/CouchdbCredentialsModal.vue create mode 100644 src/components/modals/providers/CouchdbWorkspaceModal.vue create mode 100644 src/components/modals/providers/CustomAccountModal.vue create mode 100644 src/components/modals/providers/DropboxAccountModal.vue create mode 100644 src/components/modals/providers/DropboxPublishModal.vue create mode 100644 src/components/modals/providers/DropboxSaveModal.vue create mode 100644 src/components/modals/providers/GistPublishModal.vue create mode 100644 src/components/modals/providers/GistSyncModal.vue create mode 100644 src/components/modals/providers/GiteaAccountModal.vue create mode 100644 src/components/modals/providers/GiteaImgStorageModal.vue create mode 100644 src/components/modals/providers/GiteaOpenModal.vue create mode 100644 src/components/modals/providers/GiteaPublishModal.vue create mode 100644 src/components/modals/providers/GiteaSaveModal.vue create mode 100644 src/components/modals/providers/GiteaWorkspaceModal.vue create mode 100644 src/components/modals/providers/GiteeAccountModal.vue create mode 100644 src/components/modals/providers/GiteeGistPublishModal.vue create mode 100644 src/components/modals/providers/GiteeGistSyncModal.vue create mode 100644 src/components/modals/providers/GiteeOpenModal.vue create mode 100644 src/components/modals/providers/GiteePublishModal.vue create mode 100644 src/components/modals/providers/GiteeSaveModal.vue create mode 100644 src/components/modals/providers/GiteeWorkspaceModal.vue create mode 100644 src/components/modals/providers/GithubAccountModal.vue create mode 100644 src/components/modals/providers/GithubImgStorageModal.vue create mode 100644 src/components/modals/providers/GithubOpenModal.vue create mode 100644 src/components/modals/providers/GithubPublishModal.vue create mode 100644 src/components/modals/providers/GithubSaveModal.vue create mode 100644 src/components/modals/providers/GithubWorkspaceModal.vue create mode 100644 src/components/modals/providers/GitlabAccountModal.vue create mode 100644 src/components/modals/providers/GitlabOpenModal.vue create mode 100644 src/components/modals/providers/GitlabPublishModal.vue create mode 100644 src/components/modals/providers/GitlabSaveModal.vue create mode 100644 src/components/modals/providers/GitlabWorkspaceModal.vue create mode 100644 src/components/modals/providers/GoogleDriveAccountModal.vue create mode 100644 src/components/modals/providers/GoogleDrivePublishModal.vue create mode 100644 src/components/modals/providers/GoogleDriveSaveModal.vue create mode 100644 src/components/modals/providers/GoogleDriveWorkspaceModal.vue create mode 100644 src/components/modals/providers/GooglePhotoModal.vue create mode 100644 src/components/modals/providers/SmmsAccountModal.vue create mode 100644 src/components/modals/providers/WordpressPublishModal.vue create mode 100644 src/components/modals/providers/ZendeskAccountModal.vue create mode 100644 src/components/modals/providers/ZendeskPublishModal.vue create mode 100644 src/data/constants.js create mode 100644 src/data/defaults/defaultLayoutSettings.js create mode 100644 src/data/defaults/defaultLocalSettings.js create mode 100644 src/data/defaults/defaultSettings.yml create mode 100644 src/data/defaults/defaultWorkspaces.js create mode 100644 src/data/empties/emptyContent.js create mode 100644 src/data/empties/emptyContentState.js create mode 100644 src/data/empties/emptyFile.js create mode 100644 src/data/empties/emptyFolder.js create mode 100644 src/data/empties/emptyPublishLocation.js create mode 100644 src/data/empties/emptySyncLocation.js create mode 100644 src/data/empties/emptySyncedContent.js create mode 100644 src/data/empties/emptyTemplateHelpers.js create mode 100644 src/data/empties/emptyTemplateValue.html create mode 100644 src/data/faq.md create mode 100644 src/data/features.js create mode 100644 src/data/markdownSample.md create mode 100644 src/data/pagedownButtons.js create mode 100644 src/data/presets.js create mode 100644 src/data/simpleModals.js create mode 100644 src/data/templates/jekyllSiteTemplate.html create mode 100644 src/data/templates/plainHtmlTemplate.html create mode 100644 src/data/templates/styledHtmlTemplate.html create mode 100644 src/data/templates/styledHtmlWithThemeAndTocTemplate.html create mode 100644 src/data/templates/styledHtmlWithThemeTemplate.html create mode 100644 src/data/templates/styledHtmlWithTocTemplate.html create mode 100644 src/data/welcomeFile.md create mode 100644 src/extensions/abcExtension.js create mode 100644 src/extensions/emojiExtension.js create mode 100644 src/extensions/index.js create mode 100644 src/extensions/katexExtension.js create mode 100644 src/extensions/libs/markdownItAnchor.js create mode 100644 src/extensions/libs/markdownItMath.js create mode 100644 src/extensions/libs/markdownItTasklist.js create mode 100644 src/extensions/markdownExtension.js create mode 100644 src/extensions/mermaidExtension.js create mode 100644 src/icons/Alert.vue create mode 100644 src/icons/ArrowLeft.vue create mode 100644 src/icons/ChatGpt.vue create mode 100644 src/icons/CheckCircle.vue create mode 100644 src/icons/CheckCircleUn.vue create mode 100644 src/icons/Close.vue create mode 100644 src/icons/CodeBraces.vue create mode 100644 src/icons/CodeTags.vue create mode 100644 src/icons/ContentCopy.vue create mode 100644 src/icons/ContentSave.vue create mode 100644 src/icons/Copy.vue create mode 100644 src/icons/Database.vue create mode 100644 src/icons/Delete.vue create mode 100644 src/icons/DotsHorizontal.vue create mode 100644 src/icons/Download.vue create mode 100644 src/icons/Ellipsis.vue create mode 100644 src/icons/Eye.vue create mode 100644 src/icons/FileImage.vue create mode 100644 src/icons/FileMultiple.vue create mode 100644 src/icons/FilePlus.vue create mode 100644 src/icons/FileSearch.vue create mode 100644 src/icons/FindReplace.vue create mode 100644 src/icons/Folder.vue create mode 100644 src/icons/FolderMultiple.vue create mode 100644 src/icons/FolderPlus.vue create mode 100644 src/icons/FormatBold.vue create mode 100644 src/icons/FormatItalic.vue create mode 100644 src/icons/FormatListBulleted.vue create mode 100644 src/icons/FormatListChecks.vue create mode 100644 src/icons/FormatListNumbers.vue create mode 100644 src/icons/FormatQuoteClose.vue create mode 100644 src/icons/FormatSize.vue create mode 100644 src/icons/FormatStrikethrough.vue create mode 100644 src/icons/HelpCircle.vue create mode 100644 src/icons/History.vue create mode 100644 src/icons/Information.vue create mode 100644 src/icons/Key.vue create mode 100644 src/icons/LinkVariant.vue create mode 100644 src/icons/Login.vue create mode 100644 src/icons/Logout.vue create mode 100644 src/icons/Magnify.vue create mode 100644 src/icons/Menu.vue create mode 100644 src/icons/Message.vue create mode 100644 src/icons/NavigationBar.vue create mode 100644 src/icons/OpenInNew.vue create mode 100644 src/icons/Pen.vue create mode 100644 src/icons/Printer.vue create mode 100644 src/icons/Provider.vue create mode 100644 src/icons/Redo.vue create mode 100644 src/icons/ScrollSync.vue create mode 100644 src/icons/Seal.vue create mode 100644 src/icons/Search.vue create mode 100644 src/icons/SelectTheme.vue create mode 100644 src/icons/Settings.vue create mode 100644 src/icons/Share.vue create mode 100644 src/icons/SidePreview.vue create mode 100644 src/icons/SignalOff.vue create mode 100644 src/icons/StatusBar.vue create mode 100644 src/icons/SwitchTheme.vue create mode 100644 src/icons/Sync.vue create mode 100644 src/icons/SyncAuto.vue create mode 100644 src/icons/SyncOff.vue create mode 100644 src/icons/SyncStop.vue create mode 100644 src/icons/Table.vue create mode 100644 src/icons/Target.vue create mode 100644 src/icons/Toc.vue create mode 100644 src/icons/Undo.vue create mode 100644 src/icons/Upload.vue create mode 100644 src/icons/ViewList.vue create mode 100644 src/icons/index.js create mode 100644 src/index.js create mode 100644 src/libs/clunderscore.js create mode 100644 src/libs/htmlSanitizer.js create mode 100644 src/libs/pagedown.js create mode 100644 src/services/animationSvc.js create mode 100644 src/services/backupSvc.js create mode 100644 src/services/badgeSvc.js create mode 100644 src/services/chatGptSvc.js create mode 100644 src/services/diffUtils.js create mode 100644 src/services/editor/cledit/cleditCore.js create mode 100644 src/services/editor/cledit/cleditHighlighter.js create mode 100644 src/services/editor/cledit/cleditKeystroke.js create mode 100644 src/services/editor/cledit/cleditMarker.js create mode 100644 src/services/editor/cledit/cleditSelectionMgr.js create mode 100644 src/services/editor/cledit/cleditUndoMgr.js create mode 100644 src/services/editor/cledit/cleditUtils.js create mode 100644 src/services/editor/cledit/cleditWatcher.js create mode 100644 src/services/editor/cledit/index.js create mode 100644 src/services/editor/editorSvcDiscussions.js create mode 100644 src/services/editor/editorSvcUtils.js create mode 100644 src/services/editor/sectionUtils.js create mode 100644 src/services/editorSvc.js create mode 100644 src/services/explorerSvc.js create mode 100644 src/services/exportSvc.js create mode 100644 src/services/extensionSvc.js create mode 100644 src/services/gitWorkspaceSvc.js create mode 100644 src/services/imageSvc.js create mode 100644 src/services/localDbSvc.js create mode 100644 src/services/markdownConversionSvc.js create mode 100644 src/services/markdownGrammarSvc.js create mode 100644 src/services/networkSvc.js create mode 100644 src/services/optional/index.js create mode 100644 src/services/optional/keystrokes.js create mode 100644 src/services/optional/scrollSync.js create mode 100644 src/services/optional/shortcuts.js create mode 100644 src/services/optional/taskChange.js create mode 100644 src/services/providers/bloggerPageProvider.js create mode 100644 src/services/providers/bloggerProvider.js create mode 100644 src/services/providers/common/Provider.js create mode 100644 src/services/providers/common/providerRegistry.js create mode 100644 src/services/providers/couchdbWorkspaceProvider.js create mode 100644 src/services/providers/dropboxProvider.js create mode 100644 src/services/providers/gistProvider.js create mode 100644 src/services/providers/giteaProvider.js create mode 100644 src/services/providers/giteaWorkspaceProvider.js create mode 100644 src/services/providers/giteeAppDataProvider.js create mode 100644 src/services/providers/giteeGistProvider.js create mode 100644 src/services/providers/giteeProvider.js create mode 100644 src/services/providers/giteeWorkspaceProvider.js create mode 100644 src/services/providers/githubAppDataProvider.js create mode 100644 src/services/providers/githubProvider.js create mode 100644 src/services/providers/githubWorkspaceProvider.js create mode 100644 src/services/providers/gitlabProvider.js create mode 100644 src/services/providers/gitlabWorkspaceProvider.js create mode 100644 src/services/providers/googleDriveAppDataProvider.js create mode 100644 src/services/providers/googleDriveProvider.js create mode 100644 src/services/providers/googleDriveWorkspaceProvider.js create mode 100644 src/services/providers/helpers/couchdbHelper.js create mode 100644 src/services/providers/helpers/customHelper.js create mode 100644 src/services/providers/helpers/dropboxHelper.js create mode 100644 src/services/providers/helpers/giteaHelper.js create mode 100644 src/services/providers/helpers/giteeHelper.js create mode 100644 src/services/providers/helpers/githubHelper.js create mode 100644 src/services/providers/helpers/gitlabHelper.js create mode 100644 src/services/providers/helpers/googleHelper.js create mode 100644 src/services/providers/helpers/smmsHelper.js create mode 100644 src/services/providers/helpers/wordpressHelper.js create mode 100644 src/services/providers/helpers/zendeskHelper.js create mode 100644 src/services/providers/wordpressProvider.js create mode 100644 src/services/providers/zendeskProvider.js create mode 100644 src/services/publishSvc.js create mode 100644 src/services/syncSvc.js create mode 100644 src/services/tempFileSvc.js create mode 100644 src/services/templateWorker.js create mode 100644 src/services/timeSvc.js create mode 100644 src/services/userSvc.js create mode 100644 src/services/utils.js create mode 100644 src/services/workspaceSvc.js create mode 100644 src/store/content.js create mode 100644 src/store/contentState.js create mode 100644 src/store/contextMenu.js create mode 100644 src/store/data.js create mode 100644 src/store/discussion.js create mode 100644 src/store/explorer.js create mode 100644 src/store/file.js create mode 100644 src/store/findReplace.js create mode 100644 src/store/folder.js create mode 100644 src/store/img.js create mode 100644 src/store/index.js create mode 100644 src/store/layout.js create mode 100644 src/store/locationTemplate.js create mode 100644 src/store/modal.js create mode 100644 src/store/moduleTemplate.js create mode 100644 src/store/notification.js create mode 100644 src/store/queue.js create mode 100644 src/store/syncedContent.js create mode 100644 src/store/theme.js create mode 100644 src/store/userInfo.js create mode 100644 src/store/workspace.js create mode 100644 src/styles/app.scss create mode 100644 src/styles/base.scss create mode 100644 src/styles/fonts.scss create mode 100644 src/styles/index.js create mode 100644 src/styles/markdownHighlighting.scss create mode 100644 src/styles/prism.scss create mode 100644 src/styles/variables.scss create mode 100644 static/landing/abc.png create mode 100644 static/landing/discussion.png create mode 100644 static/landing/favicon.ico create mode 100644 static/landing/gfm.png create mode 100644 static/landing/gistshare.html create mode 100644 static/landing/index.html create mode 100644 static/landing/katex.gif create mode 100644 static/landing/logo.svg create mode 100644 static/landing/mermaid.gif create mode 100644 static/landing/navigation-bar.png create mode 100644 static/landing/privacy_policy.html create mode 100644 static/landing/providers.png create mode 100644 static/landing/scroll-sync.gif create mode 100644 static/landing/share.html create mode 100644 static/landing/smart-layout.png create mode 100644 static/landing/syntax-highlighting.gif create mode 100644 static/landing/twemoji.png create mode 100644 static/landing/workspace.png create mode 100644 static/oauth2/callback.html create mode 100644 static/sitemap.xml create mode 100644 static/themes/edit-theme-azure.js create mode 100644 static/themes/edit-theme-carbonight.js create mode 100644 static/themes/edit-theme-clouds.js create mode 100644 static/themes/edit-theme-clouds_midnight.js create mode 100644 static/themes/edit-theme-dawn.js create mode 100644 static/themes/edit-theme-espresso_libre.js create mode 100644 static/themes/edit-theme-github.js create mode 100644 static/themes/edit-theme-iceberg_contrast.js create mode 100644 static/themes/edit-theme-lavender.js create mode 100644 static/themes/edit-theme-mintchoc.js create mode 100644 static/themes/edit-theme-peacock.js create mode 100644 static/themes/edit-theme-slate.js create mode 100644 static/themes/edit-theme-solarflare.js create mode 100644 static/themes/edit-theme-solarized_light.js create mode 100644 static/themes/edit-theme-spearmint.js create mode 100644 static/themes/preview-theme-activeblue.js create mode 100644 static/themes/preview-theme-allblue.js create mode 100644 static/themes/preview-theme-caoyuangreen.js create mode 100644 static/themes/preview-theme-jikebrack.js create mode 100644 static/themes/preview-theme-ningyezi.js create mode 100644 static/themes/preview-theme-simplebrack.js create mode 100644 static/themes/preview-theme-yanqihu.js create mode 100644 test/unit/.eslintrc create mode 100644 test/unit/jest.conf.js create mode 100644 test/unit/mocks/cryptoMock.js create mode 100644 test/unit/mocks/localStorageMock.js create mode 100644 test/unit/mocks/mutationObserverMock.js create mode 100644 test/unit/mocks/templateWorkerMock.js create mode 100644 test/unit/setup.js create mode 100644 test/unit/specs/components/ButtonBar.spec.js create mode 100644 test/unit/specs/components/ContextMenu.spec.js create mode 100644 test/unit/specs/components/Explorer.spec.js create mode 100644 test/unit/specs/components/ExplorerNode.spec.js create mode 100644 test/unit/specs/components/NavigationBar.spec.js create mode 100644 test/unit/specs/components/Notification.spec.js create mode 100644 test/unit/specs/specUtils.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..1d93173 --- /dev/null +++ b/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + ["env", { "modules": false }], + "stage-2" + ], + "plugins": ["transform-runtime"], + "comments": false, + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"] + } + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df87c63 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +.git +dist +.history +images +docs +Dockerfile +README.md +build.sh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9907604 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +build/*.js +config/*.js +src/libs/*.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..3c6c4ba --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,44 @@ +// http://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + }, + extends: 'airbnb-base', + // required to lint *.vue files + plugins: [ + 'html' + ], + globals: { + "NODE_ENV": false, + "VERSION": false + }, + // check if imports actually resolve + 'settings': { + 'import/resolver': { + 'webpack': { + 'config': 'build/webpack.base.conf.js' + } + } + }, + // add your custom rules here + 'rules': { + 'no-param-reassign': [2, { 'props': false }], + // don't require .vue extension when importing + 'import/extensions': ['error', 'always', { + 'js': 'never', + 'vue': 'never' + }], + // allow optionalDependencies + 'import/no-extraneous-dependencies': ['error', { + 'optionalDependencies': ['test/unit/index.js'] + }], + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cc4299c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules/ +dist/ +.history +.idea +npm-debug.log* +.vscode +stackedit_v4 +chrome-app/*.zip +/test/unit/coverage/ diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..ea9a5ab --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + // to edit target browsers: use "browserlist" field in package.json + "autoprefixer": {} + } +} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..e9549f8 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,7 @@ +{ + "processors": ["stylelint-processor-html"], + "extends": "stylelint-config-standard", + "rules": { + "no-empty-source": null + } +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1d541e6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +language: node_js + +node_js: + - "12" + +services: + - docker + +before_deploy: + # Run docker build + - docker build -t benweet/stackedit . + # Install Helm + - curl -SL -o /tmp/get_helm.sh https://git.io/get_helm.sh + - chmod 700 /tmp/get_helm.sh + - /tmp/get_helm.sh + - helm init --client-only + +deploy: + provider: script + script: bash build/deploy.sh + on: + tags: true diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/build/build.js b/build/build.js new file mode 100644 index 0000000..6b8add1 --- /dev/null +++ b/build/build.js @@ -0,0 +1,35 @@ +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +var ora = require('ora') +var rm = require('rimraf') +var path = require('path') +var chalk = require('chalk') +var webpack = require('webpack') +var config = require('../config') +var webpackConfig = require('./webpack.prod.conf') + +var spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, function (err, stats) { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, + chunks: false, + chunkModules: false + }) + '\n\n') + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/build/check-versions.js b/build/check-versions.js new file mode 100644 index 0000000..100f3a0 --- /dev/null +++ b/build/check-versions.js @@ -0,0 +1,48 @@ +var chalk = require('chalk') +var semver = require('semver') +var packageConfig = require('../package.json') +var shell = require('shelljs') +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +var versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + }, +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + var warnings = [] + for (var i = 0; i < versionRequirements.length; i++) { + var mod = versionRequirements[i] + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + for (var i = 0; i < warnings.length; i++) { + var warning = warnings[i] + console.log(' ' + warning) + } + console.log() + process.exit(1) + } +} diff --git a/build/deploy.sh b/build/deploy.sh new file mode 100644 index 0000000..931f81a --- /dev/null +++ b/build/deploy.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -e + +# Tag and push docker image +docker login -u benweet -p "$DOCKER_PASSWORD" +docker tag benweet/stackedit "benweet/stackedit:$TRAVIS_TAG" +docker push benweet/stackedit:$TRAVIS_TAG +docker tag benweet/stackedit:$TRAVIS_TAG benweet/stackedit:latest +docker push benweet/stackedit:latest + +# Build the chart +cd "$TRAVIS_BUILD_DIR" +npm run chart + +# Add chart to helm repository +git clone --branch master "https://benweet:$GITHUB_TOKEN@github.com/benweet/stackedit-charts.git" /tmp/charts +cd /tmp/charts +helm package "$TRAVIS_BUILD_DIR/dist/stackedit" +helm repo index --url https://benweet.github.io/stackedit-charts/ . +git config user.name "Benoit Schweblin" +git config user.email "benoit.schweblin@gmail.com" +git add . +git commit -m "Added $TRAVIS_TAG" +git push origin master diff --git a/build/dev-client.js b/build/dev-client.js new file mode 100644 index 0000000..18aa1e2 --- /dev/null +++ b/build/dev-client.js @@ -0,0 +1,9 @@ +/* eslint-disable */ +require('eventsource-polyfill') +var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') + +hotClient.subscribe(function (event) { + if (event.action === 'reload') { + window.location.reload() + } +}) diff --git a/build/dev-server.js b/build/dev-server.js new file mode 100644 index 0000000..a517b6c --- /dev/null +++ b/build/dev-server.js @@ -0,0 +1,94 @@ +require('./check-versions')() + +var config = require('../config') +Object.keys(config.dev.env).forEach((key) => { + if (!process.env[key]) { + process.env[key] = JSON.parse(config.dev.env[key]); + } +}); + +var opn = require('opn') +var path = require('path') +var express = require('express') +var webpack = require('webpack') +var proxyMiddleware = require('http-proxy-middleware') +var webpackConfig = require('./webpack.dev.conf') + +// default port where dev server listens for incoming traffic +var port = process.env.PORT || config.dev.port +// automatically open browser, if not set will be false +var autoOpenBrowser = !!config.dev.autoOpenBrowser +// Define HTTP proxies to your custom API backend +// https://github.com/chimurai/http-proxy-middleware +var proxyTable = config.dev.proxyTable + +var app = express() +var compiler = webpack(webpackConfig) + +// StackEdit custom middlewares +require('../server')(app); + +var devMiddleware = require('webpack-dev-middleware')(compiler, { + publicPath: webpackConfig.output.publicPath, + quiet: true +}) + +var hotMiddleware = require('webpack-hot-middleware')(compiler, { + log: () => {} +}) +// force page reload when html-webpack-plugin template changes +compiler.plugin('compilation', function (compilation) { + compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { + hotMiddleware.publish({ action: 'reload' }) + cb() + }) +}) + +// proxy api requests +Object.keys(proxyTable).forEach(function (context) { + var options = proxyTable[context] + if (typeof options === 'string') { + options = { target: options } + } + app.use(proxyMiddleware(options.filter || context, options)) +}) + +// handle fallback for HTML5 history API +app.use(require('connect-history-api-fallback')()) + +// serve webpack bundle output +app.use(devMiddleware) + +// enable hot-reload and state-preserving +// compilation error display +app.use(hotMiddleware) + +// serve pure static assets +var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) +app.use(staticPath, express.static('./static')) + +var uri = 'http://localhost:' + port + +var _resolve +var readyPromise = new Promise(resolve => { + _resolve = resolve +}) + +console.log('> Starting dev server...') +devMiddleware.waitUntilValid(() => { + console.log('> Listening at ' + uri + '\n') + // when env is testing, don't need open it + if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { + opn(uri) + } + _resolve() +}) + +var server = app.listen(port) + +module.exports = { + ready: readyPromise, + close: () => { + server.close() + } +} diff --git a/build/utils.js b/build/utils.js new file mode 100644 index 0000000..b1d54b4 --- /dev/null +++ b/build/utils.js @@ -0,0 +1,71 @@ +var path = require('path') +var config = require('../config') +var ExtractTextPlugin = require('extract-text-webpack-plugin') + +exports.assetsPath = function (_path) { + var assetsSubDirectory = process.env.NODE_ENV === 'production' + ? config.build.assetsSubDirectory + : config.dev.assetsSubDirectory + return path.posix.join(assetsSubDirectory, _path) +} + +exports.cssLoaders = function (options) { + options = options || {} + + var cssLoader = { + loader: 'css-loader', + options: { + minimize: process.env.NODE_ENV === 'production', + sourceMap: options.sourceMap + } + } + + // generate loader string to be used with extract text plugin + function generateLoaders (loader, loaderOptions) { + var loaders = [cssLoader] + if (loader) { + loaders.push({ + loader: loader + '-loader', + options: Object.assign({}, loaderOptions, { + sourceMap: options.sourceMap + }) + }) + } + + // Extract CSS when that option is specified + // (which is the case during production build) + if (options.extract) { + return ExtractTextPlugin.extract({ + use: loaders, + fallback: 'vue-style-loader' + }) + } else { + return ['vue-style-loader'].concat(loaders) + } + } + + // https://vue-loader.vuejs.org/en/configurations/extract-css.html + return { + css: generateLoaders(), + postcss: generateLoaders(), + less: generateLoaders('less'), + sass: generateLoaders('sass', { indentedSyntax: true }), + scss: generateLoaders('sass'), + stylus: generateLoaders('stylus'), + styl: generateLoaders('stylus') + } +} + +// Generate loaders for standalone style files (outside of .vue) +exports.styleLoaders = function (options) { + var output = [] + var loaders = exports.cssLoaders(options) + for (var extension in loaders) { + var loader = loaders[extension] + output.push({ + test: new RegExp('\\.' + extension + '$'), + use: loader + }) + } + return output +} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js new file mode 100644 index 0000000..7aee79b --- /dev/null +++ b/build/vue-loader.conf.js @@ -0,0 +1,12 @@ +var utils = require('./utils') +var config = require('../config') +var isProduction = process.env.NODE_ENV === 'production' + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap, + extract: isProduction + }) +} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js new file mode 100644 index 0000000..f0f27e4 --- /dev/null +++ b/build/webpack.base.conf.js @@ -0,0 +1,109 @@ +var path = require('path') +var webpack = require('webpack') +var utils = require('./utils') +var config = require('../config') +var VueLoaderPlugin = require('vue-loader/lib/plugin') +var vueLoaderConfig = require('./vue-loader.conf') +var StylelintPlugin = require('stylelint-webpack-plugin') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +module.exports = { + entry: { + app: './src/' + }, + node: { + // For mermaid + fs: 'empty' // jison generated code requires 'fs' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + '@': resolve('src') + } + }, + module: { + rules: [ + { + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter') + } + }, + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + // We can't pass graphlibrary to babel + { + test: /\.js$/, + loader: 'string-replace-loader', + include: [ + resolve('node_modules/graphlibrary') + ], + options: { + search: '^\\s*(?:let|const) ', + replace: 'var ', + flags: 'gm' + } + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [ + resolve('src'), + resolve('test'), + resolve('node_modules/mermaid') + ], + exclude: [ + resolve('node_modules/mermaid/src/diagrams/class/parser'), + resolve('node_modules/mermaid/src/diagrams/flowchart/parser'), + resolve('node_modules/mermaid/src/diagrams/gantt/parser'), + resolve('node_modules/mermaid/src/diagrams/git/parser'), + resolve('node_modules/mermaid/src/diagrams/sequence/parser') + ], + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(ttf|eot|otf|woff2?)(\?.*)?$/, + loader: 'file-loader', + options: { + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + }, + { + test: /\.(md|yml|html)$/, + loader: 'raw-loader' + } + ] + }, + plugins: [ + new VueLoaderPlugin(), + new StylelintPlugin({ + files: ['**/*.vue', '**/*.scss'] + }), + new webpack.DefinePlugin({ + VERSION: JSON.stringify(require('../package.json').version) + }) + ] +} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js new file mode 100644 index 0000000..6ec2eef --- /dev/null +++ b/build/webpack.dev.conf.js @@ -0,0 +1,35 @@ +var utils = require('./utils') +var webpack = require('webpack') +var config = require('../config') +var merge = require('webpack-merge') +var baseWebpackConfig = require('./webpack.base.conf') +var HtmlWebpackPlugin = require('html-webpack-plugin') +var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') + +// add hot-reload related code to entry chunks +Object.keys(baseWebpackConfig.entry).forEach(function (name) { + baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) +}) + +module.exports = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) + }, + // cheap-module-eval-source-map is faster for development + devtool: 'source-map', + plugins: [ + new webpack.DefinePlugin({ + NODE_ENV: config.dev.env.NODE_ENV + }), + // https://github.com/glenjamin/webpack-hot-middleware#installation--usage + new webpack.HotModuleReplacementPlugin(), + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + new FriendlyErrorsPlugin() + ] +}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js new file mode 100644 index 0000000..94da9d8 --- /dev/null +++ b/build/webpack.prod.conf.js @@ -0,0 +1,154 @@ +var path = require('path') +var utils = require('./utils') +var webpack = require('webpack') +var config = require('../config') +var merge = require('webpack-merge') +var baseWebpackConfig = require('./webpack.base.conf') +var CopyWebpackPlugin = require('copy-webpack-plugin') +var HtmlWebpackPlugin = require('html-webpack-plugin') +var ExtractTextPlugin = require('extract-text-webpack-plugin') +var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') +var OfflinePlugin = require('offline-plugin'); +var WebpackPwaManifest = require('webpack-pwa-manifest') +var FaviconsWebpackPlugin = require('favicons-webpack-plugin') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +var env = config.build.env + +var webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true + }) + }, + devtool: config.build.productionSourceMap ? '#source-map' : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + NODE_ENV: env.NODE_ENV, + GOOGLE_CLIENT_ID: env.GOOGLE_CLIENT_ID, + GITHUB_CLIENT_ID: env.GITHUB_CLIENT_ID + }), + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + }, + sourceMap: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css') + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: { + safe: true + } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks: function (module, count) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + chunks: ['vendor'] + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]), + new FaviconsWebpackPlugin({ + logo: resolve('src/assets/favicon.png'), + title: 'StackEdit', + }), + new WebpackPwaManifest({ + name: 'StackEdit', + description: 'Full-featured, open-source Markdown editor', + display: 'standalone', + orientation: 'any', + start_url: 'app', + background_color: '#ffffff', + crossorigin: 'use-credentials', + icons: [{ + src: resolve('src/assets/favicon.png'), + sizes: [96, 128, 192, 256, 384, 512] + }] + }), + new OfflinePlugin({ + ServiceWorker: { + events: true + }, + AppCache: true, + excludes: ['**/.*', '**/*.map', '**/index.html', '**/static/oauth2/callback.html', '**/icons-*/*.png', '**/static/fonts/KaTeX_*'], + externals: ['/', '/app', '/oauth2/callback'] + }), + ] +}) + +if (config.build.productionGzip) { + var CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/build/webpack.style.conf.js b/build/webpack.style.conf.js new file mode 100644 index 0000000..4f69e8a --- /dev/null +++ b/build/webpack.style.conf.js @@ -0,0 +1,56 @@ +var path = require('path') +var utils = require('./utils') +var webpack = require('webpack') +var utils = require('./utils') +var config = require('../config') +var vueLoaderConfig = require('./vue-loader.conf') +var StylelintPlugin = require('stylelint-webpack-plugin') +var ExtractTextPlugin = require('extract-text-webpack-plugin') +var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +module.exports = { + entry: { + style: './src/styles/' + }, + module: { + rules: [{ + test: /\.(ttf|eot|otf|woff2?)(\?.*)?$/, + loader: 'file-loader', + options: { + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + }] + .concat(utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true + })), + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: config.build.assetsPublicPath + }, + plugins: [ + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + }, + sourceMap: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: '[name].css', + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: { + safe: true + } + }), + ] +} diff --git a/chart/.helmignore b/chart/.helmignore new file mode 100644 index 0000000..50af031 --- /dev/null +++ b/chart/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/chart/Chart.yaml b/chart/Chart.yaml new file mode 100644 index 0000000..47e9e25 --- /dev/null +++ b/chart/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: vSTACKEDIT_VERSION +description: In-browser Markdown editor +name: stackedit +version: STACKEDIT_VERSION diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt new file mode 100644 index 0000000..afce052 --- /dev/null +++ b/chart/templates/NOTES.txt @@ -0,0 +1,21 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "stackedit.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "stackedit.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "stackedit.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "stackedit.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl port-forward $POD_NAME 8080:80 +{{- end }} diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl new file mode 100644 index 0000000..dd36306 --- /dev/null +++ b/chart/templates/_helpers.tpl @@ -0,0 +1,45 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "stackedit.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "stackedit.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "stackedit.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "stackedit.labels" -}} +app.kubernetes.io/name: {{ include "stackedit.name" . }} +helm.sh/chart: {{ include "stackedit.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml new file mode 100644 index 0000000..530040c --- /dev/null +++ b/chart/templates/deployment.yaml @@ -0,0 +1,87 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "stackedit.fullname" . }} + labels: +{{ include "stackedit.labels" . | indent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "stackedit.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "stackedit.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + volumeMounts: + - mountPath: /run + name: run-volume + - mountPath: /tmp + name: tmp-volume + env: + - name: PORT + value: "80" + - name: PAYPAL_RECEIVER_EMAIL + value: {{ .Values.paypalReceiverEmail }} + - name: AWS_ACCESS_KEY_ID + value: {{ .Values.awsAccessKeyId }} + - name: AWS_SECRET_ACCESS_KEY + value: {{ .Values.awsSecretAccessKey }} + - name: DROPBOX_APP_KEY + value: {{ .Values.dropboxAppKey }} + - name: DROPBOX_APP_KEY_FULL + value: {{ .Values.dropboxAppKeyFull }} + - name: GOOGLE_CLIENT_ID + value: {{ .Values.googleClientId }} + - name: GOOGLE_API_KEY + value: {{ .Values.googleApiKey }} + - name: GITHUB_CLIENT_ID + value: {{ .Values.githubClientId }} + - name: GITHUB_CLIENT_SECRET + value: {{ .Values.githubClientSecret }} + - name: WORDPRESS_CLIENT_ID + value: {{ .Values.wordpressClientId }} + - name: WORDPRESS_SECRET + value: {{ .Values.wordpressSecret }} + ports: + - name: http + containerPort: 80 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumes: + - name: run-volume + emptyDir: {} + - name: tmp-volume + emptyDir: {} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/chart/templates/ingress.yaml b/chart/templates/ingress.yaml new file mode 100644 index 0000000..d079953 --- /dev/null +++ b/chart/templates/ingress.yaml @@ -0,0 +1,39 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "stackedit.fullname" . -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $fullName }} + labels: +{{ include "stackedit.labels" . | indent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ . }} + pathType: Prefix + backend: + service: + name: {{ $fullName }} + port: + name: http + {{- end }} + {{- end }} +{{- end }} diff --git a/chart/templates/service.yaml b/chart/templates/service.yaml new file mode 100644 index 0000000..378f8a8 --- /dev/null +++ b/chart/templates/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "stackedit.fullname" . }} + labels: +{{ include "stackedit.labels" . | indent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "stackedit.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/chart/templates/tests/test-connection.yaml b/chart/templates/tests/test-connection.yaml new file mode 100644 index 0000000..ad2900c --- /dev/null +++ b/chart/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "stackedit.fullname" . }}-test-connection" + labels: +{{ include "stackedit.labels" . | indent 4 }} + annotations: + "helm.sh/hook": test-success +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "stackedit.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/chart/values.yaml b/chart/values.yaml new file mode 100644 index 0000000..414aaa2 --- /dev/null +++ b/chart/values.yaml @@ -0,0 +1,71 @@ +# Default values for stackedit. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +dropboxAppKey: "" +dropboxAppKeyFull: "" +googleClientId: "" +googleApiKey: "" +githubClientId: "" +githubClientSecret: "" +giteeClientId: "" +giteeClientSecret: "" +wordpressClientId: "" +wordpressSecret: "" +paypalReceiverEmail: "" +awsAccessKeyId: "" +awsSecretAccessKey: "" +giteaClientId: "" +giteaClientSecret: "" +giteaUrl: "" +gitlabClientId: "" +gitlabUrl: "" + +replicaCount: 1 + +image: + repository: benweet/stackedit + tag: vSTACKEDIT_VERSION + pullPolicy: IfNotPresent + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + annotations: + # kubernetes.io/ingress.class: nginx + # certmanager.k8s.io/issuer: letsencrypt-prod + # certmanager.k8s.io/acme-challenge-type: http01 + hosts: [] + # - host: stackedit.example.com + # paths: + # - / + + tls: [] + # - secretName: stackedit-tls + # hosts: + # - stackedit.example.com + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/chrome-app/icon-128.png b/chrome-app/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..498cb9226ff11dcb230e9d09dafb0c8ebae85b81 GIT binary patch literal 3888 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 aPm}p@cs7y literal 0 HcmV?d00001 diff --git a/chrome-app/icon-32.png b/chrome-app/icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..1c719cb801ee3f4271150d31d078af8f297c3f0f GIT binary patch literal 960 zcmV;x13&zUP)Px&dPzhmD>4 zdf5vH51Z_z-g?-J<)DYXXuOF=6Wgvy4;qstmNpBz7rMHMu-kNKZQ3#v%Xq+fVPM;B zff^6~Pv8H&nfL#{H{bU%pF|7vUx)(l0#itgwa#}0oi$(uolm7O`Q|C9nQZ4+wMvZJ z<(|m4L9O}Gj-1(%@w?GB18Z5z12QhV3=SFWPY1v@3D!V&sz*Dp_Z8}aj#>+_b?9fa z_Co2+*RFeofp71yI@H(LxkH9$eK)bWuXQKff?f4H?%n^IP3f?wIN;$piA}3GB63SR|ofCyzQms<>j6k0C>?mf?5-KH7Pfj zn%gj!)rBZl29^&yvex%cBN~IEsL;^)o&d-3?>lLx0D1<^G5d(ssn}K4nNTpH% zK+`k|g@T9y3WWlSqL_?!g8!57*iT^WESXH2c50l={QP`R4E%Rbz`*qMG($r}g2!U9 zo>jo949v{Tn0PD}qgX78sxV+wgfV^`KeK_yA)QXQRfv%%sZ)Hu42wD z2Q*D1m&-lzxsFbt8Hq#!;IY^8zhdB|gglJ_(4UKe|B$8PB!Ki*EWsSmSd@uOM;sC}0v8jZ zfTIcy#~8NZDd->UT72jJ9Ug7(Q?>?#_=Be=vNzryjf&Rn?iZA8Ra}M%d$ns_6I5#e z^&jzvmghI#djEO|TAI_Hk6G>et8o(N0o58nlkM4&Yx(x()PVjGQLJ1>X9|hYo+#_A iBe6oAPoxjc?fKu=c}rFaEyQ>L0000C$b%@T$Ri*{l%k*_T|x#tsBUe8R5SJqd3^kw5u;j5Ivcy`Gc@%k*>UvK04oJKBQd2|s1 z8Fym5@PbeA8t;qSe7u?k!@>T>>B|&-WqA&!B@GE zij@<$bM7SAd>sAw$osQ0al-wd;$i&OJ<&_Zv-Z+%#r77($sc>4ek%Q_ZXx7SksH_b z8=`pEuX{~jCdf!7cJ*(0kErW5^x+rz0Pd>Pk^E$x#L=Pz9h7hBp%q|+4l^%{-%I9{ zFOK7u)U3wgGhaqUrS;mb~D)!?8`0de#B~b%OgW;7> zYn8_s2O0p)_Q5x)G^_wRZT}BG69+NAaS3_7GF8&}RSVQ*{=1v2m2`doxpKtQz3$X#4Y_x@q_5cd=q3lpFY4qNGghIR5K#+mndKW~MG( zHJ}pgVqSTiooo0_I}pem@>OpXl=sl_1(yzcb#}p-qW<_^A`*|cL#Je!JfR=gVq56qnN$kS#2#!(PY^lP1=}< zR`;|O<>gy$hQR$PzW%W?kxJF4$!q!H%A1q7KBz9;Yq&hQUn-&|Yy8cZrxDy1m?xK2dcgtlB=M4Mop z^OVT;@dyqAXmr$UM@-k`2$BvRGky>DSBI`I5G-;a{u9{{+2x~9JX6aAe)o1#v4|C^ zZsli|!Zb@flWy6FY7Jo(lv-KXc#$CF^yykf%h(>F4Bm)!wX7iCiq&n(EpDX!xtnIP zzyEYM&Nm<^PoX%wfCT_pOFp35YO<=^WY_#HCmQWH-25<>JJe={1B2q;m&EqIlzf|M zX+ADziJj3_Eff?)T4=RcN*4FPNLmNGDOo%BTW%YS!fA`kX`gSIx4?!P(&( zEoNjHoU%X_O`#C^U19z~mb#8JEV8(}CkeQDeRpHSLW`1#m}Osl<|un*1c4|_(nvpb z5hjcZ{0t+4VcePy86jpr@jLI*ky-L7 zTxZFb251isD<&J(2`1f2Njo83o%ZOuBjYm7#Qav&xwY|(9pTK0_Hw2T`*TS{A$RSz zpKU(c0C2f{2nV9nw=PY920c-y+9|h8zRf(ZLKjp{*8@V&;Hc5 zDi>CRqX_9=+_Iw!V^+N=+eR4|;SBwX#_T*B=`xKs92nMJb(Z7}{n;pn5|i-(F?XYF z+m=0t>tfYyhOiF4JNB2Wl%DP4u<}IPwzcUMXA>_?-~cmtprpd%JCB}8E+L59yUk*9nmEjIS#$iU`wH(se6(b*jry#6fi}~ZH3C`V$F;xDO5+q zG6?_g&J;xD2F5WYqF$x;s*l=qqX^<)vq|J&&8Iup9y;I;E7!#qjxuZQ6od#Dmf50k zbg!4yBpGwJc(+xZH5i!BWL_V)xm9T$>HePj{+|OCzXzaqCA!D{f;NRdKjIh0hD>53 zp+5tQ-_gxsbyu>-I8LV2Kaqt)z4yOMLTWVgju#C!#EPEihh$^SFHmQJICaO=%i}2l zA?A_I*UpzFp202eNj0q zceN_OInUVlS8&DW2~zsZ3lxm=b?@HLWkJejjKmLfmN8x(J%)Slm$F=NO-z{)kZd(~ z4M;Td-*fCZ4}6#0OBkWP8#zFZ1jk;Uey|ABSwy$CNJBmBOsNTrwhGI++BTsf8T>$9 zx&FM7i+{SlW;yCJF0nzdN2SnOXL!|M-ep_8ZNIy;iv#GrUTIu=@L-(sc5z>U&;RLF zR9mO+-JopoAiuY<_Z>%9yZnQ;y#hZ1Q%x#YQ=>i_eP6KZ)lqy}oc7UQ(-3xh_%Pq< z4I3cmKtFbC>;IY`+ zTgC=W;(Jd9KgdJscNsz(_;WEb5e_6T@4G4?pJrwm`V9gml)dw9ggR0bkV5k+wQeiz z7zy9GC(3XA&NS}CqPx1iY_3AdU8ZTFI|aQ*fgdCx^(Po;$@eu~-W!HdJ+%e`yAKni zz8A|rJN(1yWRFUrV? z&`RT%kg)Q>mjWf)@EF$<37I4@1(uAmi7|vx|DJB|>-;6@&%m7F7*lcEyZ~|Yq$v9p z=1k>I-7WQ=xXH`YJl56rqp~q!t(^0=wWnU|s@tNUYDDg-y(F-^fUi=QdI)DU#x)w$ z42z(&LN{MA0HfbJM{t1!jegWe@n1Gx6qARsm@bd$S@b_@B#|d8|3{Xp8DDpa%l?-0hP8p(z_DC4*wVbFL zA8KqS1+-`%X}|igvAxTdp39d=m&Yf4KHp8{a6q!|qth?VP~>FBNS?L|u16qjLV7Xt z!5ZCbe2npMGoJO?eO`; zQ`(zvxof#{0s^|y9Sg8E(M9-J&z3?_?5)JQ)WH-g zQYM~aY4bRLC-4J^5Gz<|JQLQxe+rAEyD#~+5I*QCi9L!>({mGj!vfIsc&$nLZ1P*w zuUm{t-YsvGr2g(jj7Xl}K1}&)%}62Eo`>BY{q@n2Va{K7Wkg_=5*H!Jw)m_mI8a+L zw67sWiW(%7wR*(F16-rUaSaW4P>W822_?mn)CKR3WT(H_l|9lYFS-Pu_*07Ea}-f?+e{U!e4V!eMDe~4^m)=_^-#T@Qz z_#`8j0-(rbUlG>QylAlj+sgIC?DKezUn3H?+upkS=Z22g%}Nr!+eh2#%L0-r2r&b- zl)1G-p*1=QY`sy{KQny`%mDY_;T*n)35b!YhAT!+i)gvnL+$t|2APvORv&WYM}WL3 z8VYsvtv8yGJkV$mu$x%NxO6sC1wZLsRAC0W2z4Y2Ih~W9gIu|N(e10bZT%{*gCTo z1<-q8QNWY4s2XbW`?=32A*!Ca5Q0Au!eXE{*!WjXQ7C8zW9Vcv|t^XJwW86hhr_GT~AB4;YXRdnew;$B8E` zm(zhyL0pw9ev(pXi|%_6K<=j*ObG)!zEND{a?4`TQ@)h^_Tasz^ke_bOf=(wEaZ^r zYQ4#(EqshwF;)|77b-n^dlJ*b1B8?|c-89MUsF08&cRqh_HZ(y6k+@?ryi}QGE>}I z9TNR%E{Gi$Cmqa)zys^@1`IWaZ_k=iieeMe_qS8& zy*FtV(f~Hq*&3Qlg<)(i&0i@Xn;9~;S}e!dSyXU>rSly zy*G)8%*$eD%msnAATyun(OdJz6JZ;4BV%{Rnj5GY8}|U9_}j(Z82!nShSqYjp#Xy2 zVfOjzo&9ciEDTTA4&VEWJv^_sd{2->TG2t~D8D_iiW&a!?{}|7RRl$XtG@n*wwY3T z49~vJ-gK^#r;KwkBh&`Zh^P~CaPQ6a&$dkZh0O`8lnJ3tr{Ml2OsvlL^$o71QZthA6JR#mh zt6G=e^!O8HX6*Q}w##qTFaYo}yjrkQAFfKO+u`x}-u0}uOS^V>feVlgBf?yz(O|qD z&hA)32&Nj+0Ce46Z|@o#hE^d!xyxl&r{sUjPB*GVC(I;H4+>$1uzLqe%VE}%QyXAV z6Ii$(G#oEXwmK?kTzTa`&d~Np>UR@d**7bm!$-!R-=Bs9pXB;%vcOx03s6Mfc6Y;( zSIx;Lig_j!hR(vGR%yS1M^UezjWHxogrwx_2D-Ht&;ozI8_R!kCtVzyghB{8^vm9D z`Cc1!aNsrDAehS-Wt4ajZ)~294Bs_j^%eq?|B|V$y~;`+8yh^*#+f)!RuWl9M$PHc#p8MqWhm z3Cl#NI;haxyM^GXvDH9!s&(dX6vUqsfH$cJQ|Dvr4aM`*%u5Z6g#4%BrsJ{WzkU@O z>d54+ccphLG0W$+wzgLC9Q+VJqVnq%L4!!}X(iq7g3kO1VLM-N*8*OtTS7KGsJg-R zvSLzG>PT}aGkaj&O+M=l$?n8Bkyz>(`_h-AK7n7oWe#`+5REKusg%@ zTF~(vYcW5gZh49<6&azL2(3-)UG5$pW!-d{IXOA&UHlM0$kfg76;tYXaepwgz(*P} zqeB4?F`gL(gYg1Cnp~}axf-OO?;7~Hhu?!a$|ax%g#73t4(^a7A&kp5Sza7m0HC#! ztGs(swFG0jk?5tv<0Ikbq!n=q`HiG0gawyJH9nFBMA|$kE1-z7{5g@`V3>MRy##wx z6XbT?klpFWMb7{$&p3%1$N0jKbmWl-Pm(CRsSLP~?8X1{V;`Jv9ix^Idj~;E$NQqH zk|xU^B@$j6_|xQmUcxq4a~9A5h4y_D1w~o4WB#B6sBR_?P=4_vFV#}TIZGVVk^8Fz zlh6&`#eex1Gsr+GaqO+2UdB(za_C2jbjV?tCA!hYh)z;8-M;cDV(z-IpJ1kxoaJz;?p-`6YcX!*4M%_K*g{h; ztcPv%tt{MNtyW*(O#C=@(ddVcB57~eQA^*`0bH!sJ5{Bgm>v~8xAGqmQw-t*7gh$_ zP>7H7<;A<50B}y$Ri|p9suyN_3JDBj`}Ezu7vA-`pp zTqmc;s3~wo^b%`N(06Bb+DnU^NdMdbuGz)7yKRBgdQ*OFS)n<`4Vdje>6NDgITrmX zD&W5U&1j{3Tw%G?I;IzKIguA~4?2)&CJ?VFm|3&vIQm*6=!ye4(%IEjYe$dDcXY*W z&F=f~xfsh0Rn7o6uZ;WASfmQOveE*2;Y?_Kd`BFnOFOmGAI88Ij9Td8-yd*A7LEQ*@>E1>3s^e|(e<CGmAF=9)05+aD@%Hb|EUBDV=-YbP@fvS6)ZM56JcN?C8ssqkXvZ@ptE%G-R7$pHYmN7iPp9$U~z@@VJCW+9CyB(0=# zLdh|z&4&#@w*4qvXc+yiqE=QwFRbB+C~n}6vx&J+-L z5r6=|hw&c*m>b>biu`HOF)9~wsqwqbThQ&2rFaB^vBK#J<2YahR~^Vj16n-AEwq{L zT8(U{vp?iVuE08p^9(R29$jOjs`s~SflxW*Y2o(CEdU64qLGffxPaAw$5goPL*pI} zo^rBuh(2vJ8=uW!%yU2jme7boUE(U z1Hjy0Z2}Of3c5Mccp}~D-`TsgY@@Q36kVVc-ogX{E+~ezuqcwRE8gHi#Dk0$eiY73 zZ6%lDye_Xz3;GsH$xY+$o%LQsnHJ~dbl~q@0LseB8vjHJH#5-|o<+Cx8{2-v-`trW z?z;kV=T!r(@b@)P5P;?#$PWoz2WehI{#R3HLYa7zZ~(XH*CtSydi(RD^1KP zQeo=_^M{jqmZR??VOg7-o8WX(*>_i%Bii=0DEI_5^V~%9;s%_|~;!xP>X_nyF1-9ux`%9SZVuVxm~My#6cx z9R|BK!-KjR?RHY0`0w-)M!P0MeSL@g~XV6gamK&HDIK(qNn9J>d79r+w=4*;X)2UgAh*N9K0Lb~owxM7M43cB$3iZy(E zs-9potoIJ4n*)6YXR9uAT)iskJdl>%hOr%JGeRSNg2qtx!&&>gOgF-9-s&5F6tOLT zFVb4SLJ01c#9cm-*UZYxQ?@;>m9By*{4o6VR7_>T48cXsT+_tR`Z;foj$83D%Ake5!tWfsu>hje|w zO#v{@Ze9Ec(Yp=$#oUeCw3%jLplw$*JEK@}N)G$^9CH7RdjSA&<4$VDhDby|ocq@Y<86%y5g;Pn2L3rJNfjEsAK0@Lc zL7at`Zqr`70^-zD9xJ!T!~fo5IBmU-A1iZU2h2frA%(t*0hRxfdE*2)zB(my4kUBt zlngsa=KSdg4{y`jiJg)OH#^hr2x7}T3kuc)N~nmkX9rjqg25!4VC6UNWb-x-wY2mE zqqLP*AMaRHKaIy_U4HGxuJMW= zWMmIAk~?Me{ZI<%R60c$<@w*67C{RMoWA=%9xebNOfFDjI-n0wQw6_*fXW#H`6()b z)-(b?x^MyP!g|^TRFc{$UI++00fcf*5u|$>H0b^Y-<)a|2^#y~hJi*nzL^QailhT) z=6uk)mbLEN&~pJ%r~lvG1x~+4l0N`!{|Qeq+_L(qKIr`=B_%5a2E?g?&*FxL3=;U- zMe02txSZOQxzw!UEB=C>)2WZpgQH**{&(TO+WlQx^TPIw;`YD(0t#+_ng^gy{rNPU z{ZD^>4Z5DDF&|LQwF9LCZZdv^2=(dx!2i8t%F3YlgKO(Q8#PCW(3fOmRT?{W5FULW zfck<>Y%{vU0D$HK@hdvLJFGtuF;=I!5aAbe8ad8`eX>OU!0Ez^BIz<=m6P}jKxV1g znJpV!Chp?pe4$GK7-V09u0kLlkr|&F#{=iSgE;6I`+ymI>>~&?}WSz!~JWG8^Wg6a1@R=z;&?~b?R-4eM$H~??v{ZQIXXl zN8ZyRyZttAFREdP0bCCroZ&J*B8$DLA7~|>=9o@hVn}JfgF~_o(u6i9s`!sWBmHs4 zHmI*H&@C40a)xK|)Ul_TU|t!QTTZzG8Xu7RQU~evBt5{~xEU8M2>60V>oPlYvn|~k z%t6@_SAe}>E;Ui#{qkWu-!|N104WH*<#EgF=c3rq#7WHk5^DJSXRom;mIKoP0J@*g z=_z1{8Z8P`F2G!NuDj6nS#BG~xdzAkA77%APHa!QL}(;TjD2pLOw$wol@1(|ixpm{ z${A356=O`~1A?1)^!b(!G{qs;V7F;MWT5uQZWIEb_9V%n_$dQe;4>arfP3&CG+RuW z)Y6T&re%aT{2Ui|XT>=@u7IcRKn|mx1=d)ZD8gPc9TQc1ieqD~xev5?ySNp-o&~xp4vCNAqg$fnE7n@lnpsnWNn{Cp;8b%z0o()!~yIb$2l zbsh+K{VO*UT1PKP|o2{WO<$k^@i`}RSQFfR= zO=(bAP{wN1l>rlMAeXMfkT8NjEZENG%m;}h#{-UrM^{-8n{2CgSn&z}xL~k2 zP2eNsY+apf@p)N#NB7${+kM1P!S>`2Op1q|HR>j!o=Pc?m{5qd`OdQ0z1xn!)}=lm zJUGB1w)E!mSnfr+5d6xbU4tczX*?eEkj%n|HDE+2^?(BP~81U$k zwhuVM^LP_S#x@@<@@N`SD4TR_0-Mr)Hv_=*ImQGcaS% zehtCg5}-F|mi@I(O8+;hnZ@qMRsvOx#%?c4@QYSvT<@&9yL5uh^ocN>SSsSS4(KtM zo$1yk*lEQ+gI>TKqE-N-2ZHSuB*h&BvmhW~^q33zQkXi3ncNz>(tMv0*y8L18kz{> zp^+*%Vj3mn&>4n%QWA1Fuyd*n2A*&%A8}K=0(1?0G-}^}s_2C40JVJ^$Q1j0E-qD` zp1yi1FJ=&hVD+Ub-J6(VtQI{Axeqa8)iuo6;wv^%2Devvq}>~v*TJ1R8wd7l(g&Ey zbb}s2VKTU7{A;v_5y%^H1O9Nwz17e^DrmL!KM2|g+mK#_ash>Gw`m=nyC^muQ-SxC zlnGQFWITJ#2uuj_yhRJpFgq$xcs8}i->|6|h&>O;b&4taZ3eoMe)YC!Kq2K`ow`6a zt%XNfuY&ByM$q+O!sqweO3N$}dKoOV$g^L>+83nUCo$=yCYHo{Ssi7be32eKVWp`Bc#)Rc`cfQBl4T@{)e-z7Ep-F z($b!X!zIAY*V#OKI}_x!zG_ioDuog1E22^4w`0Fn1sB;E5pLRNHeD$~1&{jDSS>TJ zrgriHJOQt`lST&&I)593$Mdtb{j)<~Xk$O@7(p_#KcBm2;p~s5?2L5kqmG_`w~zHZfn{Hn)B8QoxfeFoq}Y{zc*y2b<%=H7BWUM>5fzpC-d z=n%u_q2x8&-jMT1PSg|jOamcAV&$yj?30$t?UKCv)TW*^SXq5UbdNJG*wyuQi!@2Q0qy_hwgt^9-;@fIQoF0nHZh2uqPeQ7kMyS z)2{1u>y4Y_AG4c%$$(YBOD2mF*gyCc6lmqPXY<1ZoE>${K3xnjD$Nw3J*RxVaraBt zqRNeq#L(tTm{xEI9_K{$9KK;^0o27}!c5b0OrI@!@{NCU@GUeHDQ!?3i@v;A4aqe4 zE0De2q9m9n%&MhDep_8G?+>O^2k9VIN6llngj_0oX8NKJ2m{YY4)F3@rXJ>`iibMv zKnQPPAAqnvDD_+a^~q$g$#|UMvq{UV;jXqi-GF9TGhTbG^|$^sZ;t<>{{oG$AF6dn zS66_~1zU?QD)-7-;^_&0apdahX{xImi+da(u(E7>c4K3MKhU<#=u6&xDyy)`Q!r6i zM$8)A96M^Oc6twHkb*t&qB`U@QfCB~Ud6lY63e5Iu;(7xH?@B-k4=0Fld1?^2;9*Z zXs}f)kM6n2H=gYHuu@7umA647Fk?zYo?9j&fOCA?jmW^BlR8A8NUsrCS`Ocg2BAyC zP`eMrwZ8Uj4GR;aNKS<-yW=8+gCyTWJVjNUx#1?xkRC9~^q8z$rOYDz0j)` z3A12HK*gh2FkLK(<&rU0cr^j1CT(}qUccy21#%F3&+CPW5A%F6o|4B$$pJ$)Ny51M z1-AYf>~*yF9$Unloms)IzEd#YML&lLdzkM&;QA%AIm7_83+``B=e*@^)*XwEDg8Y; z=yohnv2Ux4qbqIOw35F+$iyN55P}jL%X}SbRd**-sL3Y=^Y?~6N)k*D6bNCw?0{bK zt8{u_YKwn&w6aQB88fCvcz7a=)r!RqeiC3x71VD1Y`14?&Rr@bL>;Mj_f-^;-|=6Y z(FC*Yu;J11EYfD9vJ!15yYO1^2A!F*5uR*cIW3?K+=Z%_lnGEG=3K!I;`y42XC8rj zgc1L_o}M>n0X^QJMp@$AG~%Zs;@~waT+)xGv;xt%&spVJDcZX>^e~5^5ikb*7uFd6 z%p+*d7fxu9PW?>-1gy-xXlW$W+LmCJ?cVe@9m_&GUx%gi-*-X*T1A7=W5qr{9u$M4 zGuE`iriJ`d7QQuVS;;O2AnBp|nj}azO#b2#?9b>ai)()rR;NztzQk zl&we8k%jTQC+=Oh@pN-v6N$yS^e@ehoP(xF>p~kLe{NJtecZS}18CR{8y>ivC`k*p zF2lq=2?(#WgL6gb$^_$&a`&z~1ti9lxUdzr@k|rSDq*(aD9EFYP!_pQ7;s{P0LmAl z&#iq5_WY@-JDZp#rlU?n^OGU2W{iy#ZPkg@YVCX47GfsLl_OJ>Xde`ww(Zx{>)qx) zD}p_#46=UHgUCL>xID!*8+z)WM6vjA=>Uq{K~TTdPr+gNGv!R?-#trYLnf`A>ieJd zdcehJGo-y_ZS$s??wxe1+Dq`*PU^>C7 z^WL&8+r1bQjmih*lA2bBuD1E8qCPB;y7 zic}Fc!zLld0!C=UJzB-j<|XNPYN>}V<-y?7M-E{@(sSv^VPyWkg9N;HnocY0Lh$^j_Q57y+)`vyTtku<%LrllLLg6hO+p(E(4Nx1>W?rlKT#{Hwu9_8@lCbSZ?7}6v zw|_r;%L5cY#PyZb;49FsnLf_ktne);tBh@Y_4r0pS$WCG|*YLhshJ0 z%z6JtVuP1=>(;Y?Chg!1(aqZlul52uWn$w~DQw@<8o$ise>8^$bw!mw>{KvXd3!)Y z7vbfTo<8Uv#TSx&CUsAOB|dK>E(a2AZjEGaML95%?tvjS$Tm#>M7@{d>+SPb0xk}sEJU;}G@g%a%{;RJ0jA{3hCw{?1!JEJ(C2f$Kyjvdod z_%hP|=)51+;nZz&p-eCjq{IC)lwhTEOo~H1o2I(Ij9F0B`=n3X2bv1fHD#`5K@qO8 z$FCn6`ZVU;0F0W=2sUu};P;K_Hf<$&(oSLFD&4u1&d}KqLUy*5Huv4mR5gQ}QE2;c&Sm>)p+j^xjiv}^Vv+7a;pW;fRd-TC+QN1&QdN6z6yUZ~v@n(an zr|!q0m=C{nJE-zt;p~b$800f1e=jFEg0;YZytL$E7UrLaL@amm&Fg&2ag@`!&aGN5 z_PwlUe&B-hPJ;uVX(v8_YR*_@ik`*SGS>T!j&FF>I^@4$hxelE>k)u$)mF?rS zmcM+|1Drc2irhE&| zNY9piDT`&&eUrf6mYvTMXDrw*DH%`uyL0#bQ6Os#?KO2ofZl8o&xnQ)^->z5H!Q1` z)%%|o&4Fy6#UD_G1Lm_pWc$Xi((a`uiRwjeWk1**ylX;@I}{@0Pm>n6ajwR8zwChX zIMF`LPgxfnuVcYAHBwOTx9yp>8?fJDLSK(?+Ne)~X=$~rLq8V9Ji2Dqz^` zyAVF*yt)y#mX-RmtYtg8CL_0E1vVPod&9opf5wYKyg3x>w2ZochDk$~`$N;o0~wA@ zSM}kf-fAx4emRqrnuo5IceR~Xfp)&eI?Z5Q-=?)l6Cu!L)+cf!^w|$br>Gk@1oNUd zx>3Si_rY5RE4^IfcU3pH_5+#_^=0J&mh$6%bsDvk)-s)ZGuUslx=$Q~RJ_5RSPgt~ZaJcqM7+%UJXXd9t3O@|gh7B4WVzoMU~zG=**gbvLR zhx87%?l#nxtkPYsV6pq^*Y?T(xAaWgLcT!=nO_q$g6_e}c;ma6C;hXj0gz0#1h+|L zbIauvA9i~Rt34#@IX7R7-P5DAq-%)lam&TSl*51S0t; zv=T8Y)@9Em){6H>oPLdzZ1U$>JBg?l&3Z0RLO!)}-CL;kbs4Kz{;=Z%*Em{QZqpBb zs%(-Ui=_hD$eb9k7J&DyD~_ERJ-|cqb2E z3rN53+QS8I-+vII5t`9=bYggnV}f zs?qES*ccf?$Bv`B?5ExCR-;OpLsKcyNl7H1U3cyVs^7*_wjntogb)ItbaBz{HaW~u zw!V&{n^vMKt@e`2-ElxJo^wc4Npj7uA9eux<ldrd zb8_)Pn@a%>ow&?^)-oIV|^TS?;Y!sM?(8+V2!W%=M=>Q$ljj zs)K_ps>-+Ti-7f->%!Ytg<#EM+X`LOHx|+8ijCj=p424fR^lxTEGakgw6BLV-kCmS zPbO83=CteV3SE696uvp|bBM8Z?~6G1*72^I@t7>+$^5ePQ=%Xihs>?pmPY_vZP#W+ zKdZcw;_#XAUsY8&CfUchh#IY1RpFs!az6__Em;T)&)>p;t-8!<(R=RnQw_A()`J!7 zRB$5B0j;i#mBvsW@ocyb)r^4~Z1ez?v6qY1%>&`<9hmGTinV$e<22 z$zCO1mA-7df7%mKvah39HhIMZkJub>LWk~&V!DE^wgM?AkZJS+FbE;65kq+omK17p07A_BWCaw z{ckW!XjDI7{Hn>w3ItgLTvoPF)e+0$mq0R zoyI1eMCZO|Nvt0?qI)?5zZH~r)>v{k0hEu6v^QrLJ#(!`?}!$OFtz}<9vv*NH+jPL zcAN*cgWMzY)|T=?dU;Cq>i^qIL-3kA{acIc!3t8#yH^pL#N^9{#sj+3u%Du@ zB!lk#V;~F$nZu-{bU=8#^Vf?4j&w@hkHa6D);6)q6~-H!PGxDEJgZcuv9(JsFFhG@ z&5MCmJ8nWXE?Iy6+}t9BBsWp=;F2Iq5*0SZv69RRQQO>A~QfSD%U}Zc1nF? zQjjRAIB?&MNDs9^```NON%`8*i}Lrc;So`sr=Zbbk<~*fv7c-k$L)J4*)RgJ;iFRK zQppP*SFcCMIai0oQvG(XfjtXD@>b}~%qQpeX9kZOJP3Qo@BwU<7>KgWTrQ&!@F~fIU5=NtPaWoFHOqwrSvK$Bw)=3W zF6L&1D;T=4%}P_3B|Eh?I9H2#;%!Dy(Ta=R1uS;peXLgq_stoqLX`&X>7B>qwo7ly zhwx=Nvt~IReC+?q*5FISd3D+*C#!1BWM7T|pF$yJZfox~HFl#~1#_hS?UM+n;lyt; z%M4=1!deMkHeD9#$z7cnPihr}a)iqwW?{%)9Q(MEsB*)LX7 z5i4~>{jL=lU%&khJ+jwHTWzej_r7c?-iDiEfBVAhGWN=@`NwsC-VScKq>3uw@fz?aw=_260++?5~SNg`$_kAuNp1dh_MQ91G zHu{n-^U=Drq%m)cZuwo*V8p3F3YC^7{@p8nqxfgL?C?M?J<02ko3x}m{Yg3gy`$y{ zGeSB4fY*e<8_xXl{3WoS!3~Qd!Kip5w9r+RW)4E~NWWep?&up?s`EiV2PX0}eLEp$8!7;F4^~wMSq$ZX*PV|9%XXpHqEu++X!ljZtIZi%$HdI< zBvxygX!74l95lkr(_YXsp?BJQnR~u6qU*EGPu__iqsORNy7uLDW=Z9XHNx3`>KkGa zs^?+o>qRyu#0X2a0t!KZS&3ecJ;+J&S`I{=wu3t9syFn2y+y#~pb#NN!IG<(g4pk$ c-K9dFPu4jQ?Y)k{Dgi)US?5vtL%Wy%4P0zVDF6Tf literal 0 HcmV?d00001 diff --git a/chrome-app/icon-64.png b/chrome-app/icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..f16c06713d34937a0a795914fce5a9f7f23ccb20 GIT binary patch literal 1982 zcmV;v2SNCWP)Px+cu7P-RCt{2n{R9zXC22s&-r|glO{f!HZ<1SWzI^ME-H~o5U8q2}>>8zjQ&iQNX4SD#$FVKoPucUP)`1&w|0#KD0ahH53fn6PDw~gm~$LcijH1?iHaRR zUf0e8RE56I?#5rE`1fZL%QV%D_gcXt#BE0{XU-R`S07=QoIf-zNyd4Skk6+r5&I7bGK8r`& zg<XR6tGs#24B50+B~fmD`VHaeE}jpWp8*mBkDuv0R(}N$|2Pfv^(#Gwg`2>DC#0YzrVjfdoHCcun!Ina_iQu<@m5{B0Fk% zZ^(S;dCwdb$hjjgen!+a)H>X z2;nZk{~MKFmqN)-@w+P&CN6Mz-(_lRzEV(r=FFKD%jrlY!tvwBSLCx6;^+Uc_++fG z+&wln5nBS3y94D$Eww>wYby;64cY697cXYdgTWvzEiF0qySuxI$K%=SBS(&8&qJY5 zsb9b1EJ*+-`2rk0dNjx0-`}4jK)$`)Z2A<~5}@22C^sd~0oSfw%gJdc@pzmI7cLZ( zIdR&9!C=9hveqm~fMQRAZUW@vv_~S5vJ0^3Q(#Mga(AHIlspGSqfrdQ$X+{_#Omtm zh(>c4QaU?385$bOUOSh>{Qh$Pu)G8T!r^dHo8Rxxc}%v;oaEcf&8AO*Edk2ifpSyw zlGsLNYe}pKCEo>>N-P$mt7~!pyVTy^p1s>RZ?iTB4<4kcsi~;l*?u9`OaQ|$a(+cx zsIHA$n~I8xtN?CyXZwZNkSWmH+gp;8^RXcX0O;xIS&`4#^a8Be98io%BvMeen0JJg zN`tZsu$-U9Rw4>EYzn|879bc50_ikZE*nw+`x&4V?j_vIH>>~^6%{45DJFmlOag&? zLozi{(iimi_q#rpo;-PS-gYNWoG2*k=;&B*;iRdliSF+1MfJ^?D`JpLDpE4+X1g2j zT-1k`i&E0y`jG1jF9?PeA>0KR9_?fhFrPkO0ZKIo^El zCY9DCelt#`l{>E~C|%-QFWTG`BS1h)fo7(i*UYpK!K!BV9k`6gTQE=NU>HWue}vlD zlUXsl8{u#``#9|Oy1Q8WTW`O`hqp&bC_08mCm{kDo*)S&05BC#DLVwfZ?EuIEyXb{ zl@5Q~c`XwSf$C-+Jd{3xP;OGm8G7D*olpKfKtc(momX@WMbBP8Py*+F^$qo_ zDu8P7qR*nun?mF}ubE(uT_^TxGuyv#nyNj|mD|60nU3|+|IQz|7oWnf=;;jsrlW!Y zX$ono+fHOI({x?pO4Tf1%6HyQ2Rk}^{(AiNQPjtxD37dmkk%!!0?b@$bueEab)gX3+`H_OvV2DB8_w(~jZkU6Ro1JHdMemQ`E}>r z208r;E+9DUO(C?@s`YnOFg!YjsF4We@1ObJz*EKQEw~SK_GKD1I0YO)ux&+qxmrl3 zfy+s>7kw`!3m)~Il(Z36zRWj)XMnw#t@G<+`#g*x8AH&E gulp.src(prismScripts) + .pipe(concat('prism.js')) + .pipe(gulp.dest(path.dirname(require.resolve('prismjs'))))); diff --git a/index.html b/index.html new file mode 100644 index 0000000..3c4653c --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + StackEdit中文版 + + + + + + + + + +
+ + + + diff --git a/index.js b/index.js new file mode 100644 index 0000000..213acf6 --- /dev/null +++ b/index.js @@ -0,0 +1,27 @@ +const env = require('./config/prod.env'); + +Object.keys(env).forEach((key) => { + if (!process.env[key]) { + process.env[key] = JSON.parse(env[key]); + } +}); + +const http = require('http'); +const express = require('express'); + +const app = express(); + +require('./server')(app); + +const port = parseInt(process.env.PORT || 8080, 10); +const httpServer = http.createServer(app); +httpServer.listen(port, null, () => { + console.log(`HTTP server started: http://localhost:${port}`); +}); + +// Handle graceful shutdown +process.on('SIGTERM', () => { + httpServer.close(() => { + process.exit(0); + }); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1875169 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,22028 @@ +{ + "name": "stackedit", + "version": "5.15.21", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/core": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-rc.1.tgz", + "integrity": "sha512-CvuSsq+LFs9N4SJG8MnNPI0hnl913HK1OqG3NEfejOKo+JqtVuxpmAFyXIDogX2x668xqFKAW6EQiCIcUHklMg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-rc.1", + "@babel/generator": "7.0.0-rc.1", + "@babel/helpers": "7.0.0-rc.1", + "@babel/parser": "7.0.0-rc.1", + "@babel/template": "7.0.0-rc.1", + "@babel/traverse": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz", + "integrity": "sha512-qhQo3GqwqMUv03SxxjcEkWtlkEDvFYrBKbJUn4Dtd9amC2cLkJ3me4iYUVSBbVXWbfbVRalEeVBHzX4aQYKnBg==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-rc.1" + } + }, + "@babel/generator": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-rc.1.tgz", + "integrity": "sha512-Ak4n780/coo+L9GZUS7V/IGJilP11t4UoWl0J9cG3jso4KkDGQcqdx4Y6gJAiXng+sDfvzUmvWfM1hZwH82J0A==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.1.tgz", + "integrity": "sha512-fDbWxdYYbFNzcI5jn3qsPxHI1UCXwvFk0kGytGce/FEBYEPXBqycKknC8Oqiub8DzGtmTcvnqcm/cl/qxzeuiQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-rc.1", + "@babel/template": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.1.tgz", + "integrity": "sha512-5+ydaIRxT42FSDqvoXIDksCGlW1903xC73HQnQCFF1YuV7VcIf+9M4+tRZulLlYlshw7ILA+4SiYsKoDlC0Irg==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.1.tgz", + "integrity": "sha512-hz6QmlnaBFYt4ra8DfRLCMgrI7yfwQ13kJtufSO5dVCasxmAng2LeeQiT6H4iN5TpFONcayp5f/2mXqHH/zn/g==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/highlight": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-rc.1.tgz", + "integrity": "sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "@babel/template": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-rc.1.tgz", + "integrity": "sha512-gPLng2iedNlkaGD0UdwaUByQXK8k4bnaoq2RH5JgR2mqHvh2RyjkDdaMbZFlSss1Iu8+PrXwbIRworTl8iRqbA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-rc.1", + "@babel/parser": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "lodash": "^4.17.10" + } + }, + "@babel/traverse": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-rc.1.tgz", + "integrity": "sha512-lNOpJ5xzakg+fCobQQHdeDRYeN54b+bAZpeTYMeeYPAvN+hTldg9/FSNKYEMRs5EWoQ0Yt74gwq98InSORdSDQ==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-rc.1", + "@babel/generator": "7.0.0-rc.1", + "@babel/helper-function-name": "7.0.0-rc.1", + "@babel/helper-split-export-declaration": "7.0.0-rc.1", + "@babel/parser": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-rc.1.tgz", + "integrity": "sha512-MBwO1JQKin9BwKTGydrYe4VDJbStCUy35IhJzeZt3FByOdx/q3CYaqMRrH70qVD2RA7+Xk8e3RN0mzKZkYBYuQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helpers": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-rc.1.tgz", + "integrity": "sha512-4+AkDbZ0Usr7mNH4wGX8fVx4WJzHdrcjRkJy52EIWyBAQEoKqb5HXca1VjejWtnVwaGwW7zk/h6oQ9FQPywQfA==", + "dev": true, + "requires": { + "@babel/template": "7.0.0-rc.1", + "@babel/traverse": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz", + "integrity": "sha512-qhQo3GqwqMUv03SxxjcEkWtlkEDvFYrBKbJUn4Dtd9amC2cLkJ3me4iYUVSBbVXWbfbVRalEeVBHzX4aQYKnBg==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-rc.1" + } + }, + "@babel/generator": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-rc.1.tgz", + "integrity": "sha512-Ak4n780/coo+L9GZUS7V/IGJilP11t4UoWl0J9cG3jso4KkDGQcqdx4Y6gJAiXng+sDfvzUmvWfM1hZwH82J0A==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.1.tgz", + "integrity": "sha512-fDbWxdYYbFNzcI5jn3qsPxHI1UCXwvFk0kGytGce/FEBYEPXBqycKknC8Oqiub8DzGtmTcvnqcm/cl/qxzeuiQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-rc.1", + "@babel/template": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.1.tgz", + "integrity": "sha512-5+ydaIRxT42FSDqvoXIDksCGlW1903xC73HQnQCFF1YuV7VcIf+9M4+tRZulLlYlshw7ILA+4SiYsKoDlC0Irg==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.1.tgz", + "integrity": "sha512-hz6QmlnaBFYt4ra8DfRLCMgrI7yfwQ13kJtufSO5dVCasxmAng2LeeQiT6H4iN5TpFONcayp5f/2mXqHH/zn/g==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-rc.1" + } + }, + "@babel/highlight": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-rc.1.tgz", + "integrity": "sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "@babel/template": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-rc.1.tgz", + "integrity": "sha512-gPLng2iedNlkaGD0UdwaUByQXK8k4bnaoq2RH5JgR2mqHvh2RyjkDdaMbZFlSss1Iu8+PrXwbIRworTl8iRqbA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-rc.1", + "@babel/parser": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "lodash": "^4.17.10" + } + }, + "@babel/traverse": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-rc.1.tgz", + "integrity": "sha512-lNOpJ5xzakg+fCobQQHdeDRYeN54b+bAZpeTYMeeYPAvN+hTldg9/FSNKYEMRs5EWoQ0Yt74gwq98InSORdSDQ==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-rc.1", + "@babel/generator": "7.0.0-rc.1", + "@babel/helper-function-name": "7.0.0-rc.1", + "@babel/helper-split-export-declaration": "7.0.0-rc.1", + "@babel/parser": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-rc.1.tgz", + "integrity": "sha512-MBwO1JQKin9BwKTGydrYe4VDJbStCUy35IhJzeZt3FByOdx/q3CYaqMRrH70qVD2RA7+Xk8e3RN0mzKZkYBYuQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-rc.1.tgz", + "integrity": "sha512-rC+bIz2eZnJlacERmJO25UAbXVZttcSxh0Px0gRGinOTzug5tL7+L9urfIdSWlv1ZzP03+f2xkOFLOxZqSsVmQ==", + "dev": true + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@braintree/sanitize-url": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", + "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.1.tgz", + "integrity": "sha512-KU/VDjC5RwtDUZiz3d+DHXJF2lp5hB9dn552TXIyptj8SH1vXmR40mG0JgGq03IlYsOgGfcv8xrLpSQ0YUMQdA==", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@vue/component-compiler-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz", + "integrity": "sha512-pS4zlcdD7BvedyB+IfiTfrbi6C977UMIfulSk8r6uL0BU46ZE2+fUj/zbSNSfVxeaj9ElmnSni5OMwF9np+b+w==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^6.0.20", + "postcss-selector-parser": "^3.1.1", + "prettier": "1.13.7", + "source-map": "^0.5.6", + "vue-template-es2015-compiler": "^1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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" + } + } + } + }, + "@vue/test-utils": { + "version": "1.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.24.tgz", + "integrity": "sha512-GJyoAbyo1rEyohUziouJqDL7Nu7stSl3ByyYXLTppbrwdKZ9fFZPLZwKxkxS/Ks4Fo9YG5lALLLttypz0SC7FA==", + "requires": { + "lodash": "^4.17.4" + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "abcjs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-5.2.0.tgz", + "integrity": "sha512-VBTgtp2esnv6RR2N6Nsa+V7VE07H/TLtUju+Orh6anud5KDfUE6eEM8OWt2oKMwKR2zsrY8Y5KyH541uyV2DEw==", + "requires": { + "midi": "git+https://github.com/paulrosen/MIDI.js.git#abcjs" + } + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "~2.1.16", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + }, + "dependencies": { + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + } + } + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argsarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", + "integrity": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=" + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-iterate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", + "dev": true + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + } + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "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" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "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-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^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-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "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-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", + "dev": true + }, + "babel-plugin-jsx-event-modifiers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz", + "integrity": "sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg==", + "dev": true + }, + "babel-plugin-jsx-v-model": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz", + "integrity": "sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.18.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "babel-plugin-jsx-vue-functional": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-vue-functional/-/babel-plugin-jsx-vue-functional-2.1.0.tgz", + "integrity": "sha1-VjCgyG/hkE0owwRl5r8c9xI1ojk=", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "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-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "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-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-vue-jsx": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz", + "integrity": "sha512-W39X07/n3oJMQd8tALBO+440NraGSF//Lo1ydd/9Nme3+QiRGFBb1Q39T9iixh0jZPPbfv3so18tNoIgLatymw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "electron-to-chromium": { + "version": "1.3.70", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.70.tgz", + "integrity": "sha512-WYMjqCnPVS5JA+XvwEnpwucJpVi2+q9cdCFpbhxgWGsCtforFBEkuP9+nCyy/wnU/0SyLcLRIeZct9ayMGcXoQ==", + "dev": true + } + } + }, + "babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-preset-vue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-vue/-/babel-preset-vue-1.2.1.tgz", + "integrity": "sha512-a/Z+6SJ4GXyAoCMfYidDH6OzXnccPNJ5nEaPMjALqCkP9SJkqxz9V0uUS//sGuWszcD8kibdwJRzU+brl8DdFQ==", + "dev": true, + "requires": { + "babel-helper-vue-jsx-merge-props": "^2.0.2", + "babel-plugin-jsx-event-modifiers": "^2.0.2", + "babel-plugin-jsx-v-model": "^2.0.1", + "babel-plugin-jsx-vue-functional": "^2.1.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-vue-jsx": "^3.5.0" + } + }, + "babel-preset-vue-app": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/babel-preset-vue-app/-/babel-preset-vue-app-1.3.2.tgz", + "integrity": "sha512-PLyyyVdrvgL4szMF7D5SuUhy85aBzy0+s5MO2QhpTwVqfW0qVaPFJi6K3d25CKz1nOV437JgpVvPj1W6tLGJ5g==", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-env": "^1.6.0", + "babel-preset-vue": "^1.2.1", + "babel-runtime": "^6.20.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "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=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "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" + } + }, + "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 + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base64-arraybuffer-es6": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.3.1.tgz", + "integrity": "sha512-TrhBheudYaff9adiTAqjSScjvtmClQ4vF9l4cqkPNkVsA11m4/NRdH4LkZ/tAMmpzzwfI20BXnJ/PTtafECCNA==" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bezier-easing": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-1.1.1.tgz", + "integrity": "sha1-ni8OJwsasgT/JD0hbR+rUhctomw=" + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000791", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000791.tgz", + "integrity": "sha1-Bnh/VsrvQwChfjXRN0RxI731Nvk=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000885", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz", + "integrity": "sha512-cXKbYwpxBLd7qHyej16JazPoUacqoVuDhvR61U7Fr5vSxMUiodzcYa1rQYRYfZ5GexV03vGZHd722vNPLjPJGQ==", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "ccount": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "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" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "character-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", + "dev": true + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, + "cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "dev": true, + "requires": { + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" + }, + "dependencies": { + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "ci-info": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.3.1.tgz", + "integrity": "sha512-l4wK/SFEN8VVTQ9RO1I5yzIL2vw1w6My29qA6Gwaec80QeHxfXbruuUWqn1knyMoJn/X5kav3zVY1TlRHSKeIA==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboard": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", + "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "requires": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^1.0.6", + "through2": "^2.0.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collapse-white-space": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.1.tgz", + "integrity": "sha512-GkIcfJ9sDt4+gS+RWH3X+kR7ezuKdu3fg2oA9nRA8HZoqZwAKv3ml3TyfB9OyV2iFXxCw7q5XfV6SyPbSCT2pw==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "requires": { + "mime-db": ">= 1.30.0 < 2" + } + }, + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.11", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, + "copy-webpack-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", + "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-b64-images": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", + "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" + }, + "dependencies": { + "domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "dev": true, + "requires": { + "domelementtype": "1" + } + } + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + } + } + }, + "css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", + "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, + "dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "requires": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", + "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } + }, + "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=", + "dev": true + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-match-patch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", + "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=" + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "domutils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", + "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", + "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", + "dev": true, + "requires": { + "bluebird": "^3.0.5", + "commander": "^2.9.0", + "lru-cache": "^3.2.0", + "semver": "^5.1.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "dev": true, + "requires": { + "pseudomap": "^1.0.1" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, + "electron-releases": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", + "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", + "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", + "dev": true, + "requires": { + "electron-releases": "^2.1.0" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "entity-decode": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/entity-decode/-/entity-decode-2.0.2.tgz", + "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", + "requires": { + "he": "^1.1.1" + } + }, + "errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", + "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1" + } + }, + "eslint-friendly-formatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", + "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "eslint-import-resolver-webpack": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.9.0.tgz", + "integrity": "sha1-IxzhV4rVEk2leZ8Cm9M9KBN2I+M=", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^1.1.0", + "has": "^1.0.1", + "interpret": "^1.0.0", + "is-absolute": "^0.2.3", + "lodash.get": "^4.4.2", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.4.0", + "semver": "^5.3.0" + } + }, + "eslint-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.0.tgz", + "integrity": "sha512-f4A/Yk7qF+HcFSz5Tck2QoKIwJVHlX0soJk5MkROYahb5uvspad5Ba60rrz4u/V2/MEj1dtp/uBi6LlLWVaY7Q==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "eslint-plugin-html": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.5.tgz", + "integrity": "sha512-yULqYldzhYXTwZEaJXM30HhfgJdtTzuVH3LeoANybESHZ5+2ztLD72BsB2wR124/kk/PvQqZofDFSdNIk+kykw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.2" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "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==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource-polyfill": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", + "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", + "dev": true + }, + "eventtargeter": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/eventtargeter/-/eventtargeter-0.4.0.tgz", + "integrity": "sha512-SAMC9heSSwhL2rxYF+iM0zFCQsXx3QKb3H5r5vcsYzKQVNb/jdVQ3VWxC2jpzWA3ecrLAzXVzoT7WB4D1yN59w==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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" + }, + "dependencies": { + "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 + } + } + }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "requires": { + "clone-regexp": "^1.0.0" + } + }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "extract-text-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", + "integrity": "sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=", + "dev": true, + "requires": { + "async": "^2.1.2", + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "favicons": { + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/favicons/-/favicons-4.8.6.tgz", + "integrity": "sha1-orE4AKs/7CcVvI8n+oQdA41HYeI=", + "dev": true, + "requires": { + "async": "^1.5.0", + "cheerio": "^0.19.0", + "clone": "^1.0.2", + "colors": "^1.1.2", + "harmony-reflect": "^1.4.2", + "image-size": "^0.4.0", + "jimp": "^0.2.13", + "jsontoxml": "0.0.11", + "merge-defaults": "^0.2.1", + "mkdirp": "^0.5.1", + "node-rest-client": "^1.5.1", + "require-directory": "^2.1.1", + "svg2png": "~3.0.1", + "through2": "^2.0.0", + "tinycolor2": "^1.1.2", + "to-ico": "^1.1.2", + "underscore": "^1.8.3", + "vinyl": "^1.1.0" + } + }, + "favicons-webpack-plugin": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-0.0.9.tgz", + "integrity": "sha1-32PoDFVrgE5JJeyOBb7jY5FXPck=", + "dev": true, + "requires": { + "favicons": "^4.8.3", + "loader-utils": "^0.2.14", + "lodash": "^4.11.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-saver": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", + "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "dev": true, + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "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 + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.5.tgz", + "integrity": "sha512-GHjtHDlY/ehslqv0Gr5N0PUJppgg/q0rOBvX0na1s7y1A3LWxPqCYU76s3Z1bM4+UZB4QF0usaXLT5wFpof5PA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.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=", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "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", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true, + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true, + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "optional": 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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true, + "optional": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "optional": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "optional": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "dependencies": { + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "gonzales-pe": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", + "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", + "dev": true, + "requires": { + "minimist": "1.1.x" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "harmony-reflect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.0.tgz", + "integrity": "sha512-0kZ1XcoelFOLEjEtvWAZyq/1S55eDSieWEJwme311MNVNcRpvjlr2zA66kBV6WAB8C1XI1p1cXCnFPqd1BxlPg==", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", + "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz", + "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==", + "dev": true, + "requires": { + "commander": "~2.16.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "dev": true + } + } + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + } + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + } + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "ignore-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", + "integrity": "sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.4.0.tgz", + "integrity": "sha1-1LTh9hlS5MvBzqmmsMkV/stwdRA=", + "dev": true + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexeddbshim": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/indexeddbshim/-/indexeddbshim-3.8.0.tgz", + "integrity": "sha512-DnQii9KFogcj2U/ai805/k7OTCAksWCtXV3MpATNXG84L9/+Xou9mTIXmBCmQa1X2ZdXXS229c1NWmztSRwPWw==", + "requires": { + "babel-polyfill": "6.26.0", + "eventtargeter": "0.4.0", + "sync-promise": "git+https://github.com/brettz9/sync-promise.git#full-sync-missing-promise-features", + "typeson": "5.8.2", + "typeson-registry": "1.0.0-alpha.20", + "websql": "git+https://github.com/brettz9/node-websql.git#configurable-secure2" + }, + "dependencies": { + "sync-promise": { + "version": "git+https://github.com/brettz9/sync-promise.git#25845a49a00aa2d2c985a5149b97c86a1fcdc75a", + "from": "git+https://github.com/brettz9/sync-promise.git#full-sync-missing-promise-features" + }, + "websql": { + "version": "git+https://github.com/brettz9/node-websql.git#5149bc0763376ca757fc32dc74345ada0467bfbb", + "from": "git+https://github.com/brettz9/node-websql.git#configurable-secure2", + "requires": { + "argsarray": "^0.0.1", + "immediate": "^3.2.2", + "noop-fn": "^1.0.0", + "sqlite3": "^4.0.0", + "tiny-queue": "^0.2.1" + } + } + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "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 + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + }, + "dependencies": { + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-alphabetical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", + "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", + "dev": true, + "requires": { + "ci-info": "^1.3.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-decimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "dev": true + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "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" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-word-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", + "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.5.0.tgz", + "integrity": "sha512-+X3Fk4rD8dTnHoIxHJymZthbtYllvSOnXAApQltvyLkHsv+fqyC/SZptUJDbXkFsqZJyyIXMySkdzerz3fv4oQ==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "chalk": { + "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", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.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 + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "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 + }, + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + }, + "dependencies": { + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + } + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + } + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + } + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + } + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-raw-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jest-raw-loader/-/jest-raw-loader-1.0.1.tgz", + "integrity": "sha1-zp9W1UZQ8VfEp9FtIkul1hO81iY=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-serializer-vue": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-0.3.0.tgz", + "integrity": "sha512-Id1x3XabYu2r6BnmTfGk2tY172BEqR+vAzSvPk4VF8HyVqwebxZQbqiZ/giAtCnRSqi6lzxuyvzQbwQ6bo6Hbg==", + "dev": true, + "requires": { + "pretty": "2.0.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "chalk": { + "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", + "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 + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "dev": true, + "requires": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + } + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", + "dev": true + }, + "js-base64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", + "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", + "dev": true + }, + "js-beautify": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz", + "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==", + "dev": true, + "requires": { + "config-chain": "~1.1.5", + "editorconfig": "^0.13.2", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" + } + }, + "js-md5": { + "version": "0.7.3", + "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz", + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==", + "dev": true + }, + "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 + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "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", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "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", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsontoxml": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-0.0.11.tgz", + "integrity": "sha1-Nzq1sgcL43N6X7PjL9G3uBhwyqQ=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "katex": { + "version": "0.16.2", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.2.tgz", + "integrity": "sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==", + "requires": { + "commander": "^8.0.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "khroma": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.3.0.tgz", + "integrity": "sha512-fpi0vIulP3FrM3BQOsEs+0ujWUNrg/YyHtEAcnvPxIHbASHNXEKEsDHtU2mADnJss7KvEdz7z2pUCQAEfFaFbA==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kleur": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.1.tgz", + "integrity": "sha512-Zq/jyANIJ2uX8UZjWlqLwbyhcxSXJtT/Y89lClyeZd3l++3ztL1I5SSCYrbcbwSunTjC88N3WuMk0kRDQD6gzA==", + "dev": true + }, + "known-css-properties": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz", + "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "linkify-it": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", + "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-bmfont": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.3.1.tgz", + "integrity": "sha512-lQkEawgez06lM2iw1vQEEOtVLJXyMzFcUqbwWMrB0g6zwhdUs/+e0KNd1zEJ7OFBbMVz0tbzQyjgjtTB47+PBg==", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "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 + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "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=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "longest-streak": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "macaddress": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.9.tgz", + "integrity": "sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w==", + "dev": true + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", + "dev": true + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g=" + }, + "markdown-it-deflist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.0.3.tgz", + "integrity": "sha512-/BNZ8ksW42bflm1qQLnRI09oqU2847Z7MVavrR0MORyKLtiUYOMpwtlAfMSZAQU9UCvaUZMpgVAqoS3vpToJxw==" + }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=" + }, + "markdown-it-footnote": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.1.tgz", + "integrity": "sha1-fzcwdHysyG4v4L+KF6cQ80eRUXo=" + }, + "markdown-it-imsize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz", + "integrity": "sha1-zKBCeQXQUziiR8ucqdloxc3dUXA=" + }, + "markdown-it-mark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-2.0.0.tgz", + "integrity": "sha1-RqGqlHEFrtgYiXjgoBYXnkBPQsc=" + }, + "markdown-it-pandoc-renderer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-it-pandoc-renderer/-/markdown-it-pandoc-renderer-1.1.3.tgz", + "integrity": "sha1-d/GltIjFRgqx4dy8/MB9EmdPejo=" + }, + "markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha1-N1/WAm6ufdywEkl/ZBEZXqHjr+g=" + }, + "markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=" + }, + "markdown-table": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", + "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "dev": true + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", + "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "mdast-util-compact": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", + "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "dev": true, + "requires": { + "unist-util-modify-children": "^1.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^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==", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-defaults": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/merge-defaults/-/merge-defaults-0.2.1.tgz", + "integrity": "sha1-3UIkjrlrtqUVIXJDIccv+Vg93oA=", + "dev": true, + "requires": { + "lodash": "~2.4.1" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "mermaid": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.9.2.tgz", + "integrity": "sha512-XWEaraDRDlHZexdeHSSr/MH4VJAOksRSPudchi69ecZJ7IUjjlzHsg32n4ZwJUh6lFO+NMYLHwHNNYUyxIjGPg==", + "requires": { + "@braintree/sanitize-url": "^3.1.0", + "d3": "^5.7.0", + "dagre": "^0.8.4", + "dagre-d3": "^0.6.4", + "entity-decode": "^2.0.2", + "graphlib": "^2.1.7", + "he": "^1.2.0", + "khroma": "^1.1.0", + "minify": "^4.1.1", + "moment-mini": "^2.22.1", + "stylis": "^3.5.2" + }, + "dependencies": { + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "midi": { + "version": "git+https://github.com/paulrosen/MIDI.js.git#e593ffef81a0350f99448e3ab8111957145ff6b2", + "from": "git+https://github.com/paulrosen/MIDI.js.git#abcjs" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "~1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minify": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/minify/-/minify-4.1.3.tgz", + "integrity": "sha512-ykuscavxivSmVpcCzsXmsVTukWYLUUtPhHj0w2ILvHDGqC+hsuTCihBn9+PJBd58JNvWTNg9132J9nrrI2anzA==", + "requires": { + "clean-css": "^4.1.6", + "css-b64-images": "~0.2.5", + "debug": "^4.1.0", + "html-minifier": "^4.0.0", + "terser": "^4.0.0", + "try-catch": "^2.0.0", + "try-to-catch": "^1.0.2" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "uglify-js": { + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.3.tgz", + "integrity": "sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig==" + } + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "minipass": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", + "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", + "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "mousetrap": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.1.tgz", + "integrity": "sha1-KghfXHUSlMdefoH27CVFspy/Qtk=" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.2.tgz", + "integrity": "sha512-mW7W8dKuVYefCpNzE3Z7xUmPI9wSrSL/1qH31YGMxmSOAnjatS3S9Zv3cmiHrhx3Jkp1SrWWBdOFXjfF48Uq3A==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + } + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-cache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz", + "integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==", + "dev": true, + "requires": { + "clone": "2.x", + "lodash": "4.x" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + } + } + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", + "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-rest-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/node-rest-client/-/node-rest-client-1.8.0.tgz", + "integrity": "sha1-jTxWa4F+JzlMtyc3g6Qcrv4+WVU=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "xml2js": ">=0.2.4" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true + } + } + }, + "noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha1-XzPUfxPSFQ35PgywNmmemC94/78=" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-scss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/normalize-scss/-/normalize-scss-7.0.1.tgz", + "integrity": "sha512-qj16bWnYs+9/ac29IgGjySg4R5qQTp1lXfm7ApFOZNVBYFY8RZ3f8+XQNDDLHeDtI3Ba7Jj4+LuPgz9v/fne2A==" + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-bump": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/npm-bump/-/npm-bump-0.0.23.tgz", + "integrity": "sha512-MeuiKsRgtND54G87WcUvt72drsnj2yr2XRalAWqm9A1KUaGVyOBhsbr0kYL65lQ35UugcYdvvRGpQoNR1h3zqQ==", + "dev": true, + "requires": { + "inquirer": "^3.2.2", + "semver": "^5.4.1", + "shell-quote": "^1.6.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "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==", + "dev": true, + "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=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "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", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==" + }, + "npm-packlist": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", + "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^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", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.8.tgz", + "integrity": "sha512-7RZ+qbFGiVc6v14Y8DSZjPN1wZPOaMbiiP4tzf5eNuyOITAeOIA3cMhjuKUypVIqBgCSg1KaSyAv8Ocq/0ZJ1A==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "offline-plugin": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/offline-plugin/-/offline-plugin-5.0.5.tgz", + "integrity": "sha1-6bFsVp0ZiZr5ySP1vCYHBVeP/ro=", + "dev": true, + "requires": { + "deep-extend": "^0.5.1", + "ejs": "^2.3.4", + "loader-utils": "0.2.x", + "minimatch": "^3.0.3", + "slash": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-1.3.2.tgz", + "integrity": "sha1-6ydFbiHu+9gIDzHoNoxZaE5YWiw=", + "dev": true, + "requires": { + "cssnano": "^3.4.0", + "underscore": "^1.8.3", + "webpack-sources": "^0.1.0" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.5.3" + } + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "ora": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", + "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.0", + "log-symbols": "^1.0.2" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", + "dev": true + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", + "dev": true + }, + "parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dev": true, + "requires": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "parse-entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", + "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "dev": true, + "requires": { + "for-each": "^0.3.2", + "trim": "0.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse-png": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", + "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", + "dev": true, + "requires": { + "pngjs": "^3.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/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", + "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", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "requires": { + "pngjs": "^3.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pngjs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", + "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "uniqid": "^4.0.0" + } + }, + "postcss-html": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.33.0.tgz", + "integrity": "sha512-3keDoRG0o8bJZKe/QzkOPUD3GQQvAmYhIAtsGrgTxIXB6xZnSQq3gwPjCEd2IAUtz9/Fkus70XGm6xJEZ+bAmg==", + "dev": true, + "requires": { + "htmlparser2": "^3.9.2" + } + }, + "postcss-jsx": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.33.0.tgz", + "integrity": "sha512-+ZH4FyxQel2O5uYkNKBnDdW2jCwIb5HwwyFsKuEI164Vmq9Wm07nT2lj65P1qDSRXP2Ik05DrSHzY8Hmt5VP4A==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0-rc.1", + "postcss-styled": ">=0.33.0" + } + }, + "postcss-less": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-2.0.0.tgz", + "integrity": "sha512-pPNsVnpCB13nBMOcl5GVh8JGmB0JGFjqkLUDzKdVpptFFKEe9wFdEzvh2j4lD2AD+7qcrUfw9Ta+oi5+Fw7jjQ==", + "dev": true, + "requires": { + "postcss": "^5.2.16" + } + }, + "postcss-markdown": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.33.0.tgz", + "integrity": "sha512-JZtetO15t5nNpymHDbRhuiOF8yJm1btrbUBP3iL39yLTiY8oChCsnCKfQjEuHB9+85fku5MoU/bRgQ8K45klMg==", + "dev": true, + "requires": { + "remark": "^9.0.0", + "unist-util-find-all-after": "^1.0.2" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-reporter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "postcss": "^6.0.8" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz", + "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-sass": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.2.tgz", + "integrity": "sha512-0HgxikiZ07VKYr98KT+k7/rAzyMgZlP+3+R8vUti56T2dPdhW0OhPGDQzddxY/N2iDtBVZQqCHRDA09j5I6EWg==", + "dev": true, + "requires": { + "gonzales-pe": "4.2.3", + "postcss": "6.0.22" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-scss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz", + "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz", + "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-styled": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/postcss-styled/-/postcss-styled-0.33.0.tgz", + "integrity": "sha512-ybKIBKYY6q0hADQUECW2F4fDybDFIiAfpMf06/2maxU0yp0FvMTeABrDjzSmKu+99Nj2Gsxe80Xn56FbhzIZZQ==", + "dev": true + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "postcss-syntax": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.33.0.tgz", + "integrity": "sha512-A9ABlaRy7KWUfG5E39GVTUoc5TXNuNTts5GzwDLwnSaVG151CSLCTcr51/m8cHi4KXcYa+5ImLyeSfBOhEYtGw==", + "dev": true + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", + "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", + "dev": true + }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + } + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "prismjs": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.9.0.tgz", + "integrity": "sha1-+j4tntw8OIfB8fMJXUHx+bQgDw8=", + "requires": { + "clipboard": "^1.7.1" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "realpath-native": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.1.tgz", + "integrity": "sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", + "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", + "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", + "dev": true, + "requires": { + "remark-parse": "^5.0.0", + "remark-stringify": "^5.0.0", + "unified": "^6.0.0" + } + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", + "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "dependencies": { + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + } + } + }, + "replace-in-file": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-4.1.0.tgz", + "integrity": "sha512-5IANGPAQZVO9PHEjaRz3EHs7eQulv1cvOu2hRi7+Ern+zXIzdslSGX9MIfcI1anaGCpICK2l4R4YOOdThsFryQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "glob": "^7.1.3", + "yargs": "^13.2.2" + }, + "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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "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" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "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 + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.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==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "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" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "requires": { + "mime-db": "~1.35.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-img": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", + "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", + "dev": true, + "requires": { + "bmp-js": "0.0.1", + "file-type": "^3.8.0", + "get-stream": "^2.0.0", + "jimp": "^0.2.21", + "jpeg-js": "^0.1.1", + "parse-png": "^1.1.1" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", + "dev": true + }, + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", + "dev": true + } + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": false, + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": false, + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": false, + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": false, + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": false, + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": false, + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "resolved": false, + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": false, + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "resolved": false, + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "resolved": false, + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "resolved": false, + "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": false, + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "resolved": false, + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "resolved": false, + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "resolved": false, + "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": 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.6.2", + "resolved": false, + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": false, + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": false, + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "resolved": false, + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "resolved": false, + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": false, + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "resolved": false, + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true, + "optional": true + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + } + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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==", + "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 + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.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==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "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" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "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": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "sass-loader": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", + "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^6.3.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "dependencies": { + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "specificity": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.0.tgz", + "integrity": "sha512-nGUlURFuoSsmJQ2TBKaO2l7+dBHtRnofSSQdiFKEpd+HBDWXR9/+gtJfgNpe3Nh6o5mqSxDpin/M4YoN7AijGg==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sqlite3": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.9.tgz", + "integrity": "sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "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==", + "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" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", + "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "state-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", + "dev": true + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "dev": true, + "requires": { + "stream-to": "~0.2.0" + } + }, + "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=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^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=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-replace-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-2.1.1.tgz", + "integrity": "sha512-0Nvw1LDclF45AFNuYPcD2Jvkv0mwb/dQSnJZMvhqGrT+zzmrpG3OJFD600qfQfNUd5aqfp7fCm2mQMfF7zLbyQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylelint": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.5.0.tgz", + "integrity": "sha512-63R/DGDjMekFwS4xaHSLy26N19pT1Jsxj7u5QNcJrUWBvvPoBCYx3ObINRgsvNMoupzhV7N0PjylxrDHyh4cKQ==", + "dev": true, + "requires": { + "autoprefixer": "^9.0.0", + "balanced-match": "^1.0.0", + "chalk": "^2.4.1", + "cosmiconfig": "^5.0.0", + "debug": "^3.0.0", + "execall": "^1.0.0", + "file-entry-cache": "^2.0.0", + "get-stdin": "^6.0.0", + "globby": "^8.0.0", + "globjoin": "^0.1.4", + "html-tags": "^2.0.0", + "ignore": "^4.0.0", + "import-lazy": "^3.1.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.6.0", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "mathml-tag-names": "^2.0.1", + "meow": "^5.0.0", + "micromatch": "^2.3.11", + "normalize-selector": "^0.2.0", + "pify": "^4.0.0", + "postcss": "^7.0.0", + "postcss-html": "^0.33.0", + "postcss-jsx": "^0.33.0", + "postcss-less": "^2.0.0", + "postcss-markdown": "^0.33.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-reporter": "^5.0.0", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.0", + "postcss-sass": "^0.3.0", + "postcss-scss": "^2.0.0", + "postcss-selector-parser": "^3.1.0", + "postcss-styled": "^0.33.0", + "postcss-syntax": "^0.33.0", + "postcss-value-parser": "^3.3.0", + "resolve-from": "^4.0.0", + "signal-exit": "^3.0.2", + "specificity": "^0.4.0", + "string-width": "^2.1.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^4.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "autoprefixer": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.2.tgz", + "integrity": "sha512-deo8jkqEIQALuN4OMbVPmtH8BUTRUW2PtINom/ZZBX6MvDUPcFaxTVB2USkWyeLlfd9garISbhjGN5WDHgRH2w==", + "dev": true, + "requires": { + "browserslist": "^4.0.2", + "caniuse-lite": "^1.0.30000877", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.2", + "postcss-value-parser": "^3.2.3" + } + }, + "browserslist": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.0.2.tgz", + "integrity": "sha512-lpujC4zv1trcKUUwfD4pFVNga4YSpB3sLB+/I+A8gvGQxno1c0dMB2aCQy0FE5oUNIDjD9puFiFF0zeS6Ji48w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000876", + "electron-to-chromium": "^1.3.57", + "node-releases": "^1.0.0-alpha.11" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000877", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000877.tgz", + "integrity": "sha512-h04kV/lcuhItU1CZTJOxUEk/9R+1XeJqgc67E+XC8J9TjPM8kzVgOn27ZtRdDUo8O5F8U4QRCzDWJrVym3w3Cg==", + "dev": true + }, + "chalk": { + "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", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.58", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.58.tgz", + "integrity": "sha512-AGJxlBEn2wOohxqWZkISVsOjZueKTQljfEODTDSEiMqSpH0S+xzV+/5oEM9AGaqhu7DzrpKOgU7ocQRjj0nJmg==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.0.tgz", + "integrity": "sha512-zrSP/KDf9DH3K3VePONoCstgPiYJy9z0SCatZuTpOc7YdnWIqwkWdXOuwlr4uDc7em8QZRsFWsT/685x5InjYg==", + "dev": true + }, + "postcss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz", + "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "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" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "stylelint-config-standard": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-16.0.0.tgz", + "integrity": "sha1-u3OHv/HX3XGGpSs+v4hbJAXWkb8=", + "dev": true + }, + "stylelint-processor-html": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stylelint-processor-html/-/stylelint-processor-html-1.0.0.tgz", + "integrity": "sha1-aJK2soVaRfApHNhFGR1pCBMKKRg=", + "dev": true, + "requires": { + "htmlparser2": "^3.9.1" + } + }, + "stylelint-webpack-plugin": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-0.10.5.tgz", + "integrity": "sha512-jtYx3aJ2qDMvBMswe5NRPTO7kJgAKafc6GilAkWDp/ewoAmnoxA6TsYMnIPtLECRLwXevaCPvlh2JEUMGZCoUQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "ramda": "^0.25.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + } + } + }, + "stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "postcss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz", + "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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" + } + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svg2png": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg2png/-/svg2png-3.0.1.tgz", + "integrity": "sha1-omRNaLAjGsAK9DGqFjcU/xcQZEc=", + "dev": true, + "requires": { + "phantomjs-prebuilt": "^2.1.10", + "pn": "^1.0.0", + "yargs": "^3.31.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-emitter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" + }, + "tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "dependencies": { + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "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-ico": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", + "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "buffer-alloc": "^1.1.0", + "image-size": "^0.5.0", + "parse-png": "^1.0.0", + "resize-img": "^1.1.0" + }, + "dependencies": { + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true + } + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", + "dev": true + }, + "trough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", + "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "try-catch": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/try-catch/-/try-catch-2.0.1.tgz", + "integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg==" + }, + "try-to-catch": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/try-to-catch/-/try-to-catch-1.1.1.tgz", + "integrity": "sha512-ikUlS+/BcImLhNYyIgZcEmq4byc31QpC+46/6Jm5ECWkVFhf8SM2Fp/0pMVXPX6vk45SMCwrP4Taxucne8I0VA==" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "turndown": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/turndown/-/turndown-7.1.1.tgz", + "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==", + "requires": { + "domino": "^2.1.6" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.15" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typeson": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typeson/-/typeson-5.8.2.tgz", + "integrity": "sha512-AFuyvVdHdkGlVIalOrSFjylmeLeWFtKu77uDjEilP4B9+Jk0DCM1m1A4Q2s3AwROhgiFFVPI8oARaD9S61lOkg==" + }, + "typeson-registry": { + "version": "1.0.0-alpha.20", + "resolved": "https://registry.npmjs.org/typeson-registry/-/typeson-registry-1.0.0-alpha.20.tgz", + "integrity": "sha512-Gj4ppRuwKWXilgz2Vc13Bn7UR97MpdiUVYinmMFJuS+B1TktUhMS5Gb4cGbyDjvXNiG6TvE5DHI2ip1qiGZiYA==", + "requires": { + "base64-arraybuffer-es6": "0.3.1", + "typeson": "5.8.2", + "uuid": "3.2.1", + "whatwg-url": "6.4.0" + }, + "dependencies": { + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + } + } + }, + "uc.micro": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + } + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "unherit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqid": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "requires": { + "macaddress": "^0.2.8" + } + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unist-util-find-all-after": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", + "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", + "dev": true, + "requires": { + "unist-util-is": "^2.0.0" + } + }, + "unist-util-is": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", + "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", + "dev": true + }, + "unist-util-modify-children": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", + "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", + "dev": true, + "requires": { + "array-iterate": "^1.0.0" + } + }, + "unist-util-remove-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", + "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "unist-util-visit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", + "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", + "dev": true, + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", + "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", + "dev": true, + "requires": { + "unist-util-is": "^2.1.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-loader": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.1.tgz", + "integrity": "sha512-vugEeXjyYFBCUOpX+ZuaunbK3QXMKaQ3zUnRfIpRBlGkY7QizCnzyyn2ASfcxsvyU3ef+CJppVywnl3Kgf13Gg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dev": true, + "requires": { + "ip-regex": "^1.0.1" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/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", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "dev": true, + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + } + } + }, + "vfile-location": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.3.tgz", + "integrity": "sha512-zM5/l4lfw1CBoPx3Jimxoc5RNDAHHpk6AM6LM0pTIkm5SUSsx8ZekZ0PVdf0WEZ7kjlhSt7ZlqbRL6Cd6dBs6A==", + "dev": true + }, + "vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-vSGCkhNvJzO6VcWC6AlJW4NtYOVtS+RgCaqFIYUjoGIlHnFL+i0LbtYvonDWOMcB97uTPT4PRsyYY7REWC9vug==", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "vue": { + "version": "2.5.17", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.17.tgz", + "integrity": "sha512-mFbcWoDIJi0w0Za4emyLiW72Jae0yjANHbCVquMKijcavBGypqlF7zHRgMa5k4sesdv7hv2rB4JPdZfR+TPfhQ==" + }, + "vue-hot-reload-api": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz", + "integrity": "sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA==", + "dev": true + }, + "vue-jest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-1.4.0.tgz", + "integrity": "sha512-X5YXTXcpklijK3wXG/CiW8Frkz+YPBjR+//FD5rcmlnmEelz+8AQpKA8vhbAHJx3gOhA2tkWt8XEjvxq1S0heg==", + "dev": true, + "requires": { + "babel-core": "^6.25.0", + "babel-preset-vue-app": "^1.3.1", + "chalk": "^2.1.0", + "find-babel-config": "^1.1.0", + "js-beautify": "^1.6.14", + "node-cache": "^4.1.1", + "object-assign": "^4.1.1", + "source-map": "^0.5.6", + "tsconfig": "^7.0.0", + "vue-template-es2015-compiler": "^1.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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.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", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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" + } + } + } + }, + "vue-loader": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.4.0.tgz", + "integrity": "sha512-qhc1fnflEVhFq5dYLDXXTXf3PoRiGxeMhBmGDeLqlg0XAaikZEU224ZLqsTkQQVUT2uA2PN9haYlBUqq/6iEtA==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^2.0.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "vue-template-compiler": { + "version": "2.5.17", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz", + "integrity": "sha512-63uI4syCwtGR5IJvZM0LN5tVsahrelomHtCxvRkZPJ/Tf3ADm1U1wG6KWycK3qCfqR+ygM5vewUvmJ0REAYksg==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", + "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", + "dev": true + }, + "vuex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.0.1.tgz", + "integrity": "sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w==" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "^2.1.2", + "chokidar": "^1.7.0", + "graceful-fs": "^4.1.2" + } + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/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://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" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "ejs": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "dev": true + }, + "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" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + } + } + }, + "webpack-hot-middleware": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.21.0.tgz", + "integrity": "sha512-P6xiOLy10QlSVSO7GanU9PLxN6zLLQ7RG16MPTvmFwf2KUG7jMp6m+fmdgsR7xoaVVLA7OlX3YO6JjoZEKjCuA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "webpack-pwa-manifest": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/webpack-pwa-manifest/-/webpack-pwa-manifest-3.7.1.tgz", + "integrity": "sha512-G37fVCa1ndij3jyz6WaOaxHLHdp2URyOHwp2GLmxt39sXL8ZdOFM1qvHagEJBkNh+3hu25eIgy6TD5J/8sgQcQ==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "jimp": "^0.2.28", + "mime": "^1.6.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-encoding": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", + "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "dev": true, + "requires": { + "iconv-lite": "0.4.23" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "dev": true + }, + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.0", + "webidl-conversions": "^4.0.1" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "^1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "worker-loader": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-1.1.1.tgz", + "integrity": "sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "dev": true, + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", + "dev": true + }, + "xml2js": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", + "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "^4.1.0" + } + }, + "xmlbuilder": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "dev": true, + "requires": { + "lodash": "^4.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9075587 --- /dev/null +++ b/package.json @@ -0,0 +1,141 @@ +{ + "name": "stackedit", + "version": "5.15.21", + "description": "免费, 开源, 功能齐全的 Markdown 编辑器", + "author": "Benoit Schweblin, 豆萁", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/mafgwo/stackedit/issues" + }, + "main": "index.js", + "scripts": { + "postinstall": "gulp build-prism", + "start": "node build/dev-server.js", + "build": "node build/build.js && npm run build-style", + "build-style": "webpack --config build/webpack.style.conf.js", + "lint": "eslint --ext .js,.vue src server", + "unit": "jest --config test/unit/jest.conf.js --runInBand", + "unit-with-coverage": "jest --config test/unit/jest.conf.js --runInBand --coverage", + "test": "npm run lint && npm run unit", + "preversion": "npm run test", + "postversion": "git push origin master --tags && npm publish", + "patch": "npm version patch -m \"Tag v%s\"", + "minor": "npm version minor -m \"Tag v%s\"", + "major": "npm version major -m \"Tag v%s\"", + "chart": "mkdir -p dist && rm -rf dist/stackedit && cp -r chart dist/stackedit && sed -i.bak -e s/STACKEDIT_VERSION/$npm_package_version/g dist/stackedit/*.yaml && rm dist/stackedit/*.yaml.bak" + }, + "dependencies": { + "@vue/test-utils": "^1.0.0-beta.16", + "abcjs": "^5.2.0", + "babel-runtime": "^6.26.0", + "bezier-easing": "^1.1.0", + "body-parser": "^1.18.2", + "clipboard": "^1.7.1", + "compression": "^1.7.0", + "diff-match-patch": "^1.0.0", + "file-saver": "^1.3.8", + "handlebars": "^4.0.10", + "indexeddbshim": "^3.6.2", + "js-yaml": "^3.11.0", + "katex": "^0.16.2", + "markdown-it": "^8.4.1", + "markdown-it-abbr": "^1.0.4", + "markdown-it-deflist": "^2.0.2", + "markdown-it-emoji": "^1.3.0", + "markdown-it-footnote": "^3.0.1", + "markdown-it-imsize": "^2.0.1", + "markdown-it-mark": "^2.0.0", + "markdown-it-pandoc-renderer": "1.1.3", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "mermaid": "^8.9.2", + "mousetrap": "^1.6.1", + "normalize-scss": "^7.0.1", + "prismjs": "^1.6.0", + "request": "^2.85.0", + "serve-static": "^1.13.2", + "tmp": "^0.0.33", + "turndown": "^7.1.1", + "vue": "^2.5.16", + "vuex": "^3.0.1" + }, + "devDependencies": { + "autoprefixer": "^6.7.2", + "babel-core": "^6.26.3", + "babel-eslint": "^8.2.3", + "babel-jest": "^21.0.2", + "babel-loader": "^7.1.4", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-polyfill": "^6.23.0", + "babel-preset-env": "^1.7.0", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^1.1.3", + "connect-history-api-fallback": "^1.3.0", + "copy-webpack-plugin": "^4.5.1", + "css-loader": "^0.28.11", + "eslint": "^4.19.1", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-import-resolver-webpack": "^0.9.0", + "eslint-loader": "^2.0.0", + "eslint-plugin-html": "^4.0.3", + "eslint-plugin-import": "^2.11.0", + "eventsource-polyfill": "^0.9.6", + "express": "^4.16.3", + "extract-text-webpack-plugin": "^2.0.0", + "favicons-webpack-plugin": "^0.0.9", + "file-loader": "^1.1.11", + "friendly-errors-webpack-plugin": "^1.7.0", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "html-webpack-plugin": "^3.2.0", + "http-proxy-middleware": "^0.18.0", + "identity-obj-proxy": "^3.0.0", + "ignore-loader": "^0.1.2", + "jest": "^23.0.0", + "jest-raw-loader": "^1.0.1", + "jest-serializer-vue": "^0.3.0", + "js-md5": "^0.7.3", + "node-sass": "^4.0.0", + "npm-bump": "^0.0.23", + "offline-plugin": "^5.0.3", + "opn": "^4.0.2", + "optimize-css-assets-webpack-plugin": "^1.3.2", + "ora": "^1.2.0", + "raw-loader": "^0.5.1", + "replace-in-file": "^4.1.0", + "rimraf": "^2.6.0", + "sass-loader": "^7.0.1", + "semver": "^5.5.0", + "shelljs": "^0.8.1", + "string-replace-loader": "^2.1.1", + "stylelint": "^9.2.0", + "stylelint-config-standard": "^16.0.0", + "stylelint-processor-html": "^1.0.0", + "stylelint-webpack-plugin": "^0.10.4", + "url-loader": "^1.0.1", + "vue-jest": "^1.0.2", + "vue-loader": "^15.0.9", + "vue-style-loader": "^4.1.0", + "vue-template-compiler": "^2.5.16", + "webpack": "^2.6.1", + "webpack-bundle-analyzer": "^3.3.2", + "webpack-dev-middleware": "^1.10.0", + "webpack-hot-middleware": "^2.18.0", + "webpack-merge": "^4.1.2", + "webpack-pwa-manifest": "^3.7.1", + "worker-loader": "^1.1.1" + }, + "engines": { + "node": ">= 8.0.0", + "npm": ">= 5.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 10" + ] +} diff --git a/server/conf.js b/server/conf.js new file mode 100644 index 0000000..d9ef0c0 --- /dev/null +++ b/server/conf.js @@ -0,0 +1,54 @@ +const pandocPath = process.env.PANDOC_PATH || 'pandoc'; +const wkhtmltopdfPath = process.env.WKHTMLTOPDF_PATH || 'wkhtmltopdf'; +const paypalReceiverEmail = process.env.PAYPAL_RECEIVER_EMAIL; + +const dropboxAppKey = process.env.DROPBOX_APP_KEY; +const dropboxAppKeyFull = process.env.DROPBOX_APP_KEY_FULL; +const githubClientId = process.env.GITHUB_CLIENT_ID; +const githubClientSecret = process.env.GITHUB_CLIENT_SECRET; +const giteeClientId = process.env.GITEE_CLIENT_ID; +const giteeClientSecret = process.env.GITEE_CLIENT_SECRET; +const googleClientId = process.env.GOOGLE_CLIENT_ID; +const googleApiKey = process.env.GOOGLE_API_KEY; +const wordpressClientId = process.env.WORDPRESS_CLIENT_ID; +const giteaClientId = process.env.GITEA_CLIENT_ID; +const giteaClientSecret = process.env.GITEA_CLIENT_SECRET; +const giteaUrl = process.env.GITEA_URL; +const gitlabClientId = process.env.GITLAB_CLIENT_ID; +const gitlabClientSecret = process.env.GITLAB_CLIENT_SECRET; +const gitlabUrl = process.env.GITLAB_URL; + +exports.values = { + pandocPath, + wkhtmltopdfPath, + paypalReceiverEmail, + dropboxAppKey, + dropboxAppKeyFull, + githubClientId, + githubClientSecret, + giteeClientId, + giteeClientSecret, + googleClientId, + googleApiKey, + wordpressClientId, + giteaClientId, + giteaClientSecret, + giteaUrl, + gitlabClientId, + gitlabClientSecret, + gitlabUrl, +}; + +exports.publicValues = { + dropboxAppKey, + dropboxAppKeyFull, + githubClientId, + googleClientId, + googleApiKey, + wordpressClientId, + allowSponsorship: !!paypalReceiverEmail, + giteaClientId, + giteaUrl, + gitlabClientId, + gitlabUrl, +}; diff --git a/server/gitea.js b/server/gitea.js new file mode 100644 index 0000000..1fd0d25 --- /dev/null +++ b/server/gitea.js @@ -0,0 +1,40 @@ +const request = require('request'); +const conf = require('./conf'); + +function giteaToken(queryParam) { + return new Promise((resolve, reject) => { + request({ + method: 'POST', + url: `${conf.values.giteaUrl}/login/oauth/access_token`, + headers: { + 'content-type': 'application/json', + }, + json: true, + body: { + ...queryParam, + client_id: conf.values.giteaClientId, + client_secret: conf.values.giteaClientSecret, + }, + }, (err, res, body) => { + if (err) { + reject(err); + } + const token = body.access_token; + if (token) { + resolve(body); + } else { + reject(res.statusCode + ',body:' + JSON.stringify(body)); + } + }); + }); +} + +exports.giteaToken = (req, res) => { + giteaToken(req.query) + .then( + tokenBody => res.send(tokenBody), + err => res + .status(400) + .send(err ? err.message || err.toString() : 'bad_code'), + ); +}; diff --git a/server/gitee.js b/server/gitee.js new file mode 100644 index 0000000..8f5c6fd --- /dev/null +++ b/server/gitee.js @@ -0,0 +1,42 @@ +const qs = require('qs'); // eslint-disable-line import/no-extraneous-dependencies +const request = require('request'); +const conf = require('./conf'); + +function giteeToken(clientId, code, oauth2RedirectUri) { + const clientIndex = conf.values.giteeClientId.split(',').indexOf(clientId); + const clientSecret = conf.values.giteeClientSecret.split(',')[clientIndex]; + return new Promise((resolve, reject) => { + request({ + method: 'POST', + url: 'https://gitee.com/oauth/token', + form: { + client_id: clientId, + client_secret: clientSecret, + code, + grant_type: 'authorization_code', + redirect_uri: oauth2RedirectUri, + }, + json: true + }, (err, res, body) => { + if (err) { + reject(err); + } + const token = body.access_token; + if (token) { + resolve(body); + } else { + reject(res.statusCode + ',body:' + JSON.stringify(body)); + } + }); + }); +} + +exports.giteeToken = (req, res) => { + giteeToken(req.query.clientId, req.query.code, req.query.oauth2RedirectUri) + .then( + tokenBody => res.send(tokenBody), + err => res + .status(400) + .send(err ? err.message || err.toString() : 'bad_code'), + ); +}; diff --git a/server/github.js b/server/github.js new file mode 100644 index 0000000..83aff9e --- /dev/null +++ b/server/github.js @@ -0,0 +1,37 @@ +const qs = require('qs'); // eslint-disable-line import/no-extraneous-dependencies +const request = require('request'); +const conf = require('./conf'); + +function githubToken(clientId, code) { + return new Promise((resolve, reject) => { + request({ + method: 'POST', + url: 'https://github.com/login/oauth/access_token', + qs: { + client_id: clientId, + client_secret: conf.values.githubClientSecret, + code, + }, + }, (err, res, body) => { + if (err) { + reject(err); + } + const token = qs.parse(body).access_token; + if (token) { + resolve(token); + } else { + reject(res.statusCode); + } + }); + }); +} + +exports.githubToken = (req, res) => { + githubToken(req.query.clientId, req.query.code) + .then( + token => res.send(token), + err => res + .status(400) + .send(err ? err.message || err.toString() : 'bad_code'), + ); +}; diff --git a/server/gitlab.js b/server/gitlab.js new file mode 100644 index 0000000..170cde3 --- /dev/null +++ b/server/gitlab.js @@ -0,0 +1,40 @@ +const request = require('request'); +const conf = require('./conf'); + +function gitlabToken(queryParam) { + return new Promise((resolve, reject) => { + request({ + method: 'POST', + url: `${conf.values.gitlabUrl}/oauth/token`, + headers: { + 'content-type': 'application/json', + }, + json: true, + qs: { + ...queryParam, + client_id: conf.values.gitlabClientId, + client_secret: conf.values.gitlabClientSecret, + }, + }, (err, res, body) => { + if (err) { + reject(err); + } + const token = body.access_token; + if (token) { + resolve(body); + } else { + reject(res.statusCode + ',body:' + JSON.stringify(body)); + } + }); + }); +} + +exports.gitlabToken = (req, res) => { + gitlabToken(req.query) + .then( + tokenBody => res.send(tokenBody), + err => res + .status(400) + .send(err ? err.message || err.toString() : 'bad_code'), + ); +}; diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..2b60425 --- /dev/null +++ b/server/index.js @@ -0,0 +1,89 @@ +const compression = require('compression'); +const serveStatic = require('serve-static'); +const bodyParser = require('body-parser'); +const path = require('path'); +const github = require('./github'); +const gitee = require('./gitee'); +const gitea = require('./gitea'); +const gitlab = require('./gitlab'); +const pdf = require('./pdf'); +const pandoc = require('./pandoc'); +const conf = require('./conf'); + +const resolvePath = pathToResolve => path.join(__dirname, '..', pathToResolve); + +module.exports = (app) => { + if (process.env.NODE_ENV === 'production') { + // Enable CORS for fonts + app.all('*', (req, res, next) => { + if (/\.(eot|ttf|woff2?|svg)$/.test(req.url)) { + res.header('Access-Control-Allow-Origin', '*'); + } + next(); + }); + + // Use gzip compression + app.use(compression()); + } + + app.get('/oauth2/githubToken', github.githubToken); + app.get('/oauth2/giteeToken', gitee.giteeToken); + app.get('/oauth2/giteaToken', gitea.giteaToken); + app.get('/oauth2/gitlabToken', gitlab.gitlabToken); + app.get('/conf', (req, res) => res.send(conf.publicValues)); + app.post('/pdfExport', pdf.generate); + app.post('/pandocExport', pandoc.generate); + app.get('/giteeClientId', (req, res) => { + const giteeClientIds = conf.values.giteeClientId.split(','); + // 仅一个 则直接返回 + if (giteeClientIds.length === 1) { + res.send(giteeClientIds[0]); + return; + } + // 是否随机一个clientId 默认第一个 如果random 为1 则使用随机 避免单个应用接口次数用满无法自动切换其他应用 + const random = req.query.random; + if (!random) { + res.send(giteeClientIds[0]); + return; + } + // 随机一个 排除第一个 因为第一个应用接口次数用完了 + const clientId = giteeClientIds[Math.floor(((giteeClientIds.length - 1) * Math.random())) + 1]; + res.send(clientId); + }); + // Serve landing.html + app.get('/', (req, res) => res.sendFile(resolvePath('static/landing/index.html'))); + // Serve privacy_policy.html + app.get('/privacy_policy.html', (req, res) => res.sendFile(resolvePath('static/landing/privacy_policy.html'))); + // Serve sitemap.xml + app.get('/sitemap.xml', (req, res) => res.sendFile(resolvePath('static/sitemap.xml'))); + // Serve callback.html + app.get('/oauth2/callback', (req, res) => res.sendFile(resolvePath('static/oauth2/callback.html'))); + // Google Drive action receiver + app.get('/googleDriveAction', (req, res) => + res.redirect(`./app#providerId=googleDrive&state=${encodeURIComponent(req.query.state)}`)); + // Serve the static folder with 30 day max-age + app.use('/themes', serveStatic(resolvePath('static/themes'), { + maxAge: '5d', + })); + + // Serve style.css with 1 day max-age + app.get('/style.css', (req, res) => res.sendFile(resolvePath('dist/style.css'), { + maxAge: '1d', + })); + // Serve share.html + app.get('/share.html', (req, res) => res.sendFile(resolvePath('static/landing/share.html'))); + app.get('/gistshare.html', (req, res) => res.sendFile(resolvePath('static/landing/gistshare.html'))); + + // Serve static resources + if (process.env.NODE_ENV === 'production') { + // Serve index.html in /app + app.get('/app', (req, res) => res.sendFile(resolvePath('dist/index.html'))); + + // Serve the static folder with 1 year max-age + app.use('/static', serveStatic(resolvePath('dist/static'), { + maxAge: '1y', + })); + + app.use(serveStatic(resolvePath('dist'))); + } +}; diff --git a/server/pandoc.js b/server/pandoc.js new file mode 100644 index 0000000..cf93ac5 --- /dev/null +++ b/server/pandoc.js @@ -0,0 +1,141 @@ +/* global window */ +const { spawn } = require('child_process'); +const fs = require('fs'); +const tmp = require('tmp'); +const conf = require('./conf'); + +const outputFormats = { + asciidoc: 'text/plain', + context: 'application/x-latex', + epub: 'application/epub+zip', + epub3: 'application/epub+zip', + latex: 'application/x-latex', + odt: 'application/vnd.oasis.opendocument.text', + pdf: 'application/pdf', + rst: 'text/plain', + rtf: 'application/rtf', + textile: 'text/plain', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', +}; + +const highlightStyles = [ + 'pygments', + 'kate', + 'monochrome', + 'espresso', + 'zenburn', + 'haddock', + 'tango', +]; + +const readJson = (str) => { + try { + return JSON.parse(str); + } catch (e) { + return {}; + } +}; + +exports.generate = (req, res) => { + let pandocError = ''; + const outputFormat = Object.prototype.hasOwnProperty.call(outputFormats, req.query.format) + ? req.query.format + : 'pdf'; + new Promise((resolve, reject) => { + tmp.file({ + postfix: `.${outputFormat}`, + }, (err, filePath, fd, cleanupCallback) => { + if (err) { + reject(err); + } else { + resolve({ + filePath, + cleanupCallback, + }); + } + }); + }).then(({ filePath, cleanupCallback }) => new Promise((resolve, reject) => { + const options = readJson(req.query.options); + const metadata = readJson(req.query.metadata); + const params = []; + + params.push('--pdf-engine=xelatex'); + params.push('--webtex=http://chart.apis.google.com/chart?cht=tx&chf=bg,s,FFFFFF00&chco=000000&chl='); + if (options.toc) { + params.push('--toc'); + } + options.tocDepth = parseInt(options.tocDepth, 10); + if (!Number.isNaN(options.tocDepth)) { + params.push('--toc-depth', options.tocDepth); + } + options.highlightStyle = highlightStyles.includes(options.highlightStyle) ? options.highlightStyle : 'kate'; + params.push('--highlight-style', options.highlightStyle); + Object.keys(metadata).forEach((key) => { + params.push('-M', `${key}=${metadata[key]}`); + }); + + let finished = false; + + function onError(error) { + finished = true; + cleanupCallback(); + reject(error); + } + + const format = outputFormat === 'pdf' ? 'latex' : outputFormat; + params.push('-f', 'json', '-t', format, '-o', filePath); + const pandoc = spawn(conf.values.pandocPath, params, { + stdio: [ + 'pipe', + 'ignore', + 'pipe', + ], + }); + let timeoutId = setTimeout(() => { + timeoutId = null; + pandoc.kill(); + }, 50000); + pandoc.on('error', onError); + pandoc.stdin.on('error', onError); + pandoc.stderr.on('data', (data) => { + pandocError += `${data}`; + }); + pandoc.on('close', (code) => { + if (!finished) { + clearTimeout(timeoutId); + if (!timeoutId) { + res.statusCode = 408; + cleanupCallback(); + reject(new Error('timeout')); + } else if (code) { + cleanupCallback(); + reject(); + } else { + res.set('Content-Type', outputFormats[outputFormat]); + const readStream = fs.createReadStream(filePath); + readStream.on('open', () => readStream.pipe(res)); + readStream.on('close', () => cleanupCallback()); + readStream.on('error', () => { + cleanupCallback(); + reject(); + }); + } + } + }); + req.pipe(pandoc.stdin); + })) + .catch((err) => { + console.error(err); + const message = err && err.message; + if (message === 'unauthorized') { + res.statusCode = 401; + res.end('Unauthorized.'); + } else if (message === 'timeout') { + res.statusCode = 408; + res.end('Request timeout.'); + } else { + res.statusCode = 400; + res.end(pandocError || 'Unknown error.'); + } + }); +}; diff --git a/server/pdf.js b/server/pdf.js new file mode 100644 index 0000000..f898b8a --- /dev/null +++ b/server/pdf.js @@ -0,0 +1,178 @@ +/* global window,MathJax */ +const { spawn } = require('child_process'); +const fs = require('fs'); +const tmp = require('tmp'); +const conf = require('./conf'); + +/* eslint-disable no-var, prefer-arrow-callback, func-names */ +function waitForJavaScript() { + if (window.MathJax) { + // Amazon EC2: fix TeX font detection + MathJax.Hub.Register.StartupHook('HTML-CSS Jax Startup', function () { + var htmlCss = MathJax.OutputJax['HTML-CSS']; + htmlCss.Font.checkWebFont = function (check, font, callback) { + if (check.time(callback)) { + return; + } + if (check.total === 0) { + htmlCss.Font.testFont(font); + setTimeout(check, 200); + } else { + callback(check.STATUS.OK); + } + }; + }); + MathJax.Hub.Queue(function () { + window.status = 'done'; + }); + } else { + setTimeout(function () { + window.status = 'done'; + }, 2000); + } +} +/* eslint-disable no-var, prefer-arrow-callback, func-names */ + +const authorizedPageSizes = [ + 'A3', + 'A4', + 'Legal', + 'Letter', +]; + +const readJson = (str) => { + try { + return JSON.parse(str); + } catch (e) { + return {}; + } +}; + +exports.generate = (req, res) => { + let wkhtmltopdfError = ''; + new Promise((resolve, reject) => { + tmp.file((err, filePath, fd, cleanupCallback) => { + if (err) { + reject(err); + } else { + resolve({ + filePath, + cleanupCallback, + }); + } + }); + }).then(({ filePath, cleanupCallback }) => new Promise((resolve, reject) => { + let finished = false; + + function onError(err) { + finished = true; + cleanupCallback(); + reject(err); + } + const options = readJson(req.query.options); + const params = []; + + // Margins + const marginTop = parseInt(`${options.marginTop}`, 10); + params.push('-T', Number.isNaN(marginTop) ? 25 : marginTop); + const marginRight = parseInt(`${options.marginRight}`, 10); + params.push('-R', Number.isNaN(marginRight) ? 25 : marginRight); + const marginBottom = parseInt(`${options.marginBottom}`, 10); + params.push('-B', Number.isNaN(marginBottom) ? 25 : marginBottom); + const marginLeft = parseInt(`${options.marginLeft}`, 10); + params.push('-L', Number.isNaN(marginLeft) ? 25 : marginLeft); + + // Header + if (options.headerCenter) { + params.push('--header-center', `${options.headerCenter}`); + } + if (options.headerLeft) { + params.push('--header-left', `${options.headerLeft}`); + } + if (options.headerRight) { + params.push('--header-right', `${options.headerRight}`); + } + if (options.headerFontName) { + params.push('--header-font-name', `${options.headerFontName}`); + } + if (options.headerFontSize) { + params.push('--header-font-size', `${options.headerFontSize}`); + } + + // Footer + if (options.footerCenter) { + params.push('--footer-center', `${options.footerCenter}`); + } + if (options.footerLeft) { + params.push('--footer-left', `${options.footerLeft}`); + } + if (options.footerRight) { + params.push('--footer-right', `${options.footerRight}`); + } + if (options.footerFontName) { + params.push('--footer-font-name', `${options.footerFontName}`); + } + if (options.footerFontSize) { + params.push('--footer-font-size', `${options.footerFontSize}`); + } + + // Page size + params.push('--page-size', !authorizedPageSizes.includes(options.pageSize) ? 'A4' : options.pageSize); + + // Use a temp file as wkhtmltopdf can't access /dev/stdout on Amazon EC2 for some reason + params.push('--run-script', `${waitForJavaScript.toString()}waitForJavaScript()`); + params.push('--window-status', 'done'); + const wkhtmltopdf = spawn(conf.values.wkhtmltopdfPath, params.concat('-', filePath), { + stdio: [ + 'pipe', + 'ignore', + 'pipe', + ], + }); + let timeoutId = setTimeout(function () { + timeoutId = null; + wkhtmltopdf.kill(); + }, 50000); + wkhtmltopdf.on('error', onError); + wkhtmltopdf.stdin.on('error', onError); + wkhtmltopdf.stderr.on('data', (data) => { + wkhtmltopdfError += `${data}`; + }); + wkhtmltopdf.on('close', (code) => { + if (!finished) { + clearTimeout(timeoutId); + if (!timeoutId) { + cleanupCallback(); + reject(new Error('timeout')); + } else if (code) { + cleanupCallback(); + reject(); + } else { + res.set('Content-Type', 'application/pdf'); + const readStream = fs.createReadStream(filePath); + readStream.on('open', () => readStream.pipe(res)); + readStream.on('close', () => cleanupCallback()); + readStream.on('error', () => { + cleanupCallback(); + reject(); + }); + } + } + }); + req.pipe(wkhtmltopdf.stdin); + })) + .catch((err) => { + console.error(err); + const message = err && err.message; + if (message === 'unauthorized') { + res.statusCode = 401; + res.end('Unauthorized.'); + } else if (message === 'timeout') { + res.statusCode = 408; + res.end('Request timeout.'); + } else { + res.statusCode = 400; + res.end(wkhtmltopdfError || 'Unknown error.'); + } + }); +}; diff --git a/src/assets/favicon.png b/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8560f2ec783f9ac17bf8ac035b39f24504824a1e GIT binary patch literal 16169 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/RobotoMono-Bold.woff b/src/assets/fonts/RobotoMono-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..780aa1b58e412560f4da525327e0940886d87cff GIT binary patch literal 19572 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 Kg{>)u0000bN+$LI literal 0 HcmV?d00001 diff --git a/src/assets/fonts/RobotoMono-Regular.woff b/src/assets/fonts/RobotoMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..8cb9e6fd8840b38960ce4348be2652ce5f41bcef GIT binary patch literal 19592 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/lato-black-italic.woff b/src/assets/fonts/lato-black-italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..30f2c71ca39e0ff51f3faf5573fb8a9be1d37c0b GIT binary patch literal 310776 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
6SGB&`s?^wjl3J*{NNC7q)? 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

Pvly&nn5_hL6N6GZ*0g02-=}A{hdQ>&; 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

  • dUU%X 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 z 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/lato-normal-italic.woff b/src/assets/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..76114bc03362242c3325ecda6ce6d02bb737880f GIT binary patch literal 328412 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
    nFu#a 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
    ~vmDuVF{XkXzf`xie-nLH{rSW{@P0^x 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

    r$F7Gx0xC*xh*9#j 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%0Dhj+z*y0!!YJck=o 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 h;~B0xF~$CSJciZ`64hOEgkHUS6Cm`o_8oRkEN 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 z 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 literal 0 HcmV?d00001 diff --git a/src/assets/iconBlogger.svg b/src/assets/iconBlogger.svg new file mode 100644 index 0000000..3d7a03f --- /dev/null +++ b/src/assets/iconBlogger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/iconCouchdb.svg b/src/assets/iconCouchdb.svg new file mode 100644 index 0000000..5827634 --- /dev/null +++ b/src/assets/iconCouchdb.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/assets/iconCustom.svg b/src/assets/iconCustom.svg new file mode 100644 index 0000000..774ece8 --- /dev/null +++ b/src/assets/iconCustom.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/iconDropbox.svg b/src/assets/iconDropbox.svg new file mode 100644 index 0000000..480a0bc --- /dev/null +++ b/src/assets/iconDropbox.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/assets/iconGitea.svg b/src/assets/iconGitea.svg new file mode 100644 index 0000000..3aaeb85 --- /dev/null +++ b/src/assets/iconGitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/iconGitee.svg b/src/assets/iconGitee.svg new file mode 100644 index 0000000..816bb79 --- /dev/null +++ b/src/assets/iconGitee.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/assets/iconGithub.svg b/src/assets/iconGithub.svg new file mode 100644 index 0000000..1f6605a --- /dev/null +++ b/src/assets/iconGithub.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/iconGithubDark.svg b/src/assets/iconGithubDark.svg new file mode 100644 index 0000000..7e46f50 --- /dev/null +++ b/src/assets/iconGithubDark.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/iconGitlab.svg b/src/assets/iconGitlab.svg new file mode 100644 index 0000000..c87fa3b --- /dev/null +++ b/src/assets/iconGitlab.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/iconGoogle.svg b/src/assets/iconGoogle.svg new file mode 100644 index 0000000..956716d --- /dev/null +++ b/src/assets/iconGoogle.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/src/assets/iconGoogleDrive.svg b/src/assets/iconGoogleDrive.svg new file mode 100644 index 0000000..8593ea8 --- /dev/null +++ b/src/assets/iconGoogleDrive.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/assets/iconGooglePhotos.svg b/src/assets/iconGooglePhotos.svg new file mode 100644 index 0000000..ab6635d --- /dev/null +++ b/src/assets/iconGooglePhotos.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/src/assets/iconSmms.svg b/src/assets/iconSmms.svg new file mode 100644 index 0000000..f7c237d --- /dev/null +++ b/src/assets/iconSmms.svg @@ -0,0 +1,25 @@ + + \ No newline at end of file diff --git a/src/assets/iconStackedit.svg b/src/assets/iconStackedit.svg new file mode 100644 index 0000000..01baa7b --- /dev/null +++ b/src/assets/iconStackedit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/iconWordpress.svg b/src/assets/iconWordpress.svg new file mode 100644 index 0000000..1c24b9b --- /dev/null +++ b/src/assets/iconWordpress.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/assets/iconZendesk.svg b/src/assets/iconZendesk.svg new file mode 100644 index 0000000..7eec78a --- /dev/null +++ b/src/assets/iconZendesk.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..5611016 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/App.vue b/src/components/App.vue new file mode 100644 index 0000000..3b7795f --- /dev/null +++ b/src/components/App.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/ButtonBar.vue b/src/components/ButtonBar.vue new file mode 100644 index 0000000..b4ca7e8 --- /dev/null +++ b/src/components/ButtonBar.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/components/CodeEditor.vue b/src/components/CodeEditor.vue new file mode 100644 index 0000000..145e477 --- /dev/null +++ b/src/components/CodeEditor.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/ContextMenu.vue b/src/components/ContextMenu.vue new file mode 100644 index 0000000..236ca5d --- /dev/null +++ b/src/components/ContextMenu.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/Editor.vue b/src/components/Editor.vue new file mode 100644 index 0000000..6569c0a --- /dev/null +++ b/src/components/Editor.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/components/EditorInPageButtons.vue b/src/components/EditorInPageButtons.vue new file mode 100644 index 0000000..546d6c7 --- /dev/null +++ b/src/components/EditorInPageButtons.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/components/Explorer.vue b/src/components/Explorer.vue new file mode 100644 index 0000000..406b74a --- /dev/null +++ b/src/components/Explorer.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/src/components/ExplorerNode.vue b/src/components/ExplorerNode.vue new file mode 100644 index 0000000..abbcea1 --- /dev/null +++ b/src/components/ExplorerNode.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/components/FindReplace.vue b/src/components/FindReplace.vue new file mode 100644 index 0000000..cb5dba3 --- /dev/null +++ b/src/components/FindReplace.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/src/components/Layout.vue b/src/components/Layout.vue new file mode 100644 index 0000000..5db9eb3 --- /dev/null +++ b/src/components/Layout.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue new file mode 100644 index 0000000..6cd5288 --- /dev/null +++ b/src/components/Modal.vue @@ -0,0 +1,489 @@ + + + + + diff --git a/src/components/NavigationBar.vue b/src/components/NavigationBar.vue new file mode 100644 index 0000000..6688063 --- /dev/null +++ b/src/components/NavigationBar.vue @@ -0,0 +1,543 @@ + + + + + diff --git a/src/components/Notification.vue b/src/components/Notification.vue new file mode 100644 index 0000000..038af70 --- /dev/null +++ b/src/components/Notification.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Preview.vue b/src/components/Preview.vue new file mode 100644 index 0000000..c93f357 --- /dev/null +++ b/src/components/Preview.vue @@ -0,0 +1,181 @@ + + + + + + diff --git a/src/components/PreviewInPageButtons.vue b/src/components/PreviewInPageButtons.vue new file mode 100644 index 0000000..aaec6bd --- /dev/null +++ b/src/components/PreviewInPageButtons.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/components/SideBar.vue b/src/components/SideBar.vue new file mode 100644 index 0000000..052e337 --- /dev/null +++ b/src/components/SideBar.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/components/SplashScreen.vue b/src/components/SplashScreen.vue new file mode 100644 index 0000000..b1ecd09 --- /dev/null +++ b/src/components/SplashScreen.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/StatusBar.vue b/src/components/StatusBar.vue new file mode 100644 index 0000000..b3180ce --- /dev/null +++ b/src/components/StatusBar.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/components/Toc.vue b/src/components/Toc.vue new file mode 100644 index 0000000..8d0a324 --- /dev/null +++ b/src/components/Toc.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/components/Tour.vue b/src/components/Tour.vue new file mode 100644 index 0000000..5b4e11e --- /dev/null +++ b/src/components/Tour.vue @@ -0,0 +1,254 @@ + + + + + + diff --git a/src/components/UserImage.vue b/src/components/UserImage.vue new file mode 100644 index 0000000..a46340d --- /dev/null +++ b/src/components/UserImage.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/components/UserName.vue b/src/components/UserName.vue new file mode 100644 index 0000000..d30b505 --- /dev/null +++ b/src/components/UserName.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/common/DropdownMenu.vue b/src/components/common/DropdownMenu.vue new file mode 100644 index 0000000..09aeb70 --- /dev/null +++ b/src/components/common/DropdownMenu.vue @@ -0,0 +1,137 @@ + + + + + + \ No newline at end of file diff --git a/src/components/common/EditorClassApplier.js b/src/components/common/EditorClassApplier.js new file mode 100644 index 0000000..bc9bf9d --- /dev/null +++ b/src/components/common/EditorClassApplier.js @@ -0,0 +1,89 @@ +import cledit from '../../services/editor/cledit'; +import editorSvc from '../../services/editorSvc'; +import utils from '../../services/utils'; + +let savedSelection = null; +const nextTickCbs = []; +const nextTickExecCbs = cledit.Utils.debounce(() => { + while (nextTickCbs.length) { + nextTickCbs.shift()(); + } + if (savedSelection) { + editorSvc.clEditor.selectionMgr.setSelectionStartEnd( + savedSelection.start, + savedSelection.end, + ); + } + savedSelection = null; +}); + +const nextTick = (cb) => { + nextTickCbs.push(cb); + nextTickExecCbs(); +}; + +const nextTickRestoreSelection = () => { + savedSelection = { + start: editorSvc.clEditor.selectionMgr.selectionStart, + end: editorSvc.clEditor.selectionMgr.selectionEnd, + }; + nextTickExecCbs(); +}; + +export default class EditorClassApplier { + constructor(classGetter, offsetGetter, properties) { + this.classGetter = typeof classGetter === 'function' ? classGetter : () => classGetter; + this.offsetGetter = typeof offsetGetter === 'function' ? offsetGetter : () => offsetGetter; + this.properties = properties || {}; + this.eltCollection = editorSvc.editorElt.getElementsByClassName(this.classGetter()[0]); + this.lastEltCount = this.eltCollection.length; + + this.restoreClass = () => { + if (!this.eltCollection.length || this.eltCollection.length !== this.lastEltCount) { + this.removeClass(); + this.applyClass(); + } + }; + + editorSvc.clEditor.on('contentChanged', this.restoreClass); + nextTick(() => this.restoreClass()); + } + + applyClass() { + if (!this.stopped) { + const offset = this.offsetGetter(); + if (offset && offset.start !== offset.end) { + const range = editorSvc.clEditor.selectionMgr.createRange( + Math.min(offset.start, offset.end), + Math.max(offset.start, offset.end), + ); + const properties = { + ...this.properties, + className: this.classGetter().join(' '), + }; + editorSvc.clEditor.watcher.noWatch(() => { + utils.wrapRange(range, properties); + }); + if (editorSvc.clEditor.selectionMgr.hasFocus()) { + nextTickRestoreSelection(); + } + this.lastEltCount = this.eltCollection.length; + } + } + } + + removeClass() { + editorSvc.clEditor.watcher.noWatch(() => { + utils.unwrapRange(this.eltCollection); + }); + if (editorSvc.clEditor.selectionMgr.hasFocus()) { + nextTickRestoreSelection(); + } + } + + stop() { + editorSvc.clEditor.off('contentChanged', this.restoreClass); + nextTick(() => this.removeClass()); + this.stopped = true; + } +} diff --git a/src/components/common/PreviewClassApplier.js b/src/components/common/PreviewClassApplier.js new file mode 100644 index 0000000..58d9bd5 --- /dev/null +++ b/src/components/common/PreviewClassApplier.js @@ -0,0 +1,82 @@ +import cledit from '../../services/editor/cledit'; +import editorSvc from '../../services/editorSvc'; +import utils from '../../services/utils'; + +const nextTickCbs = []; +const nextTickExecCbs = cledit.Utils.debounce(() => { + while (nextTickCbs.length) { + nextTickCbs.shift()(); + } +}); + +const nextTick = (cb) => { + nextTickCbs.push(cb); + nextTickExecCbs(); +}; + +export default class PreviewClassApplier { + constructor(classGetter, offsetGetter, properties) { + this.classGetter = typeof classGetter === 'function' ? classGetter : () => classGetter; + this.offsetGetter = typeof offsetGetter === 'function' ? offsetGetter : () => offsetGetter; + this.properties = properties || {}; + this.eltCollection = editorSvc.previewElt.getElementsByClassName(this.classGetter()[0]); + this.lastEltCount = this.eltCollection.length; + + this.restoreClass = () => { + if (!editorSvc.previewCtxWithDiffs) { + this.removeClass(); + } else if (!this.eltCollection.length || this.eltCollection.length !== this.lastEltCount) { + this.removeClass(); + this.applyClass(); + } + }; + + editorSvc.$on('previewCtxWithDiffs', this.restoreClass); + nextTick(() => this.restoreClass()); + } + + applyClass() { + if (!this.stopped) { + const offset = this.offsetGetter(); + if (offset) { + const offsetStart = editorSvc.getPreviewOffset( + offset.start, + editorSvc.previewCtx.sectionDescList, + ); + const offsetEnd = editorSvc.getPreviewOffset( + offset.end, + editorSvc.previewCtx.sectionDescList, + ); + if (offsetStart != null && offsetEnd != null && offsetStart !== offsetEnd) { + const start = cledit.Utils.findContainer( + editorSvc.previewElt, + Math.min(offsetStart, offsetEnd), + ); + const end = cledit.Utils.findContainer( + editorSvc.previewElt, + Math.max(offsetStart, offsetEnd), + ); + const range = document.createRange(); + range.setStart(start.container, start.offsetInContainer); + range.setEnd(end.container, end.offsetInContainer); + const properties = { + ...this.properties, + className: this.classGetter().join(' '), + }; + utils.wrapRange(range, properties); + this.lastEltCount = this.eltCollection.length; + } + } + } + } + + removeClass() { + utils.unwrapRange(this.eltCollection); + } + + stop() { + editorSvc.$off('previewCtxWithDiffs', this.restoreClass); + nextTick(() => this.removeClass()); + this.stopped = true; + } +} diff --git a/src/components/common/vueGlobals.js b/src/components/common/vueGlobals.js new file mode 100644 index 0000000..d63c1ea --- /dev/null +++ b/src/components/common/vueGlobals.js @@ -0,0 +1,80 @@ +import Vue from 'vue'; +import Clipboard from 'clipboard'; +import timeSvc from '../../services/timeSvc'; +import store from '../../store'; + +// Global directives +Vue.directive('focus', { + inserted(el) { + el.focus(); + const { value } = el; + if (value && el.setSelectionRange) { + el.setSelectionRange(0, value.length); + } + }, +}); + +const setVisible = (el, value) => { + el.style.display = value ? '' : 'none'; + if (value) { + el.removeAttribute('aria-hidden'); + } else { + el.setAttribute('aria-hidden', 'true'); + } +}; +Vue.directive('show', { + bind(el, { value }) { + setVisible(el, value); + }, + update(el, { value, oldValue }) { + if (value !== oldValue) { + setVisible(el, value); + } + }, +}); + +const setElTitle = (el, title) => { + el.title = title; + el.setAttribute('aria-label', title); +}; +Vue.directive('title', { + bind(el, { value }) { + setElTitle(el, value); + }, + update(el, { value, oldValue }) { + if (value !== oldValue) { + setElTitle(el, value); + } + }, +}); + +// Clipboard directive +const createClipboard = (el, value) => { + el.seClipboard = new Clipboard(el, { text: () => value }); +}; +const destroyClipboard = (el) => { + if (el.seClipboard) { + el.seClipboard.destroy(); + el.seClipboard = null; + } +}; +Vue.directive('clipboard', { + bind(el, { value }) { + createClipboard(el, value); + }, + update(el, { value, oldValue }) { + if (value !== oldValue) { + destroyClipboard(el); + createClipboard(el, value); + } + }, + unbind(el) { + destroyClipboard(el); + }, +}); + +// Global filters +Vue.filter('formatTime', time => + // Access the time counter for reactive refresh + timeSvc.format(time, store.state.timeCounter)); + diff --git a/src/components/gutters/Comment.vue b/src/components/gutters/Comment.vue new file mode 100644 index 0000000..7941e5e --- /dev/null +++ b/src/components/gutters/Comment.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/components/gutters/CommentList.vue b/src/components/gutters/CommentList.vue new file mode 100644 index 0000000..5e33c9c --- /dev/null +++ b/src/components/gutters/CommentList.vue @@ -0,0 +1,362 @@ + + + + + diff --git a/src/components/gutters/CurrentDiscussion.vue b/src/components/gutters/CurrentDiscussion.vue new file mode 100644 index 0000000..494149a --- /dev/null +++ b/src/components/gutters/CurrentDiscussion.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/components/gutters/EditorNewDiscussionButton.vue b/src/components/gutters/EditorNewDiscussionButton.vue new file mode 100644 index 0000000..a9b7d8e --- /dev/null +++ b/src/components/gutters/EditorNewDiscussionButton.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/gutters/NewComment.vue b/src/components/gutters/NewComment.vue new file mode 100644 index 0000000..cd1db02 --- /dev/null +++ b/src/components/gutters/NewComment.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/components/gutters/PreviewNewDiscussionButton.vue b/src/components/gutters/PreviewNewDiscussionButton.vue new file mode 100644 index 0000000..ac51d42 --- /dev/null +++ b/src/components/gutters/PreviewNewDiscussionButton.vue @@ -0,0 +1,56 @@ + + + diff --git a/src/components/gutters/StickyComment.vue b/src/components/gutters/StickyComment.vue new file mode 100644 index 0000000..7988305 --- /dev/null +++ b/src/components/gutters/StickyComment.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/menus/EditThemeMenu.vue b/src/components/menus/EditThemeMenu.vue new file mode 100644 index 0000000..8291505 --- /dev/null +++ b/src/components/menus/EditThemeMenu.vue @@ -0,0 +1,116 @@ + + + + + + \ No newline at end of file diff --git a/src/components/menus/HistoryMenu.vue b/src/components/menus/HistoryMenu.vue new file mode 100644 index 0000000..90c13e9 --- /dev/null +++ b/src/components/menus/HistoryMenu.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/src/components/menus/ImportExportMenu.vue b/src/components/menus/ImportExportMenu.vue new file mode 100644 index 0000000..0e83a0e --- /dev/null +++ b/src/components/menus/ImportExportMenu.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/components/menus/MainMenu.vue b/src/components/menus/MainMenu.vue new file mode 100644 index 0000000..8fe5971 --- /dev/null +++ b/src/components/menus/MainMenu.vue @@ -0,0 +1,263 @@ + + + diff --git a/src/components/menus/PreviewThemeMenu.vue b/src/components/menus/PreviewThemeMenu.vue new file mode 100644 index 0000000..7667074 --- /dev/null +++ b/src/components/menus/PreviewThemeMenu.vue @@ -0,0 +1,116 @@ + + + + + + \ No newline at end of file diff --git a/src/components/menus/PublishMenu.vue b/src/components/menus/PublishMenu.vue new file mode 100644 index 0000000..bdf03b8 --- /dev/null +++ b/src/components/menus/PublishMenu.vue @@ -0,0 +1,307 @@ + + + diff --git a/src/components/menus/SyncMenu.vue b/src/components/menus/SyncMenu.vue new file mode 100644 index 0000000..61f9ee8 --- /dev/null +++ b/src/components/menus/SyncMenu.vue @@ -0,0 +1,388 @@ + + + diff --git a/src/components/menus/WorkspaceBackupMenu.vue b/src/components/menus/WorkspaceBackupMenu.vue new file mode 100644 index 0000000..ad2f5e9 --- /dev/null +++ b/src/components/menus/WorkspaceBackupMenu.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/menus/WorkspacesMenu.vue b/src/components/menus/WorkspacesMenu.vue new file mode 100644 index 0000000..bb1f415 --- /dev/null +++ b/src/components/menus/WorkspacesMenu.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/components/menus/common/MenuEntry.vue b/src/components/menus/common/MenuEntry.vue new file mode 100644 index 0000000..36f0ca2 --- /dev/null +++ b/src/components/menus/common/MenuEntry.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/components/menus/common/MenuItem.vue b/src/components/menus/common/MenuItem.vue new file mode 100644 index 0000000..6697bb3 --- /dev/null +++ b/src/components/menus/common/MenuItem.vue @@ -0,0 +1,93 @@ + + + diff --git a/src/components/modals/AboutModal.vue b/src/components/modals/AboutModal.vue new file mode 100644 index 0000000..145430e --- /dev/null +++ b/src/components/modals/AboutModal.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/modals/AccountManagementModal.vue b/src/components/modals/AccountManagementModal.vue new file mode 100644 index 0000000..3f7ea14 --- /dev/null +++ b/src/components/modals/AccountManagementModal.vue @@ -0,0 +1,369 @@ + + + + + diff --git a/src/components/modals/BadgeManagementModal.vue b/src/components/modals/BadgeManagementModal.vue new file mode 100644 index 0000000..12a4c50 --- /dev/null +++ b/src/components/modals/BadgeManagementModal.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/components/modals/ChatGptModal.vue b/src/components/modals/ChatGptModal.vue new file mode 100644 index 0000000..9101c8d --- /dev/null +++ b/src/components/modals/ChatGptModal.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/components/modals/CommitMessageModal.vue b/src/components/modals/CommitMessageModal.vue new file mode 100644 index 0000000..0159bce --- /dev/null +++ b/src/components/modals/CommitMessageModal.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/modals/FilePropertiesModal.vue b/src/components/modals/FilePropertiesModal.vue new file mode 100644 index 0000000..ec46e78 --- /dev/null +++ b/src/components/modals/FilePropertiesModal.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/src/components/modals/HtmlExportModal.vue b/src/components/modals/HtmlExportModal.vue new file mode 100644 index 0000000..a8e9b4e --- /dev/null +++ b/src/components/modals/HtmlExportModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/modals/ImageModal.vue b/src/components/modals/ImageModal.vue new file mode 100644 index 0000000..b5c8239 --- /dev/null +++ b/src/components/modals/ImageModal.vue @@ -0,0 +1,314 @@ + + + + diff --git a/src/components/modals/LinkModal.vue b/src/components/modals/LinkModal.vue new file mode 100644 index 0000000..20b4397 --- /dev/null +++ b/src/components/modals/LinkModal.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/modals/PandocExportModal.vue b/src/components/modals/PandocExportModal.vue new file mode 100644 index 0000000..84ea4d1 --- /dev/null +++ b/src/components/modals/PandocExportModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/modals/PdfExportModal.vue b/src/components/modals/PdfExportModal.vue new file mode 100644 index 0000000..df13a7b --- /dev/null +++ b/src/components/modals/PdfExportModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/modals/PublishManagementModal.vue b/src/components/modals/PublishManagementModal.vue new file mode 100644 index 0000000..323d053 --- /dev/null +++ b/src/components/modals/PublishManagementModal.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/components/modals/SettingsModal.vue b/src/components/modals/SettingsModal.vue new file mode 100644 index 0000000..826be27 --- /dev/null +++ b/src/components/modals/SettingsModal.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/components/modals/SponsorModal.vue b/src/components/modals/SponsorModal.vue new file mode 100644 index 0000000..db648fd --- /dev/null +++ b/src/components/modals/SponsorModal.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/modals/SyncManagementModal.vue b/src/components/modals/SyncManagementModal.vue new file mode 100644 index 0000000..38d0f12 --- /dev/null +++ b/src/components/modals/SyncManagementModal.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/components/modals/TemplatesModal.vue b/src/components/modals/TemplatesModal.vue new file mode 100644 index 0000000..71dd44a --- /dev/null +++ b/src/components/modals/TemplatesModal.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/components/modals/WorkspaceImgPathModal.vue b/src/components/modals/WorkspaceImgPathModal.vue new file mode 100644 index 0000000..eb78d8c --- /dev/null +++ b/src/components/modals/WorkspaceImgPathModal.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/components/modals/WorkspaceManagementModal.vue b/src/components/modals/WorkspaceManagementModal.vue new file mode 100644 index 0000000..3e5017f --- /dev/null +++ b/src/components/modals/WorkspaceManagementModal.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/src/components/modals/common/FormEntry.vue b/src/components/modals/common/FormEntry.vue new file mode 100644 index 0000000..09f7512 --- /dev/null +++ b/src/components/modals/common/FormEntry.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/modals/common/ModalInner.vue b/src/components/modals/common/ModalInner.vue new file mode 100644 index 0000000..ffb8bc9 --- /dev/null +++ b/src/components/modals/common/ModalInner.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/modals/common/Tab.vue b/src/components/modals/common/Tab.vue new file mode 100644 index 0000000..6d5d55e --- /dev/null +++ b/src/components/modals/common/Tab.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/modals/common/modalTemplate.js b/src/components/modals/common/modalTemplate.js new file mode 100644 index 0000000..0a494ff --- /dev/null +++ b/src/components/modals/common/modalTemplate.js @@ -0,0 +1,79 @@ +import ModalInner from './ModalInner'; +import FormEntry from './FormEntry'; +import store from '../../../store'; + +const collator = new Intl.Collator(undefined, { sensitivity: 'base' }); + +export default (desc) => { + const component = { + ...desc, + data: () => ({ + ...desc.data ? desc.data() : {}, + errorTimeouts: {}, + }), + components: { + ...desc.components || {}, + ModalInner, + FormEntry, + }, + computed: { + ...desc.computed || {}, + config() { + return store.getters['modal/config']; + }, + currentFileName() { + return store.getters['file/current'].name; + }, + }, + methods: { + ...desc.methods || {}, + openFileProperties: () => store.dispatch('modal/open', 'fileProperties'), + setError(name) { + clearTimeout(this.errorTimeouts[name]); + const formEntry = this.$el.querySelector(`.form-entry[error=${name}]`); + if (formEntry) { + formEntry.classList.add('form-entry--error'); + this.errorTimeouts[name] = setTimeout(() => { + formEntry.classList.remove('form-entry--error'); + }, 1000); + } + }, + }, + }; + Object.entries(desc.computedLocalSettings || {}).forEach(([key, id]) => { + component.computed[key] = { + get() { + return store.getters['data/localSettings'][id]; + }, + set(value) { + store.dispatch('data/patchLocalSettings', { + [id]: value, + }); + }, + }; + if (key === 'selectedTemplate') { + component.computed.allTemplatesById = () => { + const allTemplatesById = store.getters['data/allTemplatesById']; + const sortedTemplatesById = {}; + Object.entries(allTemplatesById) + .sort(([, template1], [, template2]) => collator.compare(template1.name, template2.name)) + .forEach(([templateId, template]) => { + sortedTemplatesById[templateId] = template; + }); + return sortedTemplatesById; + }; + // Make use of `function` to have `this` bound to the component + component.methods.configureTemplates = async function () { // eslint-disable-line func-names + const { selectedId } = await store.dispatch('modal/open', { + type: 'templates', + selectedId: this.selectedTemplate, + }); + store.dispatch('data/patchLocalSettings', { + [id]: selectedId, + }); + }; + } + }); + component.computedLocalSettings = null; + return component; +}; diff --git a/src/components/modals/providers/BloggerPagePublishModal.vue b/src/components/modals/providers/BloggerPagePublishModal.vue new file mode 100644 index 0000000..9d8f96f --- /dev/null +++ b/src/components/modals/providers/BloggerPagePublishModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/modals/providers/BloggerPublishModal.vue b/src/components/modals/providers/BloggerPublishModal.vue new file mode 100644 index 0000000..beffde0 --- /dev/null +++ b/src/components/modals/providers/BloggerPublishModal.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/components/modals/providers/CouchdbCredentialsModal.vue b/src/components/modals/providers/CouchdbCredentialsModal.vue new file mode 100644 index 0000000..b18b501 --- /dev/null +++ b/src/components/modals/providers/CouchdbCredentialsModal.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/modals/providers/CouchdbWorkspaceModal.vue b/src/components/modals/providers/CouchdbWorkspaceModal.vue new file mode 100644 index 0000000..9c906be --- /dev/null +++ b/src/components/modals/providers/CouchdbWorkspaceModal.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/components/modals/providers/CustomAccountModal.vue b/src/components/modals/providers/CustomAccountModal.vue new file mode 100644 index 0000000..e1d1e7c --- /dev/null +++ b/src/components/modals/providers/CustomAccountModal.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/modals/providers/DropboxAccountModal.vue b/src/components/modals/providers/DropboxAccountModal.vue new file mode 100644 index 0000000..1582662 --- /dev/null +++ b/src/components/modals/providers/DropboxAccountModal.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/modals/providers/DropboxPublishModal.vue b/src/components/modals/providers/DropboxPublishModal.vue new file mode 100644 index 0000000..e90e252 --- /dev/null +++ b/src/components/modals/providers/DropboxPublishModal.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/modals/providers/DropboxSaveModal.vue b/src/components/modals/providers/DropboxSaveModal.vue new file mode 100644 index 0000000..da8471a --- /dev/null +++ b/src/components/modals/providers/DropboxSaveModal.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/modals/providers/GistPublishModal.vue b/src/components/modals/providers/GistPublishModal.vue new file mode 100644 index 0000000..294e47d --- /dev/null +++ b/src/components/modals/providers/GistPublishModal.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/components/modals/providers/GistSyncModal.vue b/src/components/modals/providers/GistSyncModal.vue new file mode 100644 index 0000000..5899e0a --- /dev/null +++ b/src/components/modals/providers/GistSyncModal.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/modals/providers/GiteaAccountModal.vue b/src/components/modals/providers/GiteaAccountModal.vue new file mode 100644 index 0000000..1d4e04e --- /dev/null +++ b/src/components/modals/providers/GiteaAccountModal.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/components/modals/providers/GiteaImgStorageModal.vue b/src/components/modals/providers/GiteaImgStorageModal.vue new file mode 100644 index 0000000..f409fe3 --- /dev/null +++ b/src/components/modals/providers/GiteaImgStorageModal.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/components/modals/providers/GiteaOpenModal.vue b/src/components/modals/providers/GiteaOpenModal.vue new file mode 100644 index 0000000..bcfacda --- /dev/null +++ b/src/components/modals/providers/GiteaOpenModal.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/components/modals/providers/GiteaPublishModal.vue b/src/components/modals/providers/GiteaPublishModal.vue new file mode 100644 index 0000000..250dba0 --- /dev/null +++ b/src/components/modals/providers/GiteaPublishModal.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/components/modals/providers/GiteaSaveModal.vue b/src/components/modals/providers/GiteaSaveModal.vue new file mode 100644 index 0000000..c30d9a3 --- /dev/null +++ b/src/components/modals/providers/GiteaSaveModal.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/modals/providers/GiteaWorkspaceModal.vue b/src/components/modals/providers/GiteaWorkspaceModal.vue new file mode 100644 index 0000000..77fb9b7 --- /dev/null +++ b/src/components/modals/providers/GiteaWorkspaceModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/modals/providers/GiteeAccountModal.vue b/src/components/modals/providers/GiteeAccountModal.vue new file mode 100644 index 0000000..72dab6b --- /dev/null +++ b/src/components/modals/providers/GiteeAccountModal.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/modals/providers/GiteeGistPublishModal.vue b/src/components/modals/providers/GiteeGistPublishModal.vue new file mode 100644 index 0000000..f3da97c --- /dev/null +++ b/src/components/modals/providers/GiteeGistPublishModal.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/components/modals/providers/GiteeGistSyncModal.vue b/src/components/modals/providers/GiteeGistSyncModal.vue new file mode 100644 index 0000000..a23dd62 --- /dev/null +++ b/src/components/modals/providers/GiteeGistSyncModal.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/modals/providers/GiteeOpenModal.vue b/src/components/modals/providers/GiteeOpenModal.vue new file mode 100644 index 0000000..7bc476c --- /dev/null +++ b/src/components/modals/providers/GiteeOpenModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/modals/providers/GiteePublishModal.vue b/src/components/modals/providers/GiteePublishModal.vue new file mode 100644 index 0000000..02c8f58 --- /dev/null +++ b/src/components/modals/providers/GiteePublishModal.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/modals/providers/GiteeSaveModal.vue b/src/components/modals/providers/GiteeSaveModal.vue new file mode 100644 index 0000000..b093b10 --- /dev/null +++ b/src/components/modals/providers/GiteeSaveModal.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/modals/providers/GiteeWorkspaceModal.vue b/src/components/modals/providers/GiteeWorkspaceModal.vue new file mode 100644 index 0000000..3a69564 --- /dev/null +++ b/src/components/modals/providers/GiteeWorkspaceModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/modals/providers/GithubAccountModal.vue b/src/components/modals/providers/GithubAccountModal.vue new file mode 100644 index 0000000..753be89 --- /dev/null +++ b/src/components/modals/providers/GithubAccountModal.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components/modals/providers/GithubImgStorageModal.vue b/src/components/modals/providers/GithubImgStorageModal.vue new file mode 100644 index 0000000..58673cd --- /dev/null +++ b/src/components/modals/providers/GithubImgStorageModal.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/components/modals/providers/GithubOpenModal.vue b/src/components/modals/providers/GithubOpenModal.vue new file mode 100644 index 0000000..b902014 --- /dev/null +++ b/src/components/modals/providers/GithubOpenModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/modals/providers/GithubPublishModal.vue b/src/components/modals/providers/GithubPublishModal.vue new file mode 100644 index 0000000..d6fafd7 --- /dev/null +++ b/src/components/modals/providers/GithubPublishModal.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/modals/providers/GithubSaveModal.vue b/src/components/modals/providers/GithubSaveModal.vue new file mode 100644 index 0000000..39e84d1 --- /dev/null +++ b/src/components/modals/providers/GithubSaveModal.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/modals/providers/GithubWorkspaceModal.vue b/src/components/modals/providers/GithubWorkspaceModal.vue new file mode 100644 index 0000000..b6a7c96 --- /dev/null +++ b/src/components/modals/providers/GithubWorkspaceModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/modals/providers/GitlabAccountModal.vue b/src/components/modals/providers/GitlabAccountModal.vue new file mode 100644 index 0000000..d62ec28 --- /dev/null +++ b/src/components/modals/providers/GitlabAccountModal.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/components/modals/providers/GitlabOpenModal.vue b/src/components/modals/providers/GitlabOpenModal.vue new file mode 100644 index 0000000..3966886 --- /dev/null +++ b/src/components/modals/providers/GitlabOpenModal.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/components/modals/providers/GitlabPublishModal.vue b/src/components/modals/providers/GitlabPublishModal.vue new file mode 100644 index 0000000..328311d --- /dev/null +++ b/src/components/modals/providers/GitlabPublishModal.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/components/modals/providers/GitlabSaveModal.vue b/src/components/modals/providers/GitlabSaveModal.vue new file mode 100644 index 0000000..247bff3 --- /dev/null +++ b/src/components/modals/providers/GitlabSaveModal.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/modals/providers/GitlabWorkspaceModal.vue b/src/components/modals/providers/GitlabWorkspaceModal.vue new file mode 100644 index 0000000..38b68f9 --- /dev/null +++ b/src/components/modals/providers/GitlabWorkspaceModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/modals/providers/GoogleDriveAccountModal.vue b/src/components/modals/providers/GoogleDriveAccountModal.vue new file mode 100644 index 0000000..f5a0c7c --- /dev/null +++ b/src/components/modals/providers/GoogleDriveAccountModal.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/modals/providers/GoogleDrivePublishModal.vue b/src/components/modals/providers/GoogleDrivePublishModal.vue new file mode 100644 index 0000000..5fb8fd4 --- /dev/null +++ b/src/components/modals/providers/GoogleDrivePublishModal.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/components/modals/providers/GoogleDriveSaveModal.vue b/src/components/modals/providers/GoogleDriveSaveModal.vue new file mode 100644 index 0000000..280da35 --- /dev/null +++ b/src/components/modals/providers/GoogleDriveSaveModal.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/components/modals/providers/GoogleDriveWorkspaceModal.vue b/src/components/modals/providers/GoogleDriveWorkspaceModal.vue new file mode 100644 index 0000000..c8f69b8 --- /dev/null +++ b/src/components/modals/providers/GoogleDriveWorkspaceModal.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/modals/providers/GooglePhotoModal.vue b/src/components/modals/providers/GooglePhotoModal.vue new file mode 100644 index 0000000..47b7f7a --- /dev/null +++ b/src/components/modals/providers/GooglePhotoModal.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/modals/providers/SmmsAccountModal.vue b/src/components/modals/providers/SmmsAccountModal.vue new file mode 100644 index 0000000..71b136f --- /dev/null +++ b/src/components/modals/providers/SmmsAccountModal.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/modals/providers/WordpressPublishModal.vue b/src/components/modals/providers/WordpressPublishModal.vue new file mode 100644 index 0000000..0ba2d20 --- /dev/null +++ b/src/components/modals/providers/WordpressPublishModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/modals/providers/ZendeskAccountModal.vue b/src/components/modals/providers/ZendeskAccountModal.vue new file mode 100644 index 0000000..197032c --- /dev/null +++ b/src/components/modals/providers/ZendeskAccountModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/modals/providers/ZendeskPublishModal.vue b/src/components/modals/providers/ZendeskPublishModal.vue new file mode 100644 index 0000000..3d8ab5c --- /dev/null +++ b/src/components/modals/providers/ZendeskPublishModal.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/data/constants.js b/src/data/constants.js new file mode 100644 index 0000000..31bfbe8 --- /dev/null +++ b/src/data/constants.js @@ -0,0 +1,27 @@ +const origin = `${window.location.protocol}//${window.location.host}`; + +export default { + cleanTrashAfter: 7 * 24 * 60 * 60 * 1000, // 7 days + origin, + oauth2RedirectUri: `${origin}/oauth2/callback`, + types: [ + 'contentState', + 'syncedContent', + 'content', + 'file', + 'folder', + 'syncLocation', + 'publishLocation', + 'data', + ], + localStorageDataIds: [ + 'workspaces', + 'settings', + 'layoutSettings', + 'tokens', + 'badgeCreations', + 'serverConf', + ], + textMaxLength: 10000000, + defaultName: 'Untitled', +}; diff --git a/src/data/defaults/defaultLayoutSettings.js b/src/data/defaults/defaultLayoutSettings.js new file mode 100644 index 0000000..7746d26 --- /dev/null +++ b/src/data/defaults/defaultLayoutSettings.js @@ -0,0 +1,14 @@ +export default () => ({ + showNavigationBar: true, + showEditor: true, + showSidePreview: true, + showStatusBar: true, + showSideBar: false, + showExplorer: false, + scrollSync: true, + focusMode: false, + findCaseSensitive: false, + findUseRegexp: false, + sideBarPanel: 'menu', + welcomeTourFinished: false, +}); diff --git a/src/data/defaults/defaultLocalSettings.js b/src/data/defaults/defaultLocalSettings.js new file mode 100644 index 0000000..7fe337c --- /dev/null +++ b/src/data/defaults/defaultLocalSettings.js @@ -0,0 +1,44 @@ +export default () => ({ + welcomeFileHashes: {}, + filePropertiesTab: '', + htmlExportTemplate: 'styledHtml', + pdfExportTemplate: 'styledHtml', + pandocExportFormat: 'pdf', + googleDriveRestrictedAccess: false, + googleDriveFolderId: '', + googleDriveWorkspaceFolderId: '', + googleDrivePublishFormat: 'markdown', + googleDrivePublishTemplate: 'styledHtml', + bloggerBlogUrl: '', + bloggerPublishTemplate: 'plainHtml', + dropboxRestrictedAccess: false, + dropboxPublishTemplate: 'styledHtml', + githubRepoFullAccess: false, + githubRepoUrl: '', + githubWorkspaceRepoUrl: '', + githubPublishTemplate: 'jekyllSite', + gistIsPublic: false, + gistPublishTemplate: 'plainText', + giteeRepoUrl: '', + giteeWorkspaceRepoUrl: '', + giteePublishTemplate: 'jekyllSite', + gitlabServerUrl: '', + gitlabApplicationId: '', + gitlabApplicationSecret: '', + gitlabProjectUrl: '', + gitlabWorkspaceProjectUrl: '', + gitlabPublishTemplate: 'plainText', + giteaServerUrl: '', + giteaApplicationId: '', + giteaApplicationSecret: '', + giteaProjectUrl: '', + giteaWorkspaceProjectUrl: '', + giteaPublishTemplate: 'plainText', + wordpressDomain: '', + wordpressPublishTemplate: 'plainHtml', + zendeskSiteUrl: '', + zendeskClientId: '', + zendescPublishSectionId: '', + zendescPublishLocale: '', + zendeskPublishTemplate: 'plainHtml', +}); diff --git a/src/data/defaults/defaultSettings.yml b/src/data/defaults/defaultSettings.yml new file mode 100644 index 0000000..7692d99 --- /dev/null +++ b/src/data/defaults/defaultSettings.yml @@ -0,0 +1,131 @@ +# light or dark +colorTheme: light +# Adjust font size in editor and preview +fontSizeFactor: 1 +# Adjust maximum text width in editor and preview +maxWidthFactor: 1 +# Auto-sync frequency (in ms). Minimum is 60000. +autoSyncEvery: 90000 + +# Editor settings +editor: + # Automatic list numbering + listAutoNumber: true + # Display images in the editor + inlineImages: true + # Use monospaced font only + monospacedFontOnly: false + # 是否显示右上角图标 + showInPageButtons: true + # 头部的按钮是否显示独立设置 + headButtons: + # 加粗 + bold: true + # 斜体 + italic: true + # 标题 + heading: true + # 删除线 + strikethrough: true + # 无序列表 + ulist: true + # 有序列表 + olist: true + # 可选列表 + clist: true + # 块引用 + quote: true + # 代码 + code: true + # 表格 + table: true + # 链接 + link: true + # 图片 + image: true + # ChatGPT + chatgpt: true + +# Keyboard shortcuts +# See https://craig.is/killing/mice +shortcuts: + mod+s: sync + mod+f: find + mod+alt+f: replace + mod+g: replace + mod+shift+b: bold + mod+shift+c: clist + mod+shift+k: code + mod+shift+h: heading + mod+shift+r: hr + mod+shift+g: image + mod+shift+p: chatgpt + mod+shift+i: italic + mod+shift+l: link + mod+shift+o: olist + mod+shift+q: quote + mod+shift+s: strikethrough + mod+shift+t: table + mod+shift+u: ulist + mod+shift+f: inlineformula + # 切换编辑与预览模式 + mod+shift+e: toggleeditor + '= = > space': + method: expand + params: + - '==> ' + - '⇒ ' + '< = = space': + method: expand + params: + - '<== ' + - '⇐ ' + +# Options passed to wkhtmltopdf +# See https://wkhtmltopdf.org/usage/wkhtmltopdf.txt +wkhtmltopdf: + marginTop: 25 + marginRight: 25 + marginBottom: 25 + marginLeft: 25 + # A3, A4, Legal or Letter + pageSize: A4 + +# Options passed to pandoc +# See https://pandoc.org/MANUAL.html +pandoc: + highlightStyle: kate + toc: true + tocDepth: 3 + +# HTML to Markdown converter options +# See https://github.com/domchristie/turndown +turndown: + headingStyle: atx + hr: ---------- + bulletListMarker: '-' + codeBlockStyle: fenced + fence: '```' + emDelimiter: _ + strongDelimiter: '**' + linkStyle: inlined + linkReferenceStyle: full + +# GitHub/GitLab/Gitee/Gitea commit messages +git: + createFileMessage: '{{path}} created' + updateFileMessage: '{{path}} updated' + deleteFileMessage: '{{path}} deleted' + +# Default content for new files +newFileContent: | + + + + > Written with [StackEdit中文版](https://stackedit.cn/). + +# Default properties for new files +newFileProperties: | +# extensions: +# preset: gfm + diff --git a/src/data/defaults/defaultWorkspaces.js b/src/data/defaults/defaultWorkspaces.js new file mode 100644 index 0000000..c1f66e3 --- /dev/null +++ b/src/data/defaults/defaultWorkspaces.js @@ -0,0 +1,7 @@ +export default () => ({ + main: { + id: 'main', + name: '主文档空间', + // The rest will be filled by the workspace/workspacesById getter + }, +}); diff --git a/src/data/empties/emptyContent.js b/src/data/empties/emptyContent.js new file mode 100644 index 0000000..fca704e --- /dev/null +++ b/src/data/empties/emptyContent.js @@ -0,0 +1,9 @@ +export default (id = null) => ({ + id, + type: 'content', + text: '\n', + properties: '\n', + discussions: {}, + comments: {}, + hash: 0, +}); diff --git a/src/data/empties/emptyContentState.js b/src/data/empties/emptyContentState.js new file mode 100644 index 0000000..b750717 --- /dev/null +++ b/src/data/empties/emptyContentState.js @@ -0,0 +1,8 @@ +export default (id = null) => ({ + id, + type: 'contentState', + selectionStart: 0, + selectionEnd: 0, + scrollPosition: null, + hash: 0, +}); diff --git a/src/data/empties/emptyFile.js b/src/data/empties/emptyFile.js new file mode 100644 index 0000000..a76b76d --- /dev/null +++ b/src/data/empties/emptyFile.js @@ -0,0 +1,7 @@ +export default (id = null) => ({ + id, + type: 'file', + name: '', + parentId: null, + hash: 0, +}); diff --git a/src/data/empties/emptyFolder.js b/src/data/empties/emptyFolder.js new file mode 100644 index 0000000..10a2536 --- /dev/null +++ b/src/data/empties/emptyFolder.js @@ -0,0 +1,7 @@ +export default (id = null) => ({ + id, + type: 'folder', + name: '', + parentId: null, + hash: 0, +}); diff --git a/src/data/empties/emptyPublishLocation.js b/src/data/empties/emptyPublishLocation.js new file mode 100644 index 0000000..dd37fc0 --- /dev/null +++ b/src/data/empties/emptyPublishLocation.js @@ -0,0 +1,8 @@ +export default (id = null) => ({ + id, + type: 'publishLocation', + providerId: null, + fileId: null, + templateId: null, + hash: 0, +}); diff --git a/src/data/empties/emptySyncLocation.js b/src/data/empties/emptySyncLocation.js new file mode 100644 index 0000000..479ea3a --- /dev/null +++ b/src/data/empties/emptySyncLocation.js @@ -0,0 +1,7 @@ +export default (id = null) => ({ + id, + type: 'syncLocation', + providerId: null, + fileId: null, + hash: 0, +}); diff --git a/src/data/empties/emptySyncedContent.js b/src/data/empties/emptySyncedContent.js new file mode 100644 index 0000000..2089140 --- /dev/null +++ b/src/data/empties/emptySyncedContent.js @@ -0,0 +1,8 @@ +export default (id = null) => ({ + id, + type: 'syncedContent', + historyData: {}, + syncHistory: {}, + v: 0, + hash: 0, +}); diff --git a/src/data/empties/emptyTemplateHelpers.js b/src/data/empties/emptyTemplateHelpers.js new file mode 100644 index 0000000..8187b8d --- /dev/null +++ b/src/data/empties/emptyTemplateHelpers.js @@ -0,0 +1,16 @@ +/* Add your custom Handlebars helpers here. + +For example: + +Handlebars.registerHelper('transform', function (options) { + var result = options.fn(this); + return new Handlebars.SafeString( + result.replace(/]*>/g, '

    ')
    +  );
    +});
    +
    +Then use the helper in your template:
    +
    +{{#transform}}{{{files.0.content.html}}}{{/transform}}
    +*/
    +
    diff --git a/src/data/empties/emptyTemplateValue.html b/src/data/empties/emptyTemplateValue.html
    new file mode 100644
    index 0000000..189e9cc
    --- /dev/null
    +++ b/src/data/empties/emptyTemplateValue.html
    @@ -0,0 +1,38 @@
    +
    +
    diff --git a/src/data/faq.md b/src/data/faq.md
    new file mode 100644
    index 0000000..65a4d6b
    --- /dev/null
    +++ b/src/data/faq.md
    @@ -0,0 +1,9 @@
    +**我的数据存储在哪里?**
    +
    +如果您的文档空间没有同步,则文件存储在浏览器中,无处可寻。
    +
    +我们建议同步您的文档空间,以确保在清除浏览器数据的情况下不会丢失文件。自托管Gitea后端非常适合保证隐私。
    +
    +**StackEdit中文版可以访问我的数据而不告诉我吗?**
    +
    +StackEdit中文版是一个基于浏览器的应用程序。Gitee,Github,Dropbox ...发出的访问令牌存储在您的浏览器中,不会发送到任何形式的后端或第三方,因此任何人都不会访问您的数据。
    diff --git a/src/data/features.js b/src/data/features.js
    new file mode 100644
    index 0000000..0baf337
    --- /dev/null
    +++ b/src/data/features.js
    @@ -0,0 +1,622 @@
    +class Feature {
    +  constructor(id, badgeName, description, children = null) {
    +    this.id = id;
    +    this.badgeName = badgeName;
    +    this.description = description;
    +    this.children = children;
    +  }
    +
    +  toBadge(badgeCreations) {
    +    const children = this.children
    +      ? this.children.map(child => child.toBadge(badgeCreations))
    +      : null;
    +    return {
    +      featureId: this.id,
    +      name: this.badgeName,
    +      description: this.description,
    +      children,
    +      isEarned: children
    +        ? children.every(child => child.isEarned)
    +        : !!badgeCreations[this.id],
    +      hasSomeEarned: children && children.some(child => child.isEarned),
    +    };
    +  }
    +}
    +
    +export default [
    +  new Feature(
    +    'navigationBar',
    +    '丰富的导航栏',
    +    '通过格式化一些Markdown和重命名当前文件掌握导航栏',
    +    [
    +      new Feature(
    +        'formatButtons',
    +        '格式化',
    +        '使用格式化按钮更改 Markdown 文件中的格式。',
    +      ),
    +      new Feature(
    +        'editCurrentFileName',
    +        '重命名',
    +        '使用导航栏中的名称字段重命名当前文件。',
    +      ),
    +      new Feature(
    +        'toggleExplorer',
    +        '资源管理器切换',
    +        '使用导航栏切换资源管理器。',
    +      ),
    +      new Feature(
    +        'toggleSideBar',
    +        '切换侧边栏',
    +        '使用导航栏来切换侧边栏。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'explorer',
    +    '资源管理器',
    +    '使用文件资源管理器管理文档空间中的文件和文件夹。',
    +    [
    +      new Feature(
    +        'createFile',
    +        '文件创建',
    +        '使用文件资源管理器在文档空间中创建一个新文件。',
    +      ),
    +      new Feature(
    +        'switchFile',
    +        '文件切换',
    +        '使用文件资源管理器在文档空间中从一个文件切换到另一个文件。',
    +      ),
    +      new Feature(
    +        'createFolder',
    +        '文件夹创建',
    +        '使用文件资源管理器在文档空间中创建一个新文件夹。',
    +      ),
    +      new Feature(
    +        'moveFile',
    +        '文件移动',
    +        '在文件管理器中拖动一个文件到另一个文件夹。',
    +      ),
    +      new Feature(
    +        'moveFolder',
    +        '文件夹移动',
    +        '在文件管理器中拖动一个文件夹到另一个文件夹。',
    +      ),
    +      new Feature(
    +        'renameFile',
    +        '文件重命名',
    +        '使用文件资源管理器重命名文档空间中的文件。',
    +      ),
    +      new Feature(
    +        'renameFolder',
    +        '文件夹重命名',
    +        '使用文件资源管理器重命名文档空间中的文件夹。',
    +      ),
    +      new Feature(
    +        'removeFile',
    +        '文件删除',
    +        '使用文件资源管理器删除文档空间中的文件。',
    +      ),
    +      new Feature(
    +        'removeFolder',
    +        '文件夹删除',
    +        '使用文件资源管理器删除文档空间中的文件夹。',
    +      ),
    +      new Feature(
    +        'searchFile',
    +        '文件搜索',
    +        '使用文件资源管理器搜索文档空间中的文件。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'buttonBar',
    +    '按钮栏',
    +    '使用按钮栏自定义编辑器布局并切换功能。',
    +    [
    +      new Feature(
    +        'toggleNavigationBar',
    +        '导航栏切换',
    +        '使用按钮栏切换导航栏。',
    +      ),
    +      new Feature(
    +        'toggleSidePreview',
    +        '切换侧边预览',
    +        '使用按钮栏切换侧边预览。',
    +      ),
    +      new Feature(
    +        'toggleEditor',
    +        '切换编辑器',
    +        '使用按钮栏切换编辑器。',
    +      ),
    +      new Feature(
    +        'toggleFocusMode',
    +        '切换焦点模式',
    +        '使用按钮栏切换焦点模式。此模式在键入时将其垂直居中。',
    +      ),
    +      new Feature(
    +        'toggleScrollSync',
    +        '换滚动同步',
    +        '使用按钮栏切换滚动同步功能。此功能链接编辑器和预览滚动条。',
    +      ),
    +      new Feature(
    +        'toggleStatusBar',
    +        '状态栏切换器',
    +        '使用按钮栏切换状态栏。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'signIn',
    +    '登录',
    +    '使用 Gitee 登录,同步您的主文档空间并解锁功能。',
    +    [
    +      new Feature(
    +        'syncMainWorkspace',
    +        '主文档空间已同步',
    +        '使用 Gitee 登录以将您的主文档空间与您的默认空间stackedit-app-data仓库数据同步。',
    +      ),
    +      new Feature(
    +        'sponsor',
    +        '赞助',
    +        '使用 Gitee 登录并赞助 StackEdit 以解锁 PDF 和 Pandoc 导出。(暂不支持赞助)',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'githubSignIn',
    +    '登录',
    +    '使用 Gitee 登录,同步您的主文档空间并解锁功能。',
    +    [
    +      new Feature(
    +        'githubSyncMainWorkspace',
    +        '主文档空间已同步',
    +        '使用 GitHub 登录以将您的主文档空间与您的默认空间stackedit-app-data仓库数据同步。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'workspaces',
    +    '文档空间菜单',
    +    '使用文档空间菜单创建各种文档空间并对其进行管理。',
    +    [
    +      new Feature(
    +        'addCouchdbWorkspace',
    +        '创建CouchDB文档空间',
    +        '使用文档空间菜单创建CouchDB文档空间。',
    +      ),
    +      new Feature(
    +        'addGithubWorkspace',
    +        '创建GitHub文档空间',
    +        '使用文档空间菜单创建GitHub文档空间。',
    +      ),
    +      new Feature(
    +        'addGiteeWorkspace',
    +        '创建Gitee文档空间',
    +        '使用文档空间菜单创建Gitee文档空间。',
    +      ),
    +      new Feature(
    +        'addGitlabWorkspace',
    +        '创建Gitlab文档空间',
    +        '使用文档空间菜单创建GitLab文档空间。',
    +      ),
    +      new Feature(
    +        'addGiteaWorkspace',
    +        '创建Gitea文档空间',
    +        '使用文档空间菜单创建Gitea文档空间。',
    +      ),
    +      new Feature(
    +        'addGoogleDriveWorkspace',
    +        '创建Google Drive文档空间',
    +        '使用文档空间菜单创建Google Drive文档空间。',
    +      ),
    +      new Feature(
    +        'renameWorkspace',
    +        '文档空间重命名',
    +        '使用“管理文档空间”对话框重命名文档空间。',
    +      ),
    +      new Feature(
    +        'removeWorkspace',
    +        '文档空间删除',
    +        '使用“管理文档空间”对话框在本地删除文档空间。',
    +      ),
    +      new Feature(
    +        'autoSyncWorkspace',
    +        '文档空间启用自动同步',
    +        '使用“管理文档空间”对话框启用自动同步。',
    +      ),
    +      new Feature(
    +        'stopAutoSyncWorkspace',
    +        '文档空间关闭自动同步',
    +        '使用“管理文档空间”对话框关闭自动同步。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'manageAccounts',
    +    '账号管理',
    +    '链接各种外部账号,并使用“账号”对话框来管理它们。',
    +    [
    +      new Feature(
    +        'addBloggerAccount',
    +        'Blogger账号',
    +        '将您的Blogger账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addDropboxAccount',
    +        'Dropbox账号',
    +        '将您的Dropbox账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGitHubAccount',
    +        'GitHub账号',
    +        '将您的Github账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGiteeAccount',
    +        'Gitee账号',
    +        '将您的Gitee账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGitLabAccount',
    +        'GitLab账号',
    +        '将您的Gitlab账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGiteaAccount',
    +        'Gitea账号',
    +        '将您的Gitea账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGoogleDriveAccount',
    +        'Google Drive账号',
    +        '将您的Google Drive账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addGooglePhotosAccount',
    +        'Google Photos账号',
    +        '将您的Google Photos账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addWordpressAccount',
    +        'WordPress账号',
    +        '将您的WordPress账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addZendeskAccount',
    +        'Zendesk账号',
    +        '将您的Zendesk账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addSmmsAccount',
    +        'SM.MS账号',
    +        '将您的SM.MS账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'addCustomAccount',
    +        '自定义图床账号',
    +        '将您的自定义图床账号链接到StackEdit中文版。',
    +      ),
    +      new Feature(
    +        'removeAccount',
    +        '移除账号',
    +        '使用“账号”对话框删除对外部账号的访问。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'syncFiles',
    +    '文件同步器',
    +    '通过打开和保存各种外部账号的文件来掌握“同步”菜单。',
    +    [
    +      new Feature(
    +        'openFromDropbox',
    +        'Dropbox阅读器',
    +        '使用“同步”菜单从您的Dropbox账号打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnDropbox',
    +        'Dropbox保存',
    +        '使用“同步”菜单将文件保存在您的Dropbox账号中。',
    +      ),
    +      new Feature(
    +        'openFromGithub',
    +        'Github阅读器',
    +        '使用“同步”菜单从GitHub仓库打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnGithub',
    +        'GitHub保存',
    +        '使用“同步”菜单将文件保存在GitHub仓库中。',
    +      ),
    +      new Feature(
    +        'saveOnGist',
    +        'GitHubGist保存',
    +        '使用“同步”菜单将文件保存在GitHubGist中。',
    +      ),
    +      new Feature(
    +        'openFromGitee',
    +        'Gitee阅读器',
    +        '使用“同步”菜单从Gitee仓库打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnGitee',
    +        'Gitee保存',
    +        '使用“同步”菜单将文件保存在Gitee仓库中。',
    +      ),
    +      new Feature(
    +        'saveOnGiteeGist',
    +        'GiteeGist保存',
    +        '使用“同步”菜单将文件保存在GiteeGist中。',
    +      ),
    +      new Feature(
    +        'openFromGitlab',
    +        'GitLab阅读器',
    +        '使用“同步”菜单从GitLab仓库打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnGitlab',
    +        'GitLab保存',
    +        '使用“同步”菜单将文件保存在GitLab仓库中。',
    +      ),
    +      new Feature(
    +        'openFromGitea',
    +        'Gitea阅读器',
    +        '使用“同步”菜单从Gitea仓库打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnGitea',
    +        'Gitea保存',
    +        '使用“同步”菜单将文件保存在Gitea仓库中。',
    +      ),
    +      new Feature(
    +        'openFromGoogleDrive',
    +        'Google Drive阅读器',
    +        '使用“同步”菜单从您的Google Drive账号打开文件。',
    +      ),
    +      new Feature(
    +        'saveOnGoogleDrive',
    +        'Google Drive保存',
    +        '使用“同步”菜单将文件保存在您的Google Drive账号中。',
    +      ),
    +      new Feature(
    +        'triggerSync',
    +        '同步触发器',
    +        '使用“同步”菜单或导航栏手动触发同步。',
    +      ),
    +      new Feature(
    +        'syncMultipleLocations',
    +        '多方同步',
    +        '使用“同步”菜单将文件与多个外部位置同步。',
    +      ),
    +      new Feature(
    +        'removeSyncLocation',
    +        '删除同步',
    +        '使用“文件同步”对话框删除同步位置。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'publishFiles',
    +    '文件发布',
    +    '通过将文件发布到各种外部账号中来掌握“发布”菜单。',
    +    [
    +      new Feature(
    +        'publishToBlogger',
    +        'Blogger发布',
    +        '使用“发布”菜单发布博客文章。',
    +      ),
    +      new Feature(
    +        'publishToBloggerPage',
    +        'Blogger页面发布',
    +        '使用“发布”菜单发布Blogger页面。',
    +      ),
    +      new Feature(
    +        'publishToDropbox',
    +        'Dropbox发布',
    +        '使用“发布”菜单将文件发布到您的Dropbox账号。',
    +      ),
    +      new Feature(
    +        'publishToGithub',
    +        'GitHub发布',
    +        '使用“发布”菜单将文件发布到GitHub仓库。',
    +      ),
    +      new Feature(
    +        'publishToGist',
    +        'GitHubGist发布',
    +        '使用“发布”菜单将文件发布到GitHubGist。',
    +      ),
    +      new Feature(
    +        'publishToGitee',
    +        'Gitee发布',
    +        '使用“发布”菜单将文件发布到Gitee仓库。',
    +      ),
    +      new Feature(
    +        'publishToGiteeGist',
    +        'GiteeGist发布',
    +        '使用“发布”菜单将文件发布到GiteeGist。',
    +      ),
    +      new Feature(
    +        'publishToGitlab',
    +        'GitLab发布',
    +        '使用“发布”菜单将文件发布到GitLab仓库中。',
    +      ),
    +      new Feature(
    +        'publishToGitea',
    +        'Gitea发布',
    +        '使用“发布”菜单将文件发布到Gitea仓库。',
    +      ),
    +      new Feature(
    +        'publishToGoogleDrive',
    +        'Google Drive发布',
    +        '使用“发布”菜单将文件发布到您的Google Drive账号。',
    +      ),
    +      new Feature(
    +        'publishToWordPress',
    +        'WordPress发布',
    +        '使用“发布”菜单发布WordPress文章。',
    +      ),
    +      new Feature(
    +        'publishToZendesk',
    +        'Zendesk发布',
    +        '使用“发布”菜单发布Zendesk帮助中心文章。',
    +      ),
    +      new Feature(
    +        'triggerPublish',
    +        '更新发布',
    +        '使用“发布”菜单或导航栏手动更新发布。',
    +      ),
    +      new Feature(
    +        'publishMultipleLocations',
    +        '多方发布',
    +        '使用“发布”菜单将文件发布到多个外部位置。',
    +      ),
    +      new Feature(
    +        'removePublishLocation',
    +        '删除发布',
    +        '使用“文件发布”对话框删除发布位置。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'manageHistory',
    +    '文件历史记录',
    +    '使用“文件历史记录”菜单查看版本历史记录并恢复当前文件的旧版本。',
    +    [
    +      new Feature(
    +        'restoreVersion',
    +        '恢复',
    +        '使用“文件历史记录”菜单来还原当前文件的旧版本。',
    +      ),
    +      new Feature(
    +        'chooseHistory',
    +        '历史版本选择',
    +        '选择与多个外部位置同步的文件的不同历史记录。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'manageProperties',
    +    '文件属性',
    +    '使用“文件属性”对话框更改当前文件的属性。',
    +    [
    +      new Feature(
    +        'setMetadata',
    +        '元数据设置',
    +        '使用“文件属性”对话框为当前文件设置元数据。',
    +      ),
    +      new Feature(
    +        'changePreset',
    +        '预设更改',
    +        '使用“文件属性”对话框更改Markdown引擎预设。',
    +      ),
    +      new Feature(
    +        'changeExtension',
    +        '扩展配置',
    +        '使用“文件属性”对话框启用,禁用或配置Markdown引擎扩展。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'comment',
    +    '评论',
    +    '添加和删除批注,添加和删除评论。',
    +    [
    +      new Feature(
    +        'createDiscussion',
    +        '添加批注',
    +        '使用“批注”按钮图标添加新的批注。',
    +      ),
    +      new Feature(
    +        'addComment',
    +        '添加批注评论',
    +        '使用“评论”按钮在现有批注中添加评论。',
    +      ),
    +      new Feature(
    +        'removeComment',
    +        '删除批注评论',
    +        '使用“删除评论”按钮图标删除批注评论。',
    +      ),
    +      new Feature(
    +        'removeDiscussion',
    +        '删除批注',
    +        '使用“删除批注”按钮图标删除批注。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'importExport',
    +    '导入/导出',
    +    '使用“导入/导出”菜单以导入和导出文件。',
    +    [
    +      new Feature(
    +        'importMarkdown',
    +        'Markdown导入',
    +        '使用“导入/导出”菜单从磁盘导入Markdown文件。',
    +      ),
    +      new Feature(
    +        'exportMarkdown',
    +        'Markdown导出',
    +        '使用“导入/导出”菜单将Markdown文件导出到磁盘。',
    +      ),
    +      new Feature(
    +        'importHtml',
    +        'HTML导入',
    +        '使用“导入/导出”菜单从磁盘导入HTML文件,然后将其转换为Markdown。',
    +      ),
    +      new Feature(
    +        'exportHtml',
    +        'HTML导出',
    +        '使用“导入/导出”菜单和Handlebars模板将文件导出到磁盘作为HTML文件。',
    +      ),
    +      new Feature(
    +        'exportPdf',
    +        'PDF导出',
    +        '使用“导入/导出”菜单将文件导出到磁盘作为PDF文件。',
    +      ),
    +      new Feature(
    +        'exportPandoc',
    +        'Pandoc导出',
    +        '使用“导入/导出”菜单将文件导出到使用Pandoc的磁盘。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'manageSettings',
    +    '管理设置',
    +    '使用“设置”对话框调整应用程序行为并更改键盘快捷键。',
    +    [
    +      new Feature(
    +        'changeSettings',
    +        '更新设置',
    +        '使用“设置”对话框调整应用程序行为。',
    +      ),
    +      new Feature(
    +        'switchTheme',
    +        '切换主题',
    +        '使用“主题切换”按钮切换主题。',
    +      ),
    +      new Feature(
    +        'changeShortcuts',
    +        '编辑快捷键',
    +        '使用“设置”对话框更改键盘快捷键。',
    +      ),
    +    ],
    +  ),
    +  new Feature(
    +    'manageTemplates',
    +    '管理模板',
    +    '使用“模板”对话框创建,删除或修改Handlebars模板。',
    +    [
    +      new Feature(
    +        'addTemplate',
    +        '模板创建',
    +        '使用“模板”对话框创建一个Handlebars模板。',
    +      ),
    +      new Feature(
    +        'removeTemplate',
    +        '模板删除',
    +        '使用“模板”对话框删除Handlebars模板。',
    +      ),
    +    ],
    +  ),
    +];
    diff --git a/src/data/markdownSample.md b/src/data/markdownSample.md
    new file mode 100644
    index 0000000..d5ca0bb
    --- /dev/null
    +++ b/src/data/markdownSample.md
    @@ -0,0 +1,129 @@
    +标题
    +---------------------------
    +
    +# 标题1
    +
    +## 标题2
    +
    +### 标题3
    +
    +
    +
    +样式
    +---------------------------
    +
    +*强调* _强调_
    +
    +**加粗** __加粗__
    +
    +==标记文本==
    +
    +~~删除线文本~~
    +
    +> 块引用文本
    +
    +H~2~O是一种液体
    +
    +2^10^是1024
    +
    +
    +
    +列表
    +---------------------------
    +
    +- 列表项
    +  * 列表项
    +    + 列表项
    +
    +1. 列表项 1
    +2. 列表项 2
    +3. 列表项 3
    +
    +- [ ] 未完成项
    +- [x] 已完成项
    +
    +
    +
    +链接
    +---------------------------
    +
    +一个[链接](http://example.com).
    +
    +一张图片: ![图片描述](img.jpg)
    +
    +一张调整大小的图片: ![图片描述](img.jpg =60x50)
    +
    +
    +
    +代码
    +---------------------------
    +
    +一些`行内代码`.
    +
    +```
    +// 一个代码块
    +var foo = 'bar';
    +```
    +
    +```javascript
    +// 一个高亮代码块
    +var foo = 'bar';
    +```
    +
    +
    +
    +表格
    +---------------------------
    +
    +Item     | Value
    +-------- | -----
    +Computer | $1600
    +Phone    | $12
    +Pipe     | $1
    +
    +
    +| Column 1 | Column 2      |
    +|:--------:| -------------:|
    +| centered | right-aligned |
    +
    +
    +
    +定义列表
    +---------------------------
    +
    +Markdown
    +:  文本到HTML转换工具
    +
    +作者
    +:  张三
    +:  李四
    +
    +
    +
    +脚注
    +---------------------------
    +
    +一些带有脚注的文本。[^1]
    +
    +[^1]: 脚注内容。
    +
    +
    +
    +缩写
    +---------------------------
    +
    +Markdown将文本转换为 HTML。
    +
    +*[HTML]: 超文本标记语言
    +
    +
    +
    +LaTeX数学表达式
    +---------------------------
    +
    +满足 $\Gamma(n) = (n-1)!\quad\forall
    +n\in\mathbb N$ 的Gamma函数是通过欧拉积分
    +
    +$$
    +\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
    +$$
    diff --git a/src/data/pagedownButtons.js b/src/data/pagedownButtons.js
    new file mode 100644
    index 0000000..d952ee2
    --- /dev/null
    +++ b/src/data/pagedownButtons.js
    @@ -0,0 +1,56 @@
    +export default [{
    +}, {
    +  method: 'bold',
    +  title: '加粗',
    +  icon: 'format-bold',
    +}, {
    +  method: 'italic',
    +  title: '斜体',
    +  icon: 'format-italic',
    +}, {
    +  method: 'heading',
    +  title: '标题',
    +  icon: 'format-size',
    +}, {
    +  method: 'strikethrough',
    +  title: '删除线',
    +  icon: 'format-strikethrough',
    +// }, {
    +}, {
    +  method: 'ulist',
    +  title: '无序列表',
    +  icon: 'format-list-bulleted',
    +}, {
    +  method: 'olist',
    +  title: '有序列表',
    +  icon: 'format-list-numbers',
    +}, {
    +  method: 'clist',
    +  title: '可选列表',
    +  icon: 'format-list-checks',
    +// }, {
    +}, {
    +  method: 'quote',
    +  title: '块引用',
    +  icon: 'format-quote-close',
    +}, {
    +  method: 'code',
    +  title: '代码',
    +  icon: 'code-tags',
    +}, {
    +  method: 'table',
    +  title: '表格',
    +  icon: 'table',
    +}, {
    +  method: 'link',
    +  title: '链接',
    +  icon: 'link-variant',
    +}, {
    +  method: 'image',
    +  title: '图片',
    +  icon: 'file-image',
    +}, {
    +  method: 'chatgpt',
    +  title: 'ChatGPT',
    +  icon: 'chat-gpt',
    +}];
    diff --git a/src/data/presets.js b/src/data/presets.js
    new file mode 100644
    index 0000000..fb60a50
    --- /dev/null
    +++ b/src/data/presets.js
    @@ -0,0 +1,114 @@
    +const zero = {
    +  // Markdown extensions
    +  markdown: {
    +    abbr: false,
    +    breaks: false,
    +    deflist: false,
    +    del: false,
    +    fence: false,
    +    footnote: false,
    +    imgsize: false,
    +    linkify: false,
    +    mark: false,
    +    sub: false,
    +    sup: false,
    +    table: false,
    +    tasklist: false,
    +    typographer: false,
    +    toc: false,
    +  },
    +  // Emoji extension
    +  emoji: {
    +    enabled: false,
    +    // Enable shortcuts like :) :-(
    +    shortcuts: false,
    +  },
    +  /*
    +  ABC Notation extension
    +  Render abc-notation code blocks to music sheets
    +  See https://abcjs.net/
    +  */
    +  abc: {
    +    enabled: false,
    +  },
    +  /*
    +  Katex extension
    +  Render LaTeX mathematical expressions using:
    +    $...$ for inline formulas
    +    $$...$$ for displayed formulas.
    +  See https://math.meta.stackexchange.com/questions/5020
    +  */
    +  katex: {
    +    enabled: false,
    +  },
    +  /*
    +  Mermaid extension
    +  Convert code blocks starting with ```mermaid
    +  into diagrams and flowcharts.
    +  See https://mermaidjs.github.io/
    +  */
    +  mermaid: {
    +    enabled: false,
    +  },
    +  /*
    +  Toc extension
    +  把 [TOC] 转换为目录
    +  */
    +  toc: {
    +    enabled: false,
    +  },
    +};
    +
    +export default {
    +  zero: [zero],
    +  commonmark: [zero, {
    +    markdown: {
    +      fence: true,
    +    },
    +  }],
    +  gfm: [zero, {
    +    markdown: {
    +      breaks: true,
    +      del: true,
    +      fence: true,
    +      linkify: true,
    +      table: true,
    +      tasklist: true,
    +      toc: true,
    +    },
    +    emoji: {
    +      enabled: true,
    +    },
    +  }],
    +  default: [zero, {
    +    markdown: {
    +      abbr: true,
    +      breaks: true,
    +      deflist: true,
    +      del: true,
    +      fence: true,
    +      footnote: true,
    +      imgsize: true,
    +      linkify: true,
    +      mark: true,
    +      sub: true,
    +      sup: true,
    +      table: true,
    +      tasklist: true,
    +      toc: true,
    +      typographer: true,
    +    },
    +    emoji: {
    +      enabled: true,
    +    },
    +    katex: {
    +      enabled: true,
    +    },
    +    mermaid: {
    +      enabled: true,
    +    },
    +    abc: {
    +      enabled: true,
    +    },
    +  }],
    +};
    diff --git a/src/data/simpleModals.js b/src/data/simpleModals.js
    new file mode 100644
    index 0000000..3628027
    --- /dev/null
    +++ b/src/data/simpleModals.js
    @@ -0,0 +1,136 @@
    +const simpleModal = (contentHtml, rejectText, resolveText, resolveArray) => ({
    +  contentHtml: typeof contentHtml === 'function' ? contentHtml : () => contentHtml,
    +  rejectText,
    +  resolveArray,
    +  resolveText,
    +});
    +
    +/* eslint sort-keys: "error" */
    +export default {
    +  autoSyncWorkspace: simpleModal(
    +    config => `

    您将启动文档空间 ${config.name}的自动同步。
    启动后无法自定义提交信息。
    你确定吗?

    `, + '取消', + '确认启动', + ), + commentDeletion: simpleModal( + '

    您将要删除评论。你确定吗?

    ', + '取消', + '确认删除', + ), + discussionDeletion: simpleModal( + '

    您将要删除批注。你确定吗?

    ', + '取消', + '确认删除', + ), + fileRestoration: simpleModal( + '

    您将要恢复一些更改。你确定吗?

    ', + '取消', + '确认恢复', + ), + folderDeletion: simpleModal( + config => `

    您将删除文件夹${config.item.name}。它的文件将移至回收站。你确定吗?

    `, + '取消', + '确认删除', + ), + imgStorageDeletion: simpleModal( + '

    您将要删除图床,你确定吗?

    ', + '取消', + '确认删除', + ), + pathConflict: simpleModal( + config => `

    ${config.item.name}已经存在。您要添加后缀吗?

    `, + '取消', + '确认添加', + ), + paymentSuccess: simpleModal( + '

    感谢您的付款!

    您的赞助将在一分钟内活跃。

    ', + '好的', + ), + providerRedirection: simpleModal( + config => `

    您将跳转到 ${config.name} 授权页面。

    `, + '取消', + '确认跳转', + ), + removeWorkspace: simpleModal( + config => `

    您将要在本地删除文档空间${config.name}。你确定吗?

    `, + '取消', + '确认删除', + ), + reset: simpleModal( + '

    这将在本地清理所有文档空间,你确定吗?

    ', + '取消', + '确认清理', + ), + shareHtml: simpleModal( + config => `

    给文档 "${config.name}" 创建了分享链接如下:
    ${config.url}
    关闭该窗口后可以到发布中查看分享链接。

    `, + '关闭窗口', + ), + shareHtmlPre: simpleModal( + config => `

    将给文档 "${config.name}" 创建分享链接,创建后将会把文档公开发布到默认空间账号的Gist中。您确定吗?

    `, + '取消', + '确认分享', + ), + signInForComment: simpleModal( + `

    您必须使用 Gitee或GitHub 登录默认文档空间后才能开始评论。

    + `, + '取消', + '', + [{ + text: 'Gitee登录', + value: 'gitee', + }, { + text: 'GitHub登录', + value: 'github', + }], + ), + signInForSponsorship: simpleModal( + `

    您必须使用 Gitee或GitHub 登录才能赞助。

    + `, + '取消', + '', + [{ + text: 'Gitee登录', + value: 'gitee', + }, { + text: 'GitHub登录', + value: 'github', + }], + ), + sponsorOnly: simpleModal( + '

    此功能仅限于赞助商,因为它依赖于服务器资源。

    ', + '好的,我明白了', + ), + stopAutoSyncWorkspace: simpleModal( + config => `

    您将关闭文档空间 ${config.name} 的自动同步。
    关闭后您需要手动触发同步,但可以自定义提交信息。
    你确定吗?

    `, + '取消', + '确认关闭', + ), + stripName: simpleModal( + config => `

    ${config.item.name}包含非法字符。你想去掉它们吗?

    `, + '取消', + '确认去掉', + ), + tempFileDeletion: simpleModal( + config => `

    您将永久删除临时文件${config.item.name}。你确定吗?

    `, + '取消', + '确认删除', + ), + tempFolderDeletion: simpleModal( + '

    您将永久删除所有临时文件。你确定吗?

    ', + '取消', + '确认删除', + ), + trashDeletion: simpleModal( + '

    回收站中的文件在不活动7天后会自动删除。

    ', + '好的', + ), + unauthorizedName: simpleModal( + config => `

    ${config.item.name}>是未经授权的名称。

    `, + '好的', + ), + workspaceGoogleRedirection: simpleModal( + '

    StackEdit中文版需要完整的Google Drive访问才能打开此文档空间。

    ', + '取消', + '确认授权', + ), +}; diff --git a/src/data/templates/jekyllSiteTemplate.html b/src/data/templates/jekyllSiteTemplate.html new file mode 100644 index 0000000..69da7fb --- /dev/null +++ b/src/data/templates/jekyllSiteTemplate.html @@ -0,0 +1,5 @@ +--- +{{{files.0.content.yamlProperties}}} +--- + +{{{files.0.content.html}}} diff --git a/src/data/templates/plainHtmlTemplate.html b/src/data/templates/plainHtmlTemplate.html new file mode 100644 index 0000000..42b6b5d --- /dev/null +++ b/src/data/templates/plainHtmlTemplate.html @@ -0,0 +1 @@ +{{{files.0.content.html}}} diff --git a/src/data/templates/styledHtmlTemplate.html b/src/data/templates/styledHtmlTemplate.html new file mode 100644 index 0000000..d6e3b59 --- /dev/null +++ b/src/data/templates/styledHtmlTemplate.html @@ -0,0 +1,19 @@ + + + + + + + {{files.0.name}} + + + +{{#if pdf}} + +{{else}} + +{{/if}} +
    {{{files.0.content.html}}}
    + + + diff --git a/src/data/templates/styledHtmlWithThemeAndTocTemplate.html b/src/data/templates/styledHtmlWithThemeAndTocTemplate.html new file mode 100644 index 0000000..1ccb208 --- /dev/null +++ b/src/data/templates/styledHtmlWithThemeAndTocTemplate.html @@ -0,0 +1,43 @@ + + + + + + + {{files.0.name}} + + + + +{{#if pdf}} + +{{else}} + +{{/if}} +
    +
    + {{#tocToHtml files.0.content.toc 2}}{{/tocToHtml}} +
    +
    +
    +
    +
    + {{{files.0.content.html}}} +
    +
    +
    + + + diff --git a/src/data/templates/styledHtmlWithThemeTemplate.html b/src/data/templates/styledHtmlWithThemeTemplate.html new file mode 100644 index 0000000..78ede0c --- /dev/null +++ b/src/data/templates/styledHtmlWithThemeTemplate.html @@ -0,0 +1,36 @@ + + + + + + + {{files.0.name}} + + + + +{{#if pdf}} + +{{else}} + +{{/if}} +
    +
    + {{{files.0.content.html}}} +
    +
    + + + diff --git a/src/data/templates/styledHtmlWithTocTemplate.html b/src/data/templates/styledHtmlWithTocTemplate.html new file mode 100644 index 0000000..3952991 --- /dev/null +++ b/src/data/templates/styledHtmlWithTocTemplate.html @@ -0,0 +1,28 @@ + + + + + + + {{files.0.name}} + + + +{{#if pdf}} + +{{else}} + +{{/if}} +
    +
    + {{#tocToHtml files.0.content.toc 2}}{{/tocToHtml}} +
    +
    +
    +
    + {{{files.0.content.html}}} +
    +
    + + + diff --git a/src/data/welcomeFile.md b/src/data/welcomeFile.md new file mode 100644 index 0000000..efa57c4 --- /dev/null +++ b/src/data/welcomeFile.md @@ -0,0 +1,145 @@ +# 欢迎来到 StackEdit 中文版! + +你好!我是你在 **StackEdit中文版** 中的第一个 Markdown 文件。如果你想了解 StackEdit中文版,可以阅读此文章。如果你想玩 Markdown,你也可以编辑此文章。另外,您可以通过打开导航栏左边的**文件资源管理器**来创建新文件。 + +# 文件 + +StackEdit中文版 将您的文件存储在您的浏览器中,这意味着您的所有文件都会自动保存在本地并且可以**离线访问!** + +## 创建文件和文件夹 + +使用导航栏左边的文件夹图标可以访问文件资源管理器。您可以通过单击文件资源管理器中的 **创建文件** 图标来创建新文件。您还可以通过单击 **创建文件夹** 图标来创建文件夹。 + +## 切换到另一个文件 + +您的所有文件和文件夹在文件资源管理器中都显示为树。您可以通过单击树中的文件从一个文件切换到另一个文件。 + +## 重命名文件 + +您可以通过单击导航栏中的文件名或单击文件资源管理器中的**重命名**图标来重命名当前文件。 + +## 搜索文件 + +您可以通过单击文件资源管理器中的**搜索文件**图标来通过关键字在整个文档空间中搜索文件。 + +## 删除一个文件 + +您可以通过单击文件资源管理器中的 **删除** 图标来删除当前文件。该文件将被移至 **回收站** 文件夹并在 7 天不活动后自动删除。 + +## 导出文件 + +您可以通过单击菜单中的 **导入/导出** 来导出当前文件。您可以选择将文件导出为纯 Markdown、使用 Handlebars 模板的 HTML 或 PDF。 + + +# 同步 + +同步是 StackEdit中文版 的最大特点之一。它使您可以将文档空间中的任何文件与存储在**Gitee** 和 **GitHub** 账号中的其他文件同步。这使您可以继续在其他设备上写作,与您共享文件的人协作,轻松集成到您的工作流程中......同步机制在后台每分钟触发一次,下载、合并和上传文件修改。 + +有两种类型的同步,它们可以相互补充: + +- 文档空间同步将自动同步您的所有文件、文件夹和设置。这将允许您在任何其他设备上获取您的文档空间。 +> 要开始同步您的文档空间,只需在菜单中使用 Gitee 登录。 + +- 文件同步将保持文档空间的一个文件与**Gitee**或**GitHub**中的一个或多个文件同步。 +> 在开始同步文件之前,您必须在**同步**子菜单中链接一个账号。 + +## 打开一个文件 + +您可以通过打开 **同步** 子菜单并单击 **从...打开** 从**Gitee** 或 **GitHub** 打开文件。在文档空间中打开后,文件中的任何修改都将自动同步。 + +## 保存文件 + +您可以通过打开 **同步** 子菜单并单击 **在...保存** 将文档空间的任何文件保存到**Gitee** 或 **GitHub**。即使文档空间中的文件已经同步,您也可以将其保存到另一个位置。 StackEdit中文版 可以将一个文件与多个位置和账号同步。 + +## 同步文件 + +一旦您的文件链接到同步位置,StackEdit中文版 将通过下载/上传任何修改来定期同步它。如有必要,将执行合并并解决冲突。 + +如果您刚刚修改了文件并且想要强制同步,请单击导航栏中的 **立即同步** 按钮。 + +> **注意:** 如果您没有要同步的文件,**立即同步**按钮将被禁用。 + +## 管理文件同步 + +由于一个文件可以与多个位置同步,您可以通过单击**同步**子菜单中的**文件同步**列出和管理同步位置。这允许您列出和删除链接到您的文件的同步位置。 + + +# 发布 + +在 StackEdit中文版 中发布使您可以轻松地在线发布文件。对文件感到满意后,您可以将其发布到不同的托管平台,例如 **Blogger**、**Gitee**、**Gist**、**GitHub**、**WordPress** 和 **Zendesk**。使用 [Handlebars 模板](http://handlebarsjs.com/),您可以完全控制导出的内容。 + +> 在开始发布之前,您必须在**发布**子菜单中链接一个账号。 + +## 发布文件 + +您可以通过打开 **发布** 子菜单并单击 **发布到** 来发布您的文件。对于某些位置,您可以选择以下格式: + +- Markdown:在可以解释的网站上发布 Markdown 文本(例如**GitHub**), +- HTML:通过 Handlebars 模板发布转换为 HTML 的文件(例如在博客上)。 + +## 更新发布 + +发布后,StackEdit中文版 会将您的文件链接到该发布,这使您可以轻松地重新发布它。一旦您修改了文件并想要更新您的发布,请单击导航栏中的**立即发布**按钮。 + +> **注意:** 如果您没有要同步的文件,**立即同步**按钮将被禁用。 + +## 管理文件同步 + +由于一个文件可以与多个位置同步,您可以通过单击**同步**子菜单中的**文件同步**列出和管理同步位置。这允许您列出和删除链接到您的文件的同步位置。 + +# Markdown扩展 + +StackEdit中文版 通过添加额外的 **Markdown扩展** 扩展了标准 Markdown 语法,为您提供了一些不错的功能。 + +> **提示:** 您可以在 **文件属性** 对话框中禁用任何 **Markdown 扩展名**。 + + +## SmartyPants + +SmartyPants 将 ASCII 标点字符转换为“智能”印刷标点 HTML 实体。例如: + +| |ASCII |HTML | +|----------------|--------------------------------| ------------------------------| +|单反引号|`'这不好玩吗?'` |'这不好玩吗?' | +|引用|`“这不好玩吗?”` |“这不好玩吗?” | +|破折号 |`-- 是破折号,--- 是破折号`|-- 是破折号,--- 是破折号| + + +## KaTeX + +您可以使用 [KaTeX](https://khan.github.io/KaTeX/) 渲染 LaTeX 数学表达式: + +满足 $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ 的 *Gamma 函数* 是通过欧拉积分 + +$$ +\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. +$$ + +> 您可以在 [这里](http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference) 找到有关 **LaTeX** 数学表达式的更多信息。 + + +## UML 图 + +您可以使用 [Mermaid](https://mermaidjs.github.io/) 渲染 UML 图。例如,这将产生一个序列图: + +```mermaid +sequenceDiagram +爱丽丝 ->> 鲍勃: 你好鲍勃,你好吗? +鲍勃-->>约翰: 约翰,你呢? +鲍勃--x 爱丽丝: 我很好,谢谢! +鲍勃-x 约翰: 我很好,谢谢! +Note right of 约翰: 鲍勃想了很长
    很长的时间,太长了
    文本确实
    不能放在一行中。 + +鲍勃-->爱丽丝: 正在和 John 核对... +爱丽丝->约翰: 是的……约翰,你好吗? +``` + +这将产生一个流程图: + +```mermaid +graph LR +A[长方形] -- 链接文本 --> B((圆形)) +A --> C(圆角矩形) +B --> D{菱形} +C --> D +``` diff --git a/src/extensions/abcExtension.js b/src/extensions/abcExtension.js new file mode 100644 index 0000000..850773a --- /dev/null +++ b/src/extensions/abcExtension.js @@ -0,0 +1,21 @@ +import renderAbc from 'abcjs/src/api/abc_tunebook_svg'; +import extensionSvc from '../services/extensionSvc'; + +const render = (elt) => { + const content = elt.textContent; + // Create a div element + const divElt = document.createElement('div'); + divElt.className = 'abc-notation-block'; + // Replace the pre element with the div + elt.parentNode.parentNode.replaceChild(divElt, elt.parentNode); + renderAbc(divElt, content, {}); +}; + +extensionSvc.onGetOptions((options, properties) => { + options.abc = properties.extensions.abc.enabled; +}); + +extensionSvc.onSectionPreview((elt) => { + elt.querySelectorAll('.prism.language-abc') + .cl_each(notationElt => render(notationElt)); +}); diff --git a/src/extensions/emojiExtension.js b/src/extensions/emojiExtension.js new file mode 100644 index 0000000..7146ced --- /dev/null +++ b/src/extensions/emojiExtension.js @@ -0,0 +1,13 @@ +import markdownItEmoji from 'markdown-it-emoji'; +import extensionSvc from '../services/extensionSvc'; + +extensionSvc.onGetOptions((options, properties) => { + options.emoji = properties.extensions.emoji.enabled; + options.emojiShortcuts = properties.extensions.emoji.shortcuts; +}); + +extensionSvc.onInitConverter(1, (markdown, options) => { + if (options.emoji) { + markdown.use(markdownItEmoji, options.emojiShortcuts ? {} : { shortcuts: {} }); + } +}); diff --git a/src/extensions/index.js b/src/extensions/index.js new file mode 100644 index 0000000..347b396 --- /dev/null +++ b/src/extensions/index.js @@ -0,0 +1,5 @@ +import './emojiExtension'; +import './abcExtension'; +import './katexExtension'; +import './markdownExtension'; +import './mermaidExtension'; diff --git a/src/extensions/katexExtension.js b/src/extensions/katexExtension.js new file mode 100644 index 0000000..4eb3d19 --- /dev/null +++ b/src/extensions/katexExtension.js @@ -0,0 +1,32 @@ +import katex from 'katex'; +import markdownItMath from './libs/markdownItMath'; +import extensionSvc from '../services/extensionSvc'; + +extensionSvc.onGetOptions((options, properties) => { + options.math = properties.extensions.katex.enabled; +}); + +extensionSvc.onInitConverter(2, (markdown, options) => { + if (options.math) { + markdown.use(markdownItMath); + markdown.renderer.rules.inline_math = (tokens, idx) => + `${markdown.utils.escapeHtml(tokens[idx].content)}`; + markdown.renderer.rules.display_math = (tokens, idx) => + `${markdown.utils.escapeHtml(tokens[idx].content)}`; + } +}); + +extensionSvc.onSectionPreview((elt) => { + const highlighter = displayMode => (katexElt) => { + if (!katexElt.highlighted) { + try { + katex.render(katexElt.textContent, katexElt, { displayMode }); + } catch (e) { + katexElt.textContent = `${e.message}`; + } + } + katexElt.highlighted = true; + }; + elt.querySelectorAll('.katex--inline').cl_each(highlighter(false)); + elt.querySelectorAll('.katex--display').cl_each(highlighter(true)); +}); diff --git a/src/extensions/libs/markdownItAnchor.js b/src/extensions/libs/markdownItAnchor.js new file mode 100644 index 0000000..8281c4a --- /dev/null +++ b/src/extensions/libs/markdownItAnchor.js @@ -0,0 +1,133 @@ +function groupHeadings(headings, level = 1) { + const result = []; + let currentItem; + + function pushCurrentItem() { + if (currentItem) { + if (currentItem.children.length > 0) { + currentItem.children = groupHeadings(currentItem.children, level + 1); + } + result.push(currentItem); + } + } + headings.forEach((heading) => { + if (heading.level !== level) { + currentItem = currentItem || { + children: [], + }; + currentItem.children.push(heading); + } else { + pushCurrentItem(); + currentItem = heading; + } + }); + pushCurrentItem(); + return result; +} + +function arrayToHtml(arr) { + if (!arr || !arr.length) { + return ''; + } + const ulHtml = arr.map((item) => { + let result = `
  • `; + if (item.anchor && item.title) { + result += `${item.title}`; + } + result += arrayToHtml(item.children); + return `${result}
  • `; + }).join('\n'); + return `
      ${ulHtml}
    `; +} + +export default (md) => { + md.core.ruler.before('replacements', 'anchors', (state) => { + const anchorHash = {}; + let headingOpenToken; + let headingContent; + const tocTokens = []; + const headings = []; + state.tokens.forEach((token) => { + if (token.type === 'heading_open') { + headingContent = ''; + headingOpenToken = token; + } else if (token.type === 'heading_close') { + headingOpenToken.headingContent = headingContent; + + // According to http://pandoc.org/README.html#extension-auto_identifiers + let slug = headingContent + .replace(/]*>/g, '') // Replace image to empty + .replace(/\s/g, '-') // Replace all spaces and newlines with hyphens + .replace(/[\0-,/:-@[-^`{-~]/g, '') // Remove all punctuation, except underscores, hyphens, and periods + .toLowerCase(); // Convert all alphabetic characters to lowercase + + // Remove everything up to the first letter + let i; + for (i = 0; i < slug.length; i += 1) { + const charCode = slug.charCodeAt(i); + if ((charCode >= 0x30 && charCode <= 0x39) || // 0-9 + (charCode >= 0x61 && charCode <= 0x7A) || // a-z + charCode > 0x7E) { + break; + } + } + + // If nothing left after this, use `section` + slug = slug.slice(i) || 'section'; + + let anchor = slug; + let index = 1; + while (Object.prototype.hasOwnProperty.call(anchorHash, anchor)) { + anchor = `${slug}-${index}`; + index += 1; + } + anchorHash[anchor] = true; + headingOpenToken.headingAnchor = anchor; + headingOpenToken.attrs = [ + ['id', anchor], + ]; + headings.push({ + title: headingOpenToken.headingContent, + anchor: headingOpenToken.headingAnchor, + level: parseInt(headingOpenToken.tag.slice(1), 10), + children: [], + }); + headingOpenToken = undefined; + } else if (headingOpenToken) { + headingContent += token.children.reduce((result, child) => { + if (child.type !== 'footnote_ref') { + return result + child.content; + } + return result; + }, ''); + } + if (token.type === 'inline' && (token.content === '[TOC]' || token.content === '[toc]')) { + tocTokens.push(token); + } + }); + // 没有TOC 直接返回 + if (tocTokens.length === 0) { + return; + } + // 没有header + if (headings.length === 0) { + // 置空[TOC]文案为空字符串 + tocTokens.forEach((tocToken) => { + tocToken.children[0].content = ''; + tocToken.content = ''; + }); + } else { + tocTokens.forEach((tocToken) => { + // toc目录 + const toc = groupHeadings(headings); + // 拼接为html + const tocHtml = arrayToHtml(toc); + const tocDiv = new state.Token('html_inline', '', 0); + tocDiv.content = `
    ${tocHtml}
    `; + tocToken.children.unshift(tocDiv); + tocToken.children[1].content = ''; + tocToken.content = ''; + }); + } + }); +}; diff --git a/src/extensions/libs/markdownItMath.js b/src/extensions/libs/markdownItMath.js new file mode 100644 index 0000000..3b07c79 --- /dev/null +++ b/src/extensions/libs/markdownItMath.js @@ -0,0 +1,69 @@ +function texMath(state, silent) { + let startMathPos = state.pos; + if (state.src.charCodeAt(startMathPos) !== 0x24 /* $ */) { + return false; + } + + // Parse tex math according to http://pandoc.org/README.html#math + let endMarker = '$'; + startMathPos += 1; + const afterStartMarker = state.src.charCodeAt(startMathPos); + if (afterStartMarker === 0x24 /* $ */) { + endMarker = '$$'; + startMathPos += 1; + if (state.src.charCodeAt(startMathPos) === 0x24 /* $ */) { + // 3 markers are too much + return false; + } + } else if ( + // Skip if opening $ is succeeded by a space character + afterStartMarker === 0x20 /* space */ + || afterStartMarker === 0x09 /* \t */ + || afterStartMarker === 0x0a /* \n */ + ) { + return false; + } + function getIndex(tempStartMathPos) { + const tempEndMarkerPos = state.src.indexOf(endMarker, tempStartMathPos); + if (tempEndMarkerPos === -1) { + return tempEndMarkerPos; + } + if (state.src.charCodeAt(tempEndMarkerPos - 1) === 0x5C /* \ */) { + if (state.src.length - 1 > tempEndMarkerPos) { + return getIndex(tempEndMarkerPos + 1); + } + return -1; + } + return tempEndMarkerPos; + } + const endMarkerPos = getIndex(startMathPos); + if (endMarkerPos === -1) { + return false; + } + const nextPos = endMarkerPos + endMarker.length; + if (endMarker.length === 1) { + // Skip if $ is preceded by a space character + const beforeEndMarker = state.src.charCodeAt(endMarkerPos - 1); + if (beforeEndMarker === 0x20 /* space */ + || beforeEndMarker === 0x09 /* \t */ + || beforeEndMarker === 0x0a /* \n */) { + return false; + } + // Skip if closing $ is succeeded by a digit (eg $5 $10 ...) + const suffix = state.src.charCodeAt(nextPos); + if (suffix >= 0x30 && suffix < 0x3A) { + return false; + } + } + + if (!silent) { + const token = state.push(endMarker.length === 1 ? 'inline_math' : 'display_math', '', 0); + token.content = state.src.slice(startMathPos, endMarkerPos); + } + state.pos = nextPos; + return true; +} + +export default (md) => { + md.inline.ruler.push('texMath', texMath); +}; diff --git a/src/extensions/libs/markdownItTasklist.js b/src/extensions/libs/markdownItTasklist.js new file mode 100644 index 0000000..45fccc2 --- /dev/null +++ b/src/extensions/libs/markdownItTasklist.js @@ -0,0 +1,40 @@ +function attrSet(token, name, value) { + const index = token.attrIndex(name); + const attr = [name, value]; + + if (index < 0) { + token.attrPush(attr); + } else { + token.attrs[index] = attr; + } +} + +module.exports = (md) => { + md.core.ruler.after('inline', 'tasklist', ({ tokens, Token }) => { + for (let i = 2; i < tokens.length; i += 1) { + const token = tokens[i]; + if (token.content + && token.content.charCodeAt(0) === 0x5b /* [ */ + && token.content.charCodeAt(2) === 0x5d /* ] */ + && token.content.charCodeAt(3) === 0x20 /* space */ + && token.type === 'inline' + && tokens[i - 1].type === 'paragraph_open' + && tokens[i - 2].type === 'list_item_open' + ) { + const cross = token.content[1].toLowerCase(); + if (cross === ' ' || cross === 'x') { + const checkbox = new Token('html_inline', '', 0); + if (cross === ' ') { + checkbox.content = ''; + } else { + checkbox.content = ''; + } + token.children.unshift(checkbox); + token.children[1].content = token.children[1].content.slice(3); + token.content = token.content.slice(3); + attrSet(tokens[i - 2], 'class', 'task-list-item'); + } + } + } + }); +}; diff --git a/src/extensions/markdownExtension.js b/src/extensions/markdownExtension.js new file mode 100644 index 0000000..f2c33e0 --- /dev/null +++ b/src/extensions/markdownExtension.js @@ -0,0 +1,163 @@ +import Prism from 'prismjs'; +import markdownitAbbr from 'markdown-it-abbr'; +import markdownitDeflist from 'markdown-it-deflist'; +import markdownitFootnote from 'markdown-it-footnote'; +import markdownitMark from 'markdown-it-mark'; +import markdownitImgsize from 'markdown-it-imsize'; +import markdownitSub from 'markdown-it-sub'; +import markdownitSup from 'markdown-it-sup'; +import markdownitTasklist from './libs/markdownItTasklist'; +import markdownitAnchor from './libs/markdownItAnchor'; +import extensionSvc from '../services/extensionSvc'; + +const coreBaseRules = [ + 'normalize', + 'block', + 'inline', + 'linkify', + 'replacements', + 'smartquotes', +]; +const blockBaseRules = [ + 'code', + 'fence', + 'blockquote', + 'hr', + 'list', + 'reference', + 'heading', + 'lheading', + 'html_block', + 'table', + 'paragraph', +]; +const inlineBaseRules = [ + 'text', + 'newline', + 'escape', + 'backticks', + 'strikethrough', + 'emphasis', + 'link', + 'image', + 'autolink', + 'html_inline', + 'entity', +]; +const inlineBaseRules2 = [ + 'balance_pairs', + 'strikethrough', + 'emphasis', + 'text_collapse', +]; + +extensionSvc.onGetOptions((options, properties) => Object + .assign(options, properties.extensions.markdown)); + +extensionSvc.onInitConverter(0, (markdown, options) => { + markdown.set({ + html: true, + breaks: !!options.breaks, + linkify: !!options.linkify, + typographer: !!options.typographer, + langPrefix: 'prism language-', + }); + + markdown.core.ruler.enable(coreBaseRules); + + const blockRules = blockBaseRules.slice(); + if (!options.fence) { + blockRules.splice(blockRules.indexOf('fence'), 1); + } + if (!options.table) { + blockRules.splice(blockRules.indexOf('table'), 1); + } + markdown.block.ruler.enable(blockRules); + + const inlineRules = inlineBaseRules.slice(); + const inlineRules2 = inlineBaseRules2.slice(); + if (!options.del) { + inlineRules.splice(blockRules.indexOf('strikethrough'), 1); + inlineRules2.splice(blockRules.indexOf('strikethrough'), 1); + } + markdown.inline.ruler.enable(inlineRules); + markdown.inline.ruler2.enable(inlineRules2); + + if (options.abbr) { + markdown.use(markdownitAbbr); + } + if (options.deflist) { + markdown.use(markdownitDeflist); + } + if (options.footnote) { + markdown.use(markdownitFootnote); + } + if (options.imgsize) { + markdown.use(markdownitImgsize); + } + if (options.mark) { + markdown.use(markdownitMark); + } + if (options.sub) { + markdown.use(markdownitSub); + } + if (options.sup) { + markdown.use(markdownitSup); + } + if (options.tasklist) { + markdown.use(markdownitTasklist); + } + markdown.use(markdownitAnchor); + + // Wrap tables into a div for scrolling + markdown.renderer.rules.table_open = (tokens, idx, opts) => + `
    ${markdown.renderer.renderToken(tokens, idx, opts)}`; + markdown.renderer.rules.table_close = (tokens, idx, opts) => + `${markdown.renderer.renderToken(tokens, idx, opts)}
    `; + + // Transform style into align attribute to pass the HTML sanitizer + const textAlignLength = 'text-align:'.length; + markdown.renderer.rules.td_open = (tokens, idx, opts) => { + const token = tokens[idx]; + if (token.attrs && token.attrs.length && token.attrs[0][0] === 'style') { + token.attrs = [ + ['align', token.attrs[0][1].slice(textAlignLength)], + ]; + } + return markdown.renderer.renderToken(tokens, idx, opts); + }; + markdown.renderer.rules.th_open = markdown.renderer.rules.td_open; + + markdown.renderer.rules.footnote_ref = (tokens, idx) => { + const n = `${Number(tokens[idx].meta.id + 1)}`; + let id = `fnref${n}`; + if (tokens[idx].meta.subId > 0) { + id += `:${tokens[idx].meta.subId}`; + } + return `[${n}]`; + }; +}); + +extensionSvc.onSectionPreview((elt, options, isEditor) => { + // Highlight with Prism + elt.querySelectorAll('.prism').cl_each((prismElt) => { + if (!prismElt.$highlightedWithPrism) { + Prism.highlightElement(prismElt); + prismElt.$highlightedWithPrism = true; + } + }); + + // Transform task spans into checkboxes + elt.querySelectorAll('span.task-list-item-checkbox').cl_each((spanElt) => { + const checkboxElt = document.createElement('input'); + checkboxElt.type = 'checkbox'; + checkboxElt.className = 'task-list-item-checkbox'; + if (spanElt.classList.contains('checked')) { + checkboxElt.setAttribute('checked', true); + } + if (!isEditor) { + checkboxElt.disabled = 'disabled'; + } + spanElt.parentNode.replaceChild(checkboxElt, spanElt); + }); +}); diff --git a/src/extensions/mermaidExtension.js b/src/extensions/mermaidExtension.js new file mode 100644 index 0000000..bd70f4e --- /dev/null +++ b/src/extensions/mermaidExtension.js @@ -0,0 +1,73 @@ +import 'mermaid'; +import extensionSvc from '../services/extensionSvc'; +import utils from '../services/utils'; + +const config = { + logLevel: 5, + startOnLoad: false, + arrowMarkerAbsolute: false, + theme: 'neutral', + flowchart: { + htmlLabels: true, + curve: 'linear', + }, + sequence: { + diagramMarginX: 50, + diagramMarginY: 10, + actorMargin: 50, + width: 150, + height: 65, + boxMargin: 10, + boxTextMargin: 5, + noteMargin: 10, + messageMargin: 35, + mirrorActors: true, + bottomMarginAdj: 1, + useMaxWidth: true, + }, + gantt: { + titleTopMargin: 25, + barHeight: 20, + barGap: 4, + topPadding: 50, + leftPadding: 75, + gridLineStartPadding: 35, + fontSize: 11, + fontFamily: '"Open-Sans", "sans-serif"', + numberSectionStyles: 4, + axisFormat: '%Y-%m-%d', + }, +}; + +const containerElt = document.createElement('div'); +containerElt.className = 'hidden-rendering-container'; +document.body.appendChild(containerElt); + +let init = () => { + window.mermaid.initialize(config); + init = () => {}; +}; + +const render = (elt) => { + try { + init(); + const svgId = `mermaid-svg-${utils.uid()}`; + window.mermaid.mermaidAPI.render(svgId, elt.textContent, () => { + while (elt.firstChild) { + elt.removeChild(elt.lastChild); + } + elt.appendChild(containerElt.querySelector(`#${svgId}`)); + }, containerElt); + } catch (e) { + console.error(e); // eslint-disable-line no-console + } +}; + +extensionSvc.onGetOptions((options, properties) => { + options.mermaid = properties.extensions.mermaid.enabled; +}); + +extensionSvc.onSectionPreview((elt) => { + elt.querySelectorAll('.prism.language-mermaid') + .cl_each(diagramElt => render(diagramElt.parentNode)); +}); diff --git a/src/icons/Alert.vue b/src/icons/Alert.vue new file mode 100644 index 0000000..cd0928a --- /dev/null +++ b/src/icons/Alert.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ArrowLeft.vue b/src/icons/ArrowLeft.vue new file mode 100644 index 0000000..2fc8bf0 --- /dev/null +++ b/src/icons/ArrowLeft.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ChatGpt.vue b/src/icons/ChatGpt.vue new file mode 100644 index 0000000..18bf3df --- /dev/null +++ b/src/icons/ChatGpt.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/icons/CheckCircle.vue b/src/icons/CheckCircle.vue new file mode 100644 index 0000000..7436ca9 --- /dev/null +++ b/src/icons/CheckCircle.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/CheckCircleUn.vue b/src/icons/CheckCircleUn.vue new file mode 100644 index 0000000..698c3c3 --- /dev/null +++ b/src/icons/CheckCircleUn.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Close.vue b/src/icons/Close.vue new file mode 100644 index 0000000..1802bf1 --- /dev/null +++ b/src/icons/Close.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/CodeBraces.vue b/src/icons/CodeBraces.vue new file mode 100644 index 0000000..e77a3ea --- /dev/null +++ b/src/icons/CodeBraces.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/CodeTags.vue b/src/icons/CodeTags.vue new file mode 100644 index 0000000..b12e7b0 --- /dev/null +++ b/src/icons/CodeTags.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ContentCopy.vue b/src/icons/ContentCopy.vue new file mode 100644 index 0000000..6aacf0c --- /dev/null +++ b/src/icons/ContentCopy.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ContentSave.vue b/src/icons/ContentSave.vue new file mode 100644 index 0000000..6478822 --- /dev/null +++ b/src/icons/ContentSave.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Copy.vue b/src/icons/Copy.vue new file mode 100644 index 0000000..2a962b0 --- /dev/null +++ b/src/icons/Copy.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/icons/Database.vue b/src/icons/Database.vue new file mode 100644 index 0000000..7f7be0b --- /dev/null +++ b/src/icons/Database.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Delete.vue b/src/icons/Delete.vue new file mode 100644 index 0000000..ca1d02d --- /dev/null +++ b/src/icons/Delete.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/DotsHorizontal.vue b/src/icons/DotsHorizontal.vue new file mode 100644 index 0000000..4376aee --- /dev/null +++ b/src/icons/DotsHorizontal.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Download.vue b/src/icons/Download.vue new file mode 100644 index 0000000..f49fba9 --- /dev/null +++ b/src/icons/Download.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Ellipsis.vue b/src/icons/Ellipsis.vue new file mode 100644 index 0000000..f0e7caf --- /dev/null +++ b/src/icons/Ellipsis.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/icons/Eye.vue b/src/icons/Eye.vue new file mode 100644 index 0000000..376d0c5 --- /dev/null +++ b/src/icons/Eye.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FileImage.vue b/src/icons/FileImage.vue new file mode 100644 index 0000000..360af23 --- /dev/null +++ b/src/icons/FileImage.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FileMultiple.vue b/src/icons/FileMultiple.vue new file mode 100644 index 0000000..aa4bd3f --- /dev/null +++ b/src/icons/FileMultiple.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FilePlus.vue b/src/icons/FilePlus.vue new file mode 100644 index 0000000..2a10812 --- /dev/null +++ b/src/icons/FilePlus.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FileSearch.vue b/src/icons/FileSearch.vue new file mode 100644 index 0000000..18d3011 --- /dev/null +++ b/src/icons/FileSearch.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FindReplace.vue b/src/icons/FindReplace.vue new file mode 100644 index 0000000..3fea316 --- /dev/null +++ b/src/icons/FindReplace.vue @@ -0,0 +1,3 @@ + diff --git a/src/icons/Folder.vue b/src/icons/Folder.vue new file mode 100644 index 0000000..71f2cf3 --- /dev/null +++ b/src/icons/Folder.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FolderMultiple.vue b/src/icons/FolderMultiple.vue new file mode 100644 index 0000000..d2e5b07 --- /dev/null +++ b/src/icons/FolderMultiple.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FolderPlus.vue b/src/icons/FolderPlus.vue new file mode 100644 index 0000000..db1814a --- /dev/null +++ b/src/icons/FolderPlus.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatBold.vue b/src/icons/FormatBold.vue new file mode 100644 index 0000000..807b93d --- /dev/null +++ b/src/icons/FormatBold.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatItalic.vue b/src/icons/FormatItalic.vue new file mode 100644 index 0000000..d8f4e33 --- /dev/null +++ b/src/icons/FormatItalic.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatListBulleted.vue b/src/icons/FormatListBulleted.vue new file mode 100644 index 0000000..0eef620 --- /dev/null +++ b/src/icons/FormatListBulleted.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatListChecks.vue b/src/icons/FormatListChecks.vue new file mode 100644 index 0000000..77e403c --- /dev/null +++ b/src/icons/FormatListChecks.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatListNumbers.vue b/src/icons/FormatListNumbers.vue new file mode 100644 index 0000000..4383c3f --- /dev/null +++ b/src/icons/FormatListNumbers.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatQuoteClose.vue b/src/icons/FormatQuoteClose.vue new file mode 100644 index 0000000..878d0b6 --- /dev/null +++ b/src/icons/FormatQuoteClose.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatSize.vue b/src/icons/FormatSize.vue new file mode 100644 index 0000000..ccd3608 --- /dev/null +++ b/src/icons/FormatSize.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/FormatStrikethrough.vue b/src/icons/FormatStrikethrough.vue new file mode 100644 index 0000000..9e60453 --- /dev/null +++ b/src/icons/FormatStrikethrough.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/HelpCircle.vue b/src/icons/HelpCircle.vue new file mode 100644 index 0000000..ceb97b6 --- /dev/null +++ b/src/icons/HelpCircle.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/History.vue b/src/icons/History.vue new file mode 100644 index 0000000..b9e7c06 --- /dev/null +++ b/src/icons/History.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Information.vue b/src/icons/Information.vue new file mode 100644 index 0000000..f2a9c4e --- /dev/null +++ b/src/icons/Information.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Key.vue b/src/icons/Key.vue new file mode 100644 index 0000000..45478fd --- /dev/null +++ b/src/icons/Key.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/LinkVariant.vue b/src/icons/LinkVariant.vue new file mode 100644 index 0000000..1ea9b97 --- /dev/null +++ b/src/icons/LinkVariant.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Login.vue b/src/icons/Login.vue new file mode 100644 index 0000000..31ffcdb --- /dev/null +++ b/src/icons/Login.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Logout.vue b/src/icons/Logout.vue new file mode 100644 index 0000000..3c4564b --- /dev/null +++ b/src/icons/Logout.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Magnify.vue b/src/icons/Magnify.vue new file mode 100644 index 0000000..fe12842 --- /dev/null +++ b/src/icons/Magnify.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Menu.vue b/src/icons/Menu.vue new file mode 100644 index 0000000..461e3b9 --- /dev/null +++ b/src/icons/Menu.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Message.vue b/src/icons/Message.vue new file mode 100644 index 0000000..5afa933 --- /dev/null +++ b/src/icons/Message.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/NavigationBar.vue b/src/icons/NavigationBar.vue new file mode 100644 index 0000000..6e40d08 --- /dev/null +++ b/src/icons/NavigationBar.vue @@ -0,0 +1,6 @@ + diff --git a/src/icons/OpenInNew.vue b/src/icons/OpenInNew.vue new file mode 100644 index 0000000..04ba2ec --- /dev/null +++ b/src/icons/OpenInNew.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Pen.vue b/src/icons/Pen.vue new file mode 100644 index 0000000..01a2591 --- /dev/null +++ b/src/icons/Pen.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Printer.vue b/src/icons/Printer.vue new file mode 100644 index 0000000..45f9c07 --- /dev/null +++ b/src/icons/Printer.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Provider.vue b/src/icons/Provider.vue new file mode 100644 index 0000000..422e59e --- /dev/null +++ b/src/icons/Provider.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/icons/Redo.vue b/src/icons/Redo.vue new file mode 100644 index 0000000..8b3da65 --- /dev/null +++ b/src/icons/Redo.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ScrollSync.vue b/src/icons/ScrollSync.vue new file mode 100644 index 0000000..4f3745a --- /dev/null +++ b/src/icons/ScrollSync.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Seal.vue b/src/icons/Seal.vue new file mode 100644 index 0000000..c2ee5ea --- /dev/null +++ b/src/icons/Seal.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Search.vue b/src/icons/Search.vue new file mode 100644 index 0000000..a8d8834 --- /dev/null +++ b/src/icons/Search.vue @@ -0,0 +1,3 @@ + diff --git a/src/icons/SelectTheme.vue b/src/icons/SelectTheme.vue new file mode 100644 index 0000000..9760698 --- /dev/null +++ b/src/icons/SelectTheme.vue @@ -0,0 +1,3 @@ + diff --git a/src/icons/Settings.vue b/src/icons/Settings.vue new file mode 100644 index 0000000..7f99b66 --- /dev/null +++ b/src/icons/Settings.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Share.vue b/src/icons/Share.vue new file mode 100644 index 0000000..86e1a54 --- /dev/null +++ b/src/icons/Share.vue @@ -0,0 +1,3 @@ + diff --git a/src/icons/SidePreview.vue b/src/icons/SidePreview.vue new file mode 100644 index 0000000..90734db --- /dev/null +++ b/src/icons/SidePreview.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/SignalOff.vue b/src/icons/SignalOff.vue new file mode 100644 index 0000000..4eb3d29 --- /dev/null +++ b/src/icons/SignalOff.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/StatusBar.vue b/src/icons/StatusBar.vue new file mode 100644 index 0000000..ad5ac2c --- /dev/null +++ b/src/icons/StatusBar.vue @@ -0,0 +1,6 @@ + diff --git a/src/icons/SwitchTheme.vue b/src/icons/SwitchTheme.vue new file mode 100644 index 0000000..9d1c6b9 --- /dev/null +++ b/src/icons/SwitchTheme.vue @@ -0,0 +1,3 @@ + diff --git a/src/icons/Sync.vue b/src/icons/Sync.vue new file mode 100644 index 0000000..e287161 --- /dev/null +++ b/src/icons/Sync.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/SyncAuto.vue b/src/icons/SyncAuto.vue new file mode 100644 index 0000000..3549561 --- /dev/null +++ b/src/icons/SyncAuto.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/SyncOff.vue b/src/icons/SyncOff.vue new file mode 100644 index 0000000..615392c --- /dev/null +++ b/src/icons/SyncOff.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/SyncStop.vue b/src/icons/SyncStop.vue new file mode 100644 index 0000000..fef923a --- /dev/null +++ b/src/icons/SyncStop.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Table.vue b/src/icons/Table.vue new file mode 100644 index 0000000..df610e8 --- /dev/null +++ b/src/icons/Table.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Target.vue b/src/icons/Target.vue new file mode 100644 index 0000000..9bf2d86 --- /dev/null +++ b/src/icons/Target.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Toc.vue b/src/icons/Toc.vue new file mode 100644 index 0000000..ea38dee --- /dev/null +++ b/src/icons/Toc.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Undo.vue b/src/icons/Undo.vue new file mode 100644 index 0000000..75b2a0f --- /dev/null +++ b/src/icons/Undo.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/Upload.vue b/src/icons/Upload.vue new file mode 100644 index 0000000..8de403f --- /dev/null +++ b/src/icons/Upload.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/ViewList.vue b/src/icons/ViewList.vue new file mode 100644 index 0000000..8094fa3 --- /dev/null +++ b/src/icons/ViewList.vue @@ -0,0 +1,5 @@ + diff --git a/src/icons/index.js b/src/icons/index.js new file mode 100644 index 0000000..3ddd1ee --- /dev/null +++ b/src/icons/index.js @@ -0,0 +1,136 @@ +import Vue from 'vue'; +import Provider from './Provider'; +import FormatBold from './FormatBold'; +import FormatItalic from './FormatItalic'; +import FormatQuoteClose from './FormatQuoteClose'; +import LinkVariant from './LinkVariant'; +import FileImage from './FileImage'; +import Table from './Table'; +import FormatListNumbers from './FormatListNumbers'; +import FormatListBulleted from './FormatListBulleted'; +import FormatSize from './FormatSize'; +import FormatStrikethrough from './FormatStrikethrough'; +import StatusBar from './StatusBar'; +import NavigationBar from './NavigationBar'; +import SidePreview from './SidePreview'; +import Eye from './Eye'; +import Settings from './Settings'; +import FilePlus from './FilePlus'; +import FileMultiple from './FileMultiple'; +import FileSearch from './FileSearch'; +import FolderPlus from './FolderPlus'; +import Delete from './Delete'; +import Close from './Close'; +import Pen from './Pen'; +import Target from './Target'; +import ArrowLeft from './ArrowLeft'; +import HelpCircle from './HelpCircle'; +import Toc from './Toc'; +import Login from './Login'; +import Logout from './Logout'; +import Sync from './Sync'; +import SyncOff from './SyncOff'; +import SyncAuto from './SyncAuto'; +import SyncStop from './SyncStop'; +import Upload from './Upload'; +import ViewList from './ViewList'; +import Download from './Download'; +import CodeTags from './CodeTags'; +import CodeBraces from './CodeBraces'; +import OpenInNew from './OpenInNew'; +import Information from './Information'; +import Alert from './Alert'; +import SignalOff from './SignalOff'; +import Folder from './Folder'; +import ScrollSync from './ScrollSync'; +import Printer from './Printer'; +import Undo from './Undo'; +import Redo from './Redo'; +import ContentSave from './ContentSave'; +import Message from './Message'; +import History from './History'; +import Database from './Database'; +import Magnify from './Magnify'; +import FormatListChecks from './FormatListChecks'; +import CheckCircle from './CheckCircle'; +import CheckCircleUn from './CheckCircleUn'; +import ContentCopy from './ContentCopy'; +import Key from './Key'; +import DotsHorizontal from './DotsHorizontal'; +import Seal from './Seal'; +import SwitchTheme from './SwitchTheme'; +import Search from './Search'; +import FindReplace from './FindReplace'; +import SelectTheme from './SelectTheme'; +import Copy from './Copy'; +import Ellipsis from './Ellipsis'; +import Share from './Share'; +import ChatGpt from './ChatGpt'; + +Vue.component('iconProvider', Provider); +Vue.component('iconFormatBold', FormatBold); +Vue.component('iconFormatItalic', FormatItalic); +Vue.component('iconFormatQuoteClose', FormatQuoteClose); +Vue.component('iconLinkVariant', LinkVariant); +Vue.component('iconFileImage', FileImage); +Vue.component('iconTable', Table); +Vue.component('iconFormatListNumbers', FormatListNumbers); +Vue.component('iconFormatListBulleted', FormatListBulleted); +Vue.component('iconFormatSize', FormatSize); +Vue.component('iconFormatStrikethrough', FormatStrikethrough); +Vue.component('iconStatusBar', StatusBar); +Vue.component('iconNavigationBar', NavigationBar); +Vue.component('iconSidePreview', SidePreview); +Vue.component('iconEye', Eye); +Vue.component('iconSettings', Settings); +Vue.component('iconFilePlus', FilePlus); +Vue.component('iconFileMultiple', FileMultiple); +Vue.component('iconFileSearch', FileSearch); +Vue.component('iconFolderPlus', FolderPlus); +Vue.component('iconDelete', Delete); +Vue.component('iconClose', Close); +Vue.component('iconPen', Pen); +Vue.component('iconTarget', Target); +Vue.component('iconArrowLeft', ArrowLeft); +Vue.component('iconHelpCircle', HelpCircle); +Vue.component('iconToc', Toc); +Vue.component('iconLogin', Login); +Vue.component('iconLogout', Logout); +Vue.component('iconSync', Sync); +Vue.component('iconSyncOff', SyncOff); +Vue.component('iconSyncAuto', SyncAuto); +Vue.component('iconSyncStop', SyncStop); +Vue.component('iconUpload', Upload); +Vue.component('iconViewList', ViewList); +Vue.component('iconDownload', Download); +Vue.component('iconCodeTags', CodeTags); +Vue.component('iconCodeBraces', CodeBraces); +Vue.component('iconOpenInNew', OpenInNew); +Vue.component('iconInformation', Information); +Vue.component('iconAlert', Alert); +Vue.component('iconSignalOff', SignalOff); +Vue.component('iconFolder', Folder); +Vue.component('iconScrollSync', ScrollSync); +Vue.component('iconPrinter', Printer); +Vue.component('iconUndo', Undo); +Vue.component('iconRedo', Redo); +Vue.component('iconContentSave', ContentSave); +Vue.component('iconMessage', Message); +Vue.component('iconHistory', History); +Vue.component('iconDatabase', Database); +Vue.component('iconMagnify', Magnify); +Vue.component('iconFormatListChecks', FormatListChecks); +Vue.component('iconCheckCircle', CheckCircle); +Vue.component('iconCheckCircleUn', CheckCircleUn); +Vue.component('iconContentCopy', ContentCopy); +Vue.component('iconKey', Key); +Vue.component('iconDotsHorizontal', DotsHorizontal); +Vue.component('iconSeal', Seal); +Vue.component('iconSwitchTheme', SwitchTheme); +Vue.component('iconSearch', Search); +Vue.component('iconFindReplace', FindReplace); +Vue.component('iconSelectTheme', SelectTheme); +Vue.component('iconCopy', Copy); +Vue.component('iconEllipsis', Ellipsis); +Vue.component('iconShare', Share); +Vue.component('iconChatGpt', ChatGpt); diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..303c052 --- /dev/null +++ b/src/index.js @@ -0,0 +1,59 @@ +import Vue from 'vue'; +import 'babel-polyfill'; +import 'indexeddbshim/dist/indexeddbshim'; +import * as OfflinePluginRuntime from 'offline-plugin/runtime'; +import './extensions'; +import './services/optional'; +import './icons'; +import App from './components/App'; +import store from './store'; +import localDbSvc from './services/localDbSvc'; + +if (!indexedDB) { + throw new Error('不支持您的浏览器,请升级到最新版本。'); +} + +OfflinePluginRuntime.install({ + onUpdateReady: () => { + // Tells to new SW to take control immediately + OfflinePluginRuntime.applyUpdate(); + }, + onUpdated: async () => { + if (!store.state.light) { + await localDbSvc.sync(); + localStorage.updated = true; + // Reload the webpage to load into the new version + window.location.reload(); + } + }, +}); + +if (localStorage.updated) { + store.dispatch('notification/info', 'StackEdit中文版刚刚更新了!'); + setTimeout(() => localStorage.removeItem('updated'), 3000); +} + +if (!localStorage.installPrompted) { + window.addEventListener('beforeinstallprompt', async (promptEvent) => { + // Prevent Chrome 67 and earlier from automatically showing the prompt + promptEvent.preventDefault(); + + try { + await store.dispatch('notification/confirm', '将StackEdit中文版添加到您的主屏幕上?'); + promptEvent.prompt(); + await promptEvent.userChoice; + } catch (err) { + // Cancel + } + localStorage.installPrompted = true; + }); +} + +Vue.config.productionTip = false; + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + store, + render: h => h(App), +}); diff --git a/src/libs/clunderscore.js b/src/libs/clunderscore.js new file mode 100644 index 0000000..de2f239 --- /dev/null +++ b/src/libs/clunderscore.js @@ -0,0 +1,171 @@ +var arrayProperties = {} +var liveCollectionProperties = {} +var functionProperties = {} +var objectProperties = {} +var slice = Array.prototype.slice + +arrayProperties.cl_each = function (cb) { + var i = 0 + var length = this.length + for (; i < length; i++) { + cb(this[i], i, this) + } +} + +arrayProperties.cl_map = function (cb) { + var i = 0 + var length = this.length + var result = Array(length) + for (; i < length; i++) { + result[i] = cb(this[i], i, this) + } + return result +} + +arrayProperties.cl_reduce = function (cb, memo) { + var i = 0 + var length = this.length + for (; i < length; i++) { + memo = cb(memo, this[i], i, this) + } + return memo +} + +arrayProperties.cl_some = function (cb) { + var i = 0 + var length = this.length + for (; i < length; i++) { + if (cb(this[i], i, this)) { + return true + } + } +} + +arrayProperties.cl_filter = function (cb) { + var i = 0 + var length = this.length + var result = [] + for (; i < length; i++) { + cb(this[i], i, this) && result.push(this[i]) + } + return result +} + +liveCollectionProperties.cl_each = function (cb) { + slice.call(this).cl_each(cb) +} + +liveCollectionProperties.cl_map = function (cb) { + return slice.call(this).cl_map(cb) +} + +liveCollectionProperties.cl_filter = function (cb) { + return slice.call(this).cl_filter(cb) +} + +liveCollectionProperties.cl_reduce = function (cb, memo) { + return slice.call(this).cl_reduce(cb, memo) +} + +functionProperties.cl_bind = function (context) { + var self = this + var args = slice.call(arguments, 1) + context = context || null + return args.length + ? function () { + return arguments.length + ? self.apply(context, args.concat(slice.call(arguments))) + : self.apply(context, args) + } + : function () { + return arguments.length + ? self.apply(context, arguments) + : self.call(context) + } +} + +objectProperties.cl_each = function (cb) { + var i = 0 + var keys = Object.keys(this) + var length = keys.length + for (; i < length; i++) { + cb(this[keys[i]], keys[i], this) + } +} + +objectProperties.cl_map = function (cb) { + var i = 0 + var keys = Object.keys(this) + var length = keys.length + var result = Array(length) + for (; i < length; i++) { + result[i] = cb(this[keys[i]], keys[i], this) + } + return result +} + +objectProperties.cl_reduce = function (cb, memo) { + var i = 0 + var keys = Object.keys(this) + var length = keys.length + for (; i < length; i++) { + memo = cb(memo, this[keys[i]], keys[i], this) + } + return memo +} + +objectProperties.cl_some = function (cb) { + var i = 0 + var keys = Object.keys(this) + var length = keys.length + for (; i < length; i++) { + if (cb(this[keys[i]], keys[i], this)) { + return true + } + } +} + +objectProperties.cl_extend = function (obj) { + if (obj) { + var i = 0 + var keys = Object.keys(obj) + var length = keys.length + for (; i < length; i++) { + this[keys[i]] = obj[keys[i]] + } + } + return this +} + +function build(properties) { + return objectProperties.cl_reduce.call(properties, function (memo, value, key) { + memo[key] = { + value: value, + configurable: true + } + return memo + }, {}) +} + +arrayProperties = build(arrayProperties) +liveCollectionProperties = build(liveCollectionProperties) +functionProperties = build(functionProperties) +objectProperties = build(objectProperties) + +/* eslint-disable no-extend-native */ +Object.defineProperties(Array.prototype, arrayProperties) +Object.defineProperties(Int8Array.prototype, arrayProperties) +Object.defineProperties(Uint8Array.prototype, arrayProperties) +Object.defineProperties(Uint8ClampedArray.prototype, arrayProperties) +Object.defineProperties(Int16Array.prototype, arrayProperties) +Object.defineProperties(Uint16Array.prototype, arrayProperties) +Object.defineProperties(Int32Array.prototype, arrayProperties) +Object.defineProperties(Uint32Array.prototype, arrayProperties) +Object.defineProperties(Float32Array.prototype, arrayProperties) +Object.defineProperties(Float64Array.prototype, arrayProperties) +Object.defineProperties(Function.prototype, functionProperties) +Object.defineProperties(Object.prototype, objectProperties) +if (typeof window !== 'undefined') { + Object.defineProperties(HTMLCollection.prototype, liveCollectionProperties) + Object.defineProperties(NodeList.prototype, liveCollectionProperties) +} diff --git a/src/libs/htmlSanitizer.js b/src/libs/htmlSanitizer.js new file mode 100644 index 0000000..b11f29b --- /dev/null +++ b/src/libs/htmlSanitizer.js @@ -0,0 +1,424 @@ +const aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/; +const imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + +const urlParsingNode = window.document.createElement('a'); + +function sanitizeUri(uri, isImage) { + const regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + urlParsingNode.setAttribute('href', uri); + const normalizedVal = urlParsingNode.href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return `unsafe:${normalizedVal}`; + } + return uri; +} + +var buf; + +/* jshint -W083 */ + +// Regular Expressions for parsing tags and attributes +var START_TAG_REGEXP = + /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/, + END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + DOCTYPE_REGEXP = /]*?)>/i, + CDATA_REGEXP = //g, + SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = makeMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = { + ...optionalEndTagInlineElements, + ...optionalEndTagBlockElements, + }; + +// Safe Block Elements - HTML5 +var blockElements = { + ...optionalEndTagBlockElements, + ...makeMap("address,article," + + "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + + "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul") +}; + +// benweet: Add iframe +blockElements.iframe = true; + +// Inline Elements - HTML5 +var inlineElements = { + ...optionalEndTagInlineElements, + ...makeMap("a,abbr,acronym,b," + + "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + + "samp,small,span,strike,strong,sub,sup,time,tt,u,var") +}; + +// SVG Elements +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements +// Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. +// They can potentially allow for arbitrary javascript to be executed. See #11290 +var svgElements = makeMap("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph," + + "hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline," + + "radialGradient,rect,stop,svg,switch,text,title,tspan,use"); + +// Special Elements (can contain anything) +var specialElements = makeMap("script,style"); + +var validElements = { + ...voidElements, + ...blockElements, + ...inlineElements, + ...optionalEndTagElements, + ...svgElements, +}; + +//Attributes that have href and hence need to be sanitized +var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href"); + +var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + + 'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' + + 'valign,value,vspace,width'); + +// SVG attributes (without "id" and "name" attributes) +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes +var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + + 'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' + + 'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' + + 'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' + + 'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' + + 'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' + + 'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' + + 'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' + + 'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' + + 'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' + + 'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' + + 'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' + + 'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' + + 'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' + + 'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true); + +var validAttrs = { + ...uriAttrs, + ...svgAttrs, + ...htmlAttrs, +}; + +// benweet: Add id and allowfullscreen (YouTube iframe) +validAttrs.id = true; +validAttrs.allowfullscreen = true; + +function makeMap(str, lowercaseKeys) { + var obj = {}, + items = str.split(','), + i; + for (i = 0; i < items.length; i++) { + obj[lowercaseKeys ? items[i].toLowerCase() : items[i]] = true; + } + return obj; +} + + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser(html, handler) { + if (typeof html !== 'string') { + if (html === null || typeof html === 'undefined') { + html = ''; + } else { + html = '' + html; + } + } + var index, chars, match, stack = [], + last = html, + text; + stack.last = function () { + return stack[stack.length - 1]; + }; + + while (html) { + text = ''; + chars = true; + + // Make sure we're not in a script or style element + if (!stack.last() || !specialElements[stack.last()]) { + + // Comment + if (html.indexOf("", index) === index) { + if (handler.comment) handler.comment(html.substring(4, index)); + html = html.substring(index + 3); + chars = false; + } + // DOCTYPE + } else if (DOCTYPE_REGEXP.test(html)) { + match = html.match(DOCTYPE_REGEXP); + + if (match) { + html = html.replace(match[0], ''); + chars = false; + } + // end tag + } else if (BEGING_END_TAGE_REGEXP.test(html)) { + match = html.match(END_TAG_REGEXP); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(END_TAG_REGEXP, parseEndTag); + chars = false; + } + + // start tag + } else if (BEGIN_TAG_REGEXP.test(html)) { + match = html.match(START_TAG_REGEXP); + + if (match) { + // We only have a valid start-tag if there is a '>'. + if (match[4]) { + html = html.substring(match[0].length); + match[0].replace(START_TAG_REGEXP, parseStartTag); + } + chars = false; + } else { + // no ending tag found --- this piece should be encoded as an entity. + text += '<'; + html = html.substring(1); + } + } + + if (chars) { + index = html.indexOf("<"); + + text += index < 0 ? html : html.substring(0, index); + html = index < 0 ? "" : html.substring(index); + + if (handler.chars) handler.chars(decodeEntities(text)); + } + + } else { + // IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w]. + html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), + function (all, text) { + text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars(decodeEntities(text)); + + return ""; + }); + + parseEndTag("", stack.last()); + } + + if (html == last) { + // benweet + // throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + + // "of html: {0}", html); + stack.reverse(); + return stack.cl_each(function (tag) { + buf.push(''); + }); + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName && tagName.toLowerCase(); + if (blockElements[tagName]) { + while (stack.last() && inlineElements[stack.last()]) { + parseEndTag("", stack.last()); + } + } + + if (optionalEndTagElements[tagName] && stack.last() == tagName) { + parseEndTag("", tagName); + } + + unary = voidElements[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + var attrs = {}; + + rest.replace(ATTR_REGEXP, + function (match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { + var value = doubleQuotedValue || singleQuotedValue || unquotedValue || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start(tagName, attrs, unary); + } + + function parseEndTag(tag, tagName) { + var pos = 0, + i; + tagName = tagName && tagName.toLowerCase(); + if (tagName) { + // Find the closest opened tag of the same type + for (pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) break; + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (i = stack.length - 1; i >= pos; i--) + if (handler.end) handler.end(stack[i]); + + // Remove the open elements from the stack + stack.length = pos; + } + } +} + +var hiddenPre = document.createElement("pre"); +/** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ +function decodeEntities(value) { + if (!value) { + return ''; + } + + hiddenPre.innerHTML = value.replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf, uriValidator) { + var ignore = false; + var out = buf.push.bind(buf); + return { + start: function (tag, attrs, unary) { + tag = tag && tag.toLowerCase(); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] === true) { + out('<'); + out(tag); + Object.keys(attrs).forEach(function (key) { + var value = attrs[key]; + var lkey = key && key.toLowerCase(); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function (tag) { + tag = tag && tag.toLowerCase(); + if (!ignore && validElements[tag] === true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function (chars) { + if (!ignore) { + out(encodeEntities(chars)); + } + }, + comment: function (comment) { + if (!ignore) { + out(''); + } + } + }; +} + +function sanitizeHtml(html) { + buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function (uri, isImage) { + return !/^unsafe/.test(sanitizeUri(uri, isImage)); + })); + return buf.join(''); +} + + +export default { + sanitizeHtml, + sanitizeUri, +} diff --git a/src/libs/pagedown.js b/src/libs/pagedown.js new file mode 100644 index 0000000..f4144d9 --- /dev/null +++ b/src/libs/pagedown.js @@ -0,0 +1,1423 @@ +var util = {}, + re = window.RegExp, + SETTINGS = { + lineLength: 72 + }; + +var defaultsStrings = { + bold: "Strong Ctrl/Cmd+B", + boldexample: "加粗文本", + + italic: "Emphasis Ctrl/Cmd+I", + italicexample: "强调文本", + + strikethrough: "Strikethrough Ctrl/Cmd+I", + strikethroughexample: "删除线文本", + + link: "Hyperlink Ctrl/Cmd+L", + linkdescription: "这里输入链接描述", + linkdialog: "

    Insert Hyperlink

    http://example.com/ \"optional title\"

    ", + + quote: "Blockquote
    Ctrl/Cmd+Q", + quoteexample: "块引用", + + code: "Code Sample
     Ctrl/Cmd+K",
    +  codeexample: "这里输入代码",
    +
    +  image: "Image  Ctrl/Cmd+G",
    +  imagedescription: "输入图片说明",
    +  imagedialog: "

    Insert Image

    http://example.com/images/diagram.jpg \"optional title\"

    Need
    free image hosting?

    ", + + olist: "Numbered List
      Ctrl/Cmd+O", + ulist: "Bulleted List
        Ctrl/Cmd+U", + litem: "这里是列表文本", + + heading: "Heading

        /

        Ctrl/Cmd+H", + headingexample: "标题", + + hr: "Horizontal Rule
        Ctrl/Cmd+R", + + undo: "Undo - Ctrl/Cmd+Z", + redo: "Redo - Ctrl/Cmd+Y", + + help: "Markdown Editing Help", + + formulaexample: "这里输入Latex表达式", +}; + +// options, if given, can have the following properties: +// options.helpButton = { handler: yourEventHandler } +// options.strings = { italicexample: "slanted text" } +// `yourEventHandler` is the click handler for the help button. +// If `options.helpButton` isn't given, not help button is created. +// `options.strings` can have any or all of the same properties as +// `defaultStrings` above, so you can just override some string displayed +// to the user on a case-by-case basis, or translate all strings to +// a different language. +// +// For backwards compatibility reasons, the `options` argument can also +// be just the `helpButton` object, and `strings.help` can also be set via +// `helpButton.title`. This should be considered legacy. +// +// The constructed editor object has the methods: +// - getConverter() returns the markdown converter object that was passed to the constructor +// - run() actually starts the editor; should be called after all necessary plugins are registered. Calling this more than once is a no-op. +// - refreshPreview() forces the preview to be updated. This method is only available after run() was called. +function Pagedown(options) { + + options = options || {}; + + if (typeof options.handler === "function") { //backwards compatible behavior + options = { + helpButton: options + }; + } + options.strings = options.strings || {}; + var getString = function (identifier) { + return options.strings[identifier] || defaultsStrings[identifier]; + }; + + function identity(x) { + return x; + } + + function returnFalse() { + return false; + } + + function HookCollection() { } + HookCollection.prototype = { + + chain: function (hookname, func) { + var original = this[hookname]; + if (!original) { + throw new Error("unknown hook " + hookname); + } + + if (original === identity) { + this[hookname] = func; + } else { + this[hookname] = function () { + var args = Array.prototype.slice.call(arguments, 0); + args[0] = original.apply(null, args); + return func.apply(null, args); + }; + } + }, + set: function (hookname, func) { + if (!this[hookname]) { + throw new Error("unknown hook " + hookname); + } + this[hookname] = func; + }, + addNoop: function (hookname) { + this[hookname] = identity; + }, + addFalse: function (hookname) { + this[hookname] = returnFalse; + } + }; + + var hooks = this.hooks = new HookCollection(); + hooks.addNoop("onPreviewRefresh"); // called with no arguments after the preview has been refreshed + hooks.addNoop("postBlockquoteCreation"); // called with the user's selection *after* the blockquote was created; should return the actual to-be-inserted text + hooks.addFalse("insertImageDialog"); + hooks.addFalse("insertChatGptDialog"); + /* called with one parameter: a callback to be called with the URL of the image. If the application creates + * its own image insertion dialog, this hook should return true, and the callback should be called with the chosen + * image url (or null if the user cancelled). If this hook returns false, the default dialog will be used. + */ + hooks.addFalse("insertLinkDialog"); + // 插入图片占位字符 + hooks.addFalse("insertImageUploading"); + + var that = this, + input; + + this.run = function () { + if (input) + return; // already initialized + + input = options.input; + var commandManager = new CommandManager(hooks, getString); + var uiManager; + + uiManager = new UIManager(input, commandManager); + + that.uiManager = uiManager; + }; + +} + +// before: contains all the text in the input box BEFORE the selection. +// after: contains all the text in the input box AFTER the selection. +function Chunks() { } + +// startRegex: a regular expression to find the start tag +// endRegex: a regular expresssion to find the end tag +Chunks.prototype.findTags = function (startRegex, endRegex) { + + var chunkObj = this; + var regex; + + if (startRegex) { + + regex = util.extendRegExp(startRegex, "", "$"); + + this.before = this.before.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + + regex = util.extendRegExp(startRegex, "^", ""); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + } + + if (endRegex) { + + regex = util.extendRegExp(endRegex, "", "$"); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + + regex = util.extendRegExp(endRegex, "^", ""); + + this.after = this.after.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + } +}; + +// If remove is false, the whitespace is transferred +// to the before/after regions. +// +// If remove is true, the whitespace disappears. +Chunks.prototype.trimWhitespace = function (remove) { + var beforeReplacer, afterReplacer, that = this; + if (remove) { + beforeReplacer = afterReplacer = ""; + } else { + beforeReplacer = function (s) { + that.before += s; + return ""; + }; + afterReplacer = function (s) { + that.after = s + that.after; + return ""; + }; + } + + this.selection = this.selection.replace(/^(\s*)/, beforeReplacer).replace(/(\s*)$/, afterReplacer); +}; + + +Chunks.prototype.skipLines = function (nLinesBefore, nLinesAfter, findExtraNewlines) { + + if (nLinesBefore === undefined) { + nLinesBefore = 1; + } + + if (nLinesAfter === undefined) { + nLinesAfter = 1; + } + + nLinesBefore++; + nLinesAfter++; + + var regexText; + var replacementText; + + // chrome bug ... documented at: http://meta.stackoverflow.com/questions/63307/blockquote-glitch-in-editor-in-chrome-6-and-7/65985#65985 + if (navigator.userAgent.match(/Chrome/)) { + "X".match(/()./); + } + + this.selection = this.selection.replace(/(^\n*)/, ""); + + this.startTag = this.startTag + re.$1; + + this.selection = this.selection.replace(/(\n*$)/, ""); + this.endTag = this.endTag + re.$1; + this.startTag = this.startTag.replace(/(^\n*)/, ""); + this.before = this.before + re.$1; + this.endTag = this.endTag.replace(/(\n*$)/, ""); + this.after = this.after + re.$1; + + if (this.before) { + + regexText = replacementText = ""; + + while (nLinesBefore--) { + regexText += "\\n?"; + replacementText += "\n"; + } + + if (findExtraNewlines) { + regexText = "\\n*"; + } + this.before = this.before.replace(new re(regexText + "$", ""), replacementText); + } + + if (this.after) { + + regexText = replacementText = ""; + + while (nLinesAfter--) { + regexText += "\\n?"; + replacementText += "\n"; + } + if (findExtraNewlines) { + regexText = "\\n*"; + } + + this.after = this.after.replace(new re(regexText, ""), replacementText); + } +}; + +// end of Chunks + +// Converts \r\n and \r to \n. +util.fixEolChars = function (text) { + text = text.replace(/\r\n/g, "\n"); + text = text.replace(/\r/g, "\n"); + return text; +}; + +// Extends a regular expression. Returns a new RegExp +// using pre + regex + post as the expression. +// Used in a few functions where we have a base +// expression and we want to pre- or append some +// conditions to it (e.g. adding "$" to the end). +// The flags are unchanged. +// +// regex is a RegExp, pre and post are strings. +util.extendRegExp = function (regex, pre, post) { + + if (pre === null || pre === undefined) { + pre = ""; + } + if (post === null || post === undefined) { + post = ""; + } + + var pattern = regex.toString(); + var flags; + + // Replace the flags with empty space and store them. + pattern = pattern.replace(/\/([gim]*)$/, function (wholeMatch, flagsPart) { + flags = flagsPart; + return ""; + }); + + // Remove the slash delimiters on the regular expression. + pattern = pattern.replace(/(^\/|\/$)/g, ""); + pattern = pre + pattern + post; + + return new re(pattern, flags); +}; + +// The input textarea state/contents. +// This is used to implement undo/redo by the undo manager. +function TextareaState(input) { + + // Aliases + var stateObj = this; + var inputArea = input; + this.init = function () { + this.setInputAreaSelectionStartEnd(); + this.text = inputArea.getContent(); + }; + + // Sets the selected text in the input box after we've performed an + // operation. + this.setInputAreaSelection = function () { + inputArea.focus(); + inputArea.setSelection(stateObj.start, stateObj.end); + }; + + this.setInputAreaSelectionStartEnd = function () { + stateObj.start = Math.min( + inputArea.selectionMgr.selectionStart, + inputArea.selectionMgr.selectionEnd + ); + stateObj.end = Math.max( + inputArea.selectionMgr.selectionStart, + inputArea.selectionMgr.selectionEnd + ); + }; + + // Restore this state into the input area. + this.restore = function () { + + if (stateObj.text !== undefined && stateObj.text != inputArea.getContent()) { + inputArea.setContent(stateObj.text); + } + this.setInputAreaSelection(); + }; + + // Gets a collection of HTML chunks from the inptut textarea. + this.getChunks = function () { + + var chunk = new Chunks(); + chunk.before = util.fixEolChars(stateObj.text.substring(0, stateObj.start)); + chunk.startTag = ""; + chunk.selection = util.fixEolChars(stateObj.text.substring(stateObj.start, stateObj.end)); + chunk.endTag = ""; + chunk.after = util.fixEolChars(stateObj.text.substring(stateObj.end)); + + return chunk; + }; + + // Sets the TextareaState properties given a chunk of markdown. + this.setChunks = function (chunk) { + + chunk.before = chunk.before + chunk.startTag; + chunk.after = chunk.endTag + chunk.after; + + this.start = chunk.before.length; + this.end = chunk.before.length + chunk.selection.length; + this.text = chunk.before + chunk.selection + chunk.after; + }; + this.init(); +} + +function UIManager(input, commandManager) { + + var inputBox = input, + buttons = {}; // buttons.undo, buttons.link, etc. The actual DOM elements. + + makeSpritedButtonRow(); + + // Perform the button's action. + function doClick(buttonName) { + var button = buttons[buttonName]; + if (!button) { + return; + } + + inputBox.focus(); + var linkOrImage = button === buttons.link || button.id === buttons.image; + + var state = new TextareaState(input); + + if (!state) { + return; + } + + var chunks = state.getChunks(); + + // Some commands launch a "modal" prompt dialog. Javascript + // can't really make a modal dialog box and the WMD code + // will continue to execute while the dialog is displayed. + // This prevents the dialog pattern I'm used to and means + // I can't do something like this: + // + // var link = CreateLinkDialog(); + // makeMarkdownLink(link); + // + // Instead of this straightforward method of handling a + // dialog I have to pass any code which would execute + // after the dialog is dismissed (e.g. link creation) + // in a function parameter. + // + // Yes this is awkward and I think it sucks, but there's + // no real workaround. Only the image and link code + // create dialogs and require the function pointers. + var fixupInputArea = function () { + + inputBox.focus(); + + if (chunks) { + state.setChunks(chunks); + } + + state.restore(); + }; + + var noCleanup = button(chunks, fixupInputArea); + + if (!noCleanup) { + fixupInputArea(); + if (!linkOrImage) { + inputBox.adjustCursorPosition(); + } + } + } + + function bindCommand(method) { + if (typeof method === "string") + method = commandManager[method]; + return function () { + method.apply(commandManager, arguments); + }; + } + + function makeSpritedButtonRow() { + + buttons.bold = bindCommand("doBold"); + buttons.italic = bindCommand("doItalic"); + buttons.strikethrough = bindCommand("doStrikethrough"); + buttons.inlineformula = bindCommand("doInlinkeFormula"); + buttons.imageUploading = bindCommand("doImageUploading"); + buttons.link = bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, false); + }); + buttons.quote = bindCommand("doBlockquote"); + buttons.code = bindCommand("doCode"); + buttons.image = bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, true); + }); + buttons.chatgpt = bindCommand("doChatGpt"); + buttons.olist = bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, true); + }); + buttons.ulist = bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, false); + }); + buttons.clist = bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, false, true); + }); + buttons.heading = bindCommand("doHeading"); + buttons.hr = bindCommand("doHorizontalRule"); + buttons.table = bindCommand("doTable"); + } + + this.doClick = doClick; + +} + +function CommandManager(pluginHooks, getString) { + this.hooks = pluginHooks; + this.getString = getString; +} + +var commandProto = CommandManager.prototype; + +// The markdown symbols - 4 spaces = code, > = blockquote, etc. +commandProto.prefixes = "(?:\\s{4,}|\\s*>|\\s*-\\s+|\\s*\\d+\\.|=|\\+|-|_|\\*|#|\\s*\\[[^\n]]+\\]:)"; + +// Remove markdown symbols from the chunk selection. +commandProto.unwrap = function (chunk) { + var txt = new re("([^\\n])\\n(?!(\\n|" + this.prefixes + "))", "g"); + chunk.selection = chunk.selection.replace(txt, "$1 $2"); +}; + +commandProto.wrap = function (chunk, len) { + this.unwrap(chunk); + var regex = new re("(.{1," + len + "})( +|$\\n?)", "gm"), + that = this; + + chunk.selection = chunk.selection.replace(regex, function (line, marked) { + if (new re("^" + that.prefixes, "").test(line)) { + return line; + } + return marked + "\n"; + }); + + chunk.selection = chunk.selection.replace(/\s+$/, ""); +}; + +commandProto.doBold = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 2, this.getString("boldexample")); +}; + +commandProto.doItalic = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 1, this.getString("italicexample")); +}; + +// chunk: The selected region that will be enclosed with */** +// nStars: 1 for italics, 2 for bold +// insertText: If you just click the button without highlighting text, this gets inserted +commandProto.doBorI = function (chunk, postProcessing, nStars, insertText) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(\**$)/.exec(chunk.before)[0]; + var starsAfter = /(^\**)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[*]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[*]{" + nStars + "}", ""), ""); + } else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^([*_]*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = insertText; + } + + // Add the true markup. + var markup = nStars <= 1 ? "*" : "**"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; +}; + +commandProto.doStrikethrough = function (chunk, postProcessing) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(~*$)/.exec(chunk.before)[0]; + var starsAfter = /(^~*)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + var nStars = 2; + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[~]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[~]{" + nStars + "}", ""), ""); + } else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^(~*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = this.getString("strikethroughexample"); + } + + // Add the true markup. + var markup = "~~"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; +}; + +commandProto.doInlinkeFormula = function (chunk, postProcessing) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(\$*$)/.exec(chunk.before)[0]; + var starsAfter = /(^\$*)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + var nStars = 2; + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[\$]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[\$]{" + nStars + "}", ""), ""); + } else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^(\$*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = this.getString("formulaexample"); + } + + // Add the true markup. + var markup = "$"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; +}; + +commandProto.doImageUploading = function (chunk, postProcessing) { + var enteredCallback = function (imgId) { + if (imgId !== null) { + chunk.before = `${chunk.before}[图片上传中...(image-${imgId})]`; + chunk.selection = ''; + } + postProcessing(); + }; + this.hooks.insertImageUploading(enteredCallback); +} + +commandProto.stripLinkDefs = function (text, defsToAdd) { + + text = text.replace(/^[ ]{0,3}\[(\d+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|$)/gm, + function (totalMatch, id, link, newlines, title) { + defsToAdd[id] = totalMatch.replace(/\s*$/, ""); + if (newlines) { + // Strip the title and return that separately. + defsToAdd[id] = totalMatch.replace(/["(](.+?)[")]$/, ""); + return newlines + title; + } + return ""; + }); + + return text; +}; + +commandProto.addLinkDef = function (chunk, linkDef) { + + var refNumber = 0; // The current reference number + var defsToAdd = {}; // + // Start with a clean slate by removing all previous link definitions. + chunk.before = this.stripLinkDefs(chunk.before, defsToAdd); + chunk.selection = this.stripLinkDefs(chunk.selection, defsToAdd); + chunk.after = this.stripLinkDefs(chunk.after, defsToAdd); + + var defs = ""; + var regex = /(\[)((?:\[[^\]]*\]|[^\[\]])*)(\][ ]?(?:\n[ ]*)?\[)(\d+)(\])/g; + + var addDefNumber = function (def) { + refNumber++; + def = def.replace(/^[ ]{0,3}\[(\d+)\]:/, " [" + refNumber + "]:"); + defs += "\n" + def; + }; + + // note that + // a) the recursive call to getLink cannot go infinite, because by definition + // of regex, inner is always a proper substring of wholeMatch, and + // b) more than one level of nesting is neither supported by the regex + // nor making a lot of sense (the only use case for nesting is a linked image) + var getLink = function (wholeMatch, before, inner, afterInner, id, end) { + inner = inner.replace(regex, getLink); + if (defsToAdd[id]) { + addDefNumber(defsToAdd[id]); + return before + inner + afterInner + refNumber + end; + } + return wholeMatch; + }; + + chunk.before = chunk.before.replace(regex, getLink); + + if (linkDef) { + addDefNumber(linkDef); + } else { + chunk.selection = chunk.selection.replace(regex, getLink); + } + + var refOut = refNumber; + + chunk.after = chunk.after.replace(regex, getLink); + + if (chunk.after) { + chunk.after = chunk.after.replace(/\n*$/, ""); + } + if (!chunk.after) { + chunk.selection = chunk.selection.replace(/\n*$/, ""); + } + + chunk.after += "\n\n" + defs; + + return refOut; +}; + +// takes the line as entered into the add link/as image dialog and makes +// sure the URL and the optinal title are "nice". +function properlyEncoded(linkdef) { + return linkdef.replace(/^\s*(.*?)(?:\s+"(.+)")?\s*$/, function (wholematch, link, title) { + link = link.replace(/\?.*$/, function (querypart) { + return querypart.replace(/\+/g, " "); // in the query string, a plus and a space are identical + }); + link = decodeURIComponent(link); // unencode first, to prevent double encoding + link = encodeURI(link).replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29'); + link = link.replace(/\?.*$/, function (querypart) { + return querypart.replace(/\+/g, "%2b"); // since we replaced plus with spaces in the query part, all pluses that now appear where originally encoded + }); + if (title) { + title = title.trim ? title.trim() : title.replace(/^\s*/, "").replace(/\s*$/, ""); + title = title.replace(/"/g, "quot;").replace(/\(/g, "(").replace(/\)/g, ")").replace(//g, ">"); + } + return title ? link + ' "' + title + '"' : link; + }); +} + +commandProto.doLinkOrImage = function (chunk, postProcessing, isImage) { + + chunk.trimWhitespace(); + //chunk.findTags(/\s*!?\[/, /\][ ]?(?:\n[ ]*)?(\[.*?\])?/); + chunk.findTags(/\s*!?\[/, /\][ ]?(?:\n[ ]*)?(\(.*?\))?/); + + if (chunk.endTag.length > 1 && chunk.startTag.length > 0) { + + chunk.startTag = chunk.startTag.replace(/!?\[/, ""); + chunk.endTag = ""; + this.addLinkDef(chunk, null); + + } else { + + // We're moving start and end tag back into the selection, since (as we're in the else block) we're not + // *removing* a link, but *adding* one, so whatever findTags() found is now back to being part of the + // link text. linkEnteredCallback takes care of escaping any brackets. + chunk.selection = chunk.startTag + chunk.selection + chunk.endTag; + chunk.startTag = chunk.endTag = ""; + + if (/\n\n/.test(chunk.selection)) { + this.addLinkDef(chunk, null); + return; + } + var that = this; + // The function to be executed when you enter a link and press OK or Cancel. + // Marks up the link and adds the ref. + var linkEnteredCallback = function (link) { + + if (link !== null) { + // ( $1 + // [^\\] anything that's not a backslash + // (?:\\\\)* an even number (this includes zero) of backslashes + // ) + // (?= followed by + // [[\]] an opening or closing bracket + // ) + // + // In other words, a non-escaped bracket. These have to be escaped now to make sure they + // don't count as the end of the link or similar. + // Note that the actual bracket has to be a lookahead, because (in case of to subsequent brackets), + // the bracket in one match may be the "not a backslash" character in the next match, so it + // should not be consumed by the first match. + // The "prepend a space and finally remove it" steps makes sure there is a "not a backslash" at the + // start of the string, so this also works if the selection begins with a bracket. We cannot solve + // this by anchoring with ^, because in the case that the selection starts with two brackets, this + // would mean a zero-width match at the start. Since zero-width matches advance the string position, + // the first bracket could then not act as the "not a backslash" for the second. + chunk.selection = (" " + chunk.selection).replace(/([^\\](?:\\\\)*)(?=[[\]])/g, "$1\\").substr(1); + + /* + var linkDef = " [999]: " + properlyEncoded(link); + + var num = that.addLinkDef(chunk, linkDef); + */ + chunk.startTag = isImage ? "![" : "["; + //chunk.endTag = "][" + num + "]"; + chunk.endTag = "](" + properlyEncoded(link) + ")"; + + if (!chunk.selection) { + if (isImage) { + chunk.selection = that.getString("imagedescription"); + } else { + chunk.selection = that.getString("linkdescription"); + } + } + } + postProcessing(); + }; + + if (isImage) { + this.hooks.insertImageDialog(linkEnteredCallback); + } else { + this.hooks.insertLinkDialog(linkEnteredCallback); + } + return true; + } +}; + +commandProto.doChatGpt = function (chunk, postProcessing) { + var enteredCallback = function (content) { + if (content !== null) { + chunk.before = `${chunk.before}${content}`; + chunk.selection = ''; + } + postProcessing(); + }; + this.hooks.insertChatGptDialog(enteredCallback); +}; + +// When making a list, hitting shift-enter will put your cursor on the next line +// at the current indent level. +commandProto.doAutoindent = function (chunk) { + + var commandMgr = this, + fakeSelection = false; + + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}>[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ \t]+\n$/, "\n\n"); + + // There's no selection, end the cursor wasn't at the end of the line: + // The user wants to split the current list item / code line / blockquote line + // (for the latter it doesn't really matter) in two. Temporarily select the + // (rest of the) line to achieve this. + if (!chunk.selection && !/^[ \t]*(?:\n|$)/.test(chunk.after)) { + chunk.after = chunk.after.replace(/^[^\n]*/, function (wholeMatch) { + chunk.selection = wholeMatch; + return ""; + }); + fakeSelection = true; + } + + if (/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doList) { + commandMgr.doList(chunk); + } + } + if (/(\n|^)[ ]{0,3}>[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doBlockquote) { + commandMgr.doBlockquote(chunk); + } + } + if (/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)) { + if (commandMgr.doCode) { + commandMgr.doCode(chunk); + } + } + + if (fakeSelection) { + chunk.after = chunk.selection + chunk.after; + chunk.selection = ""; + } +}; + +commandProto.doBlockquote = function (chunk) { + + chunk.selection = chunk.selection.replace(/^(\n*)([^\r]+?)(\n*)$/, + function (totalMatch, newlinesBefore, text, newlinesAfter) { + chunk.before += newlinesBefore; + chunk.after = newlinesAfter + chunk.after; + return text; + }); + + chunk.before = chunk.before.replace(/(>[ \t]*)$/, + function (totalMatch, blankLine) { + chunk.selection = blankLine + chunk.selection; + return ""; + }); + + chunk.selection = chunk.selection.replace(/^(\s|>)+$/, ""); + chunk.selection = chunk.selection || this.getString("quoteexample"); + + // The original code uses a regular expression to find out how much of the + // text *directly before* the selection already was a blockquote: + + /* + if (chunk.before) { + chunk.before = chunk.before.replace(/\n?$/, "\n"); + } + chunk.before = chunk.before.replace(/(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*$)/, + function (totalMatch) { + chunk.startTag = totalMatch; + return ""; + }); + */ + + // This comes down to: + // Go backwards as many lines a possible, such that each line + // a) starts with ">", or + // b) is almost empty, except for whitespace, or + // c) is preceeded by an unbroken chain of non-empty lines + // leading up to a line that starts with ">" and at least one more character + // and in addition + // d) at least one line fulfills a) + // + // Since this is essentially a backwards-moving regex, it's susceptible to + // catstrophic backtracking and can cause the browser to hang; + // see e.g. http://meta.stackoverflow.com/questions/9807. + // + // Hence we replaced this by a simple state machine that just goes through the + // lines and checks for a), b), and c). + + var match = "", + leftOver = "", + line; + if (chunk.before) { + var lines = chunk.before.replace(/\n$/, "").split("\n"); + var inChain = false; + for (var i = 0; i < lines.length; i++) { + var good = false; + line = lines[i]; + inChain = inChain && line.length > 0; // c) any non-empty line continues the chain + if (/^>/.test(line)) { // a) + good = true; + if (!inChain && line.length > 1) // c) any line that starts with ">" and has at least one more character starts the chain + inChain = true; + } else if (/^[ \t]*$/.test(line)) { // b) + good = true; + } else { + good = inChain; // c) the line is not empty and does not start with ">", so it matches if and only if we're in the chain + } + if (good) { + match += line + "\n"; + } else { + leftOver += match + line; + match = "\n"; + } + } + if (!/(^|\n)>/.test(match)) { // d) + leftOver += match; + match = ""; + } + } + + chunk.startTag = match; + chunk.before = leftOver; + + // end of change + + if (chunk.after) { + chunk.after = chunk.after.replace(/^\n?/, "\n"); + } + + chunk.after = chunk.after.replace(/^(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*)/, + function (totalMatch) { + chunk.endTag = totalMatch; + return ""; + } + ); + + var replaceBlanksInTags = function (useBracket) { + + var replacement = useBracket ? "> " : ""; + + if (chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n((>|\s)*)\n$/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + if (chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n((>|\s)*)\n/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + }; + + if (/^(?![ ]{0,3}>)/m.test(chunk.selection)) { + this.wrap(chunk, SETTINGS.lineLength - 2); + chunk.selection = chunk.selection.replace(/^/gm, "> "); + replaceBlanksInTags(true); + chunk.skipLines(); + } else { + chunk.selection = chunk.selection.replace(/^[ ]{0,3}> ?/gm, ""); + this.unwrap(chunk); + replaceBlanksInTags(false); + + if (!/^(\n|^)[ ]{0,3}>/.test(chunk.selection) && chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n{0,2}$/, "\n\n"); + } + + if (!/(\n|^)[ ]{0,3}>.*$/.test(chunk.selection) && chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n{0,2}/, "\n\n"); + } + } + + chunk.selection = this.hooks.postBlockquoteCreation(chunk.selection); + + if (!/\n/.test(chunk.selection)) { + chunk.selection = chunk.selection.replace(/^(> *)/, + function (wholeMatch, blanks) { + chunk.startTag += blanks; + return ""; + }); + } +}; + +commandProto.doCode = function (chunk) { + + var hasTextBefore = /\S[ ]*$/.test(chunk.before); + var hasTextAfter = /^[ ]*\S/.test(chunk.after); + + // Use 'four space' markdown if the selection is on its own + // line or is multiline. + if ((!hasTextAfter && !hasTextBefore) || /\n/.test(chunk.selection)) { + if (/[\n]+```\n$/.test(chunk.before) && /^\n```[ ]*\n/.test(chunk.after)) { + chunk.before = chunk.before.replace(/```\n$/, ""); + chunk.after = chunk.after.replace(/^\n```/, ""); + } else { + chunk.before += '```\n'; + chunk.after = '\n```' + chunk.after; + } + if (!chunk.selection) { + chunk.selection = this.getString("codeexample"); + } + } else { + // Use backticks (`) to delimit the code block. + + chunk.trimWhitespace(); + chunk.findTags(/`/, /`/); + + if (!chunk.startTag && !chunk.endTag) { + chunk.startTag = chunk.endTag = "`"; + if (!chunk.selection) { + chunk.selection = this.getString("codeexample"); + } + } else if (chunk.endTag && !chunk.startTag) { + chunk.before += chunk.endTag; + chunk.endTag = ""; + } else { + chunk.startTag = chunk.endTag = ""; + } + } +}; + +commandProto.doList = function (chunk, postProcessing, isNumberedList, isCheckList) { + + // These are identical except at the very beginning and end. + // Should probably use the regex extension function to make this clearer. + var previousItemsRegex = /(\n|^)(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*$/; + var nextItemsRegex = /^\n*(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*/; + + // The default bullet is a dash but others are possible. + // This has nothing to do with the particular HTML bullet, + // it's just a markdown bullet. + var bullet = "-"; + + // The number in a numbered list. + var num = 1; + + // Get the item prefix - e.g. " 1. " for a numbered list, " - " for a bulleted list. + var getItemPrefix = function (checkListContent) { + var prefix; + if (isNumberedList) { + prefix = " " + num + ". "; + num++; + } else { + prefix = " " + bullet + " "; + if (isCheckList) { + prefix += '['; + prefix += checkListContent || ' '; + prefix += '] '; + } + } + return prefix; + }; + + // Fixes the prefixes of the other list items. + var getPrefixedItem = function (itemText) { + + // The numbering flag is unset when called by autoindent. + if (isNumberedList === undefined) { + isNumberedList = /^\s*\d/.test(itemText); + } + + // Renumber/bullet the list element. + itemText = itemText.replace(isCheckList + ? /^[ ]{0,3}([*+-]|\d+[.])\s+\[([ xX])\]\s/gm + : /^[ ]{0,3}([*+-]|\d+[.])\s/gm, + function (match, p1, p2) { + return getItemPrefix(p2); + }); + + return itemText; + }; + + chunk.findTags(/(\n|^)*[ ]{0,3}([*+-]|\d+[.])\s+/, null); + + if (chunk.before && !/\n$/.test(chunk.before) && !/^\n/.test(chunk.startTag)) { + chunk.before += chunk.startTag; + chunk.startTag = ""; + } + + if (chunk.startTag) { + + var hasDigits = /\d+[.]/.test(chunk.startTag); + chunk.startTag = ""; + chunk.selection = chunk.selection.replace(/\n[ ]{4}/g, "\n"); + this.unwrap(chunk); + chunk.skipLines(); + + if (hasDigits) { + // Have to renumber the bullet points if this is a numbered list. + chunk.after = chunk.after.replace(nextItemsRegex, getPrefixedItem); + } + if (isNumberedList == hasDigits) { + return; + } + } + + var nLinesUp = 1; + + chunk.before = chunk.before.replace(previousItemsRegex, + function (itemText) { + if (/^\s*([*+-])/.test(itemText)) { + bullet = re.$1; + } + nLinesUp = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + if (!chunk.selection) { + chunk.selection = this.getString("litem"); + } + + var prefix = getItemPrefix(); + + var nLinesDown = 1; + + chunk.after = chunk.after.replace(nextItemsRegex, + function (itemText) { + nLinesDown = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + chunk.trimWhitespace(true); + chunk.skipLines(nLinesUp, nLinesDown, true); + chunk.startTag = prefix; + var spaces = prefix.replace(/./g, " "); + this.wrap(chunk, SETTINGS.lineLength - spaces.length); + chunk.selection = chunk.selection.replace(/\n/g, "\n" + spaces); + +}; + +commandProto.doTable = function (chunk) { + // Credit: https://github.com/fcrespo82/atom-markdown-table-formatter + + var keepFirstAndLastPipes = true, + /* + ( # header capture + (?: + (?:[^\n]*?\|[^\n]*) # line w/ at least one pipe + \ * # maybe trailing whitespace + )? # maybe header + (?:\n|^) # newline + ) + ( # format capture + (?: + \|\ *:?-+:?\ * # format starting w/pipe + |\|?(?:\ *:?-+:?\ *\|)+ # or separated by pipe + ) + (?:\ *:?-+:?\ *)? # maybe w/o trailing pipe + \ * # maybe trailing whitespace + \n # newline + ) + ( # body capture + (?: + (?:[^\n]*?\|[^\n]*) # line w/ at least one pipe + \ * # maybe trailing whitespace + (?:\n|$) # newline + )+ # at least one + ) + */ + regex = /((?:(?:[^\n]*?\|[^\n]*) *)?(?:\r?\n|^))((?:\| *:?-+:? *|\|?(?: *:?-+:? *\|)+)(?: *:?-+:? *)? *\r?\n)((?:(?:[^\n]*?\|[^\n]*) *(?:\r?\n|$))+)/; + + + function padding(len, str) { + var result = ''; + str = str || ' '; + len = Math.floor(len); + for (var i = 0; i < len; i++) { + result += str; + } + return result; + } + + function stripTailPipes(str) { + return str.trim().replace(/(^\||\|$)/g, ""); + } + + function splitCells(str) { + return str.split('|'); + } + + function addTailPipes(str) { + if (keepFirstAndLastPipes) { + return "|" + str + "|"; + } else { + return str; + } + } + + function joinCells(arr) { + return arr.join('|'); + } + + function formatTable(text, appendNewline) { + var i, j, len1, ref1, ref2, ref3, k, len2, results, formatline, headerline, just, formatrow, data, line, lines, justify, cell, cells, first, last, ends, columns, content, widths, formatted, front, back; + formatline = text[2].trim(); + headerline = text[1].trim(); + ref1 = headerline.length === 0 ? [0, text[3]] : [1, text[1] + text[3]], formatrow = ref1[0], data = ref1[1]; + lines = data.trim().split('\n'); + justify = []; + ref2 = splitCells(stripTailPipes(formatline)); + for (j = 0, len1 = ref2.length; j < len1; j++) { + cell = ref2[j]; + ref3 = cell.trim(), first = ref3[0], last = ref3[ref3.length - 1]; + switch ((ends = (first ? first : ':') + (last ? last : ''))) { + case '::': + case '-:': + case ':-': + justify.push(ends); + break; + default: + justify.push('--'); + } + } + columns = justify.length; + content = []; + for (j = 0, len1 = lines.length; j < len1; j++) { + line = lines[j]; + cells = splitCells(stripTailPipes(line)); + cells[columns - 1] = joinCells(cells.slice(columns - 1)); + results = []; + for (k = 0, len2 = cells.length; k < len2; k++) { + cell = cells[k]; + results.push(padding(' ') + ((ref2 = cell ? typeof cell.trim === "function" ? cell.trim() : void 0 : void 0) ? ref2 : '') + padding(' ')); + } + content.push(results); + } + widths = []; + for (i = j = 0, ref2 = columns - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) { + results = []; + for (k = 0, len1 = content.length; k < len1; k++) { + cells = content[k]; + results.push(cells[i].length); + } + widths.push(Math.max.apply(Math, [2].concat(results))); + } + just = function (string, col) { + var back, front, length; + length = widths[col] - string.length; + switch (justify[col]) { + case '::': + front = padding[0], back = padding[1]; + return padding(length / 2) + string + padding((length + 1) / 2); + case '-:': + return padding(length) + string; + default: + return string + padding(length); + } + }; + formatted = []; + for (j = 0, len1 = content.length; j < len1; j++) { + cells = content[j]; + results = []; + for (i = k = 0, ref2 = columns - 1; 0 <= ref2 ? k <= ref2 : k >= ref2; i = 0 <= ref2 ? ++k : --k) { + results.push(just(cells[i], i)); + } + formatted.push(addTailPipes(joinCells(results))); + } + formatline = addTailPipes(joinCells((function () { + var j, ref2, ref3, results; + results = []; + for (i = j = 0, ref2 = columns - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) { + ref3 = justify[i], front = ref3[0], back = ref3[1]; + results.push(front + padding(widths[i] - 2, '-') + back); + } + return results; + })())); + formatted.splice(formatrow, 0, formatline); + var result = (headerline.length === 0 && text[1] !== '' ? '\n' : '') + formatted.join('\n'); + if (appendNewline !== false) { + result += '\n' + } + return result; + } + + if (chunk.before.slice(-1) !== '\n') { + chunk.before += '\n'; + } + var match = chunk.selection.match(regex); + if (match) { + chunk.selection = formatTable(match, chunk.selection.slice(-1) === '\n'); + } else { + var table = chunk.selection + '|\n-|-\n|'; + match = table.match(regex); + if (!match || match[0].slice(0, table.length) !== table) { + return; + } + table = formatTable(match); + var selectionOffset = keepFirstAndLastPipes ? 1 : 0; + var pipePos = table.indexOf('|', selectionOffset); + chunk.before += table.slice(0, selectionOffset); + chunk.selection = table.slice(selectionOffset, pipePos); + chunk.after = table.slice(pipePos) + chunk.after; + } +}; + +commandProto.doHeading = function (chunk) { + + // Remove leading/trailing whitespace and reduce internal spaces to single spaces. + chunk.selection = chunk.selection.replace(/\s+/g, " "); + chunk.selection = chunk.selection.replace(/(^\s+|\s+$)/g, ""); + + // If we clicked the button with no selected text, we just + // make a level 2 hash header around some default text. + if (!chunk.selection) { + chunk.startTag = "## "; + chunk.selection = this.getString("headingexample"); + return; + } + + var headerLevel = 0; // The existing header level of the selected text. + + // Remove any existing hash heading markdown and save the header level. + chunk.findTags(/#+[ ]*/, /[ ]*#+/); + if (/#+/.test(chunk.startTag)) { + headerLevel = re.lastMatch.length; + } + chunk.startTag = chunk.endTag = ""; + + // Try to get the current header level by looking for - and = in the line + // below the selection. + chunk.findTags(null, /\s?(-+|=+)/); + if (/=+/.test(chunk.endTag)) { + headerLevel = 1; + } + if (/-+/.test(chunk.endTag)) { + headerLevel = 2; + } + + // Skip to the next line so we can create the header markdown. + chunk.startTag = chunk.endTag = ""; + chunk.skipLines(1, 1); + + // We make a level 2 header if there is no current header. + // If there is a header level, we substract one from the header level. + // If it's already a level 1 header, it's removed. + var headerLevelToCreate = headerLevel === 0 ? 2 : headerLevel - 1; + + if (headerLevelToCreate > 0) { + + chunk.startTag = ''; + while (headerLevelToCreate--) { + chunk.startTag += '#'; + } + chunk.startTag += ' '; + } +}; + +commandProto.doHorizontalRule = function (chunk) { + chunk.startTag = "----------\n"; + chunk.selection = ""; + chunk.skipLines(2, 1, true); +}; + +export default function (options) { + return new Pagedown(options); +}; diff --git a/src/services/animationSvc.js b/src/services/animationSvc.js new file mode 100644 index 0000000..49ae61b --- /dev/null +++ b/src/services/animationSvc.js @@ -0,0 +1,237 @@ +import bezierEasing from 'bezier-easing'; + +const easings = { + materialIn: bezierEasing(0.75, 0, 0.8, 0.25), + materialOut: bezierEasing(0.25, 0.8, 0.25, 1), + inOut: bezierEasing(0.25, 0.1, 0.67, 1), +}; + +const vendors = ['moz', 'webkit']; +for (let x = 0; x < vendors.length && !window.requestAnimationFrame; x += 1) { + window.requestAnimationFrame = window[`${vendors[x]}RequestAnimationFrame`]; + window.cancelAnimationFrame = window[`${vendors[x]}CancelAnimationFrame`] || + window[`${vendors[x]}CancelRequestAnimationFrame`]; +} + +const transformStyles = [ + 'WebkitTransform', + 'MozTransform', + 'msTransform', + 'OTransform', + 'transform', +]; + +const transitionEndEvents = { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + msTransition: 'MSTransitionEnd', + OTransition: 'oTransitionEnd', + transition: 'transitionend', +}; + +function getStyle(styles) { + const elt = document.createElement('div'); + return styles.reduce((result, style) => { + if (elt.style[style] === undefined) { + return undefined; + } + return style; + }, undefined); +} + +const transformStyle = getStyle(transformStyles); +const transitionStyle = getStyle(Object.keys(transitionEndEvents)); +const transitionEndEvent = transitionEndEvents[transitionStyle]; + +function identity(x) { + return x; +} + +function ElementAttribute(name) { + this.name = name; + this.setStart = (animation) => { + const value = animation.elt[name]; + animation.$start[name] = value; + return value !== undefined && animation.$end[name] !== undefined; + }; + this.applyCurrent = (animation) => { + animation.elt[name] = animation.$current[name]; + }; +} + +function StyleAttribute(name, unit, defaultValue, wrap = identity) { + this.name = name; + this.setStart = (animation) => { + let value = parseFloat(animation.elt.style[name]); + if (Number.isNaN(value)) { + value = animation.$current[name] || defaultValue; + } + animation.$start[name] = value; + return animation.$end[name] !== undefined; + }; + this.applyCurrent = (animation) => { + animation.elt.style[name] = wrap(animation.$current[name]) + unit; + }; +} + +function TransformAttribute(name, unit, defaultValue, wrap = identity) { + this.name = name; + this.setStart = (animation) => { + let value = animation.$current[name]; + if (value === undefined) { + value = defaultValue; + } + animation.$start[name] = value; + if (animation.$end[name] === undefined) { + animation.$end[name] = value; + } + return value !== undefined; + }; + this.applyCurrent = (animation) => { + const value = animation.$current[name]; + return value !== defaultValue && `${name}(${wrap(value)}${unit})`; + }; +} + +const attributes = [ + new ElementAttribute('scrollTop'), + new ElementAttribute('scrollLeft'), + new StyleAttribute('opacity', '', 1), + new StyleAttribute('zIndex', '', 0), + new TransformAttribute('translateX', 'px', 0, Math.round), + new TransformAttribute('translateY', 'px', 0, Math.round), + new TransformAttribute('scale', '', 1), + new TransformAttribute('rotate', 'deg', 0), +].concat([ + 'width', + 'height', + 'top', + 'right', + 'bottom', + 'left', +].map(name => new StyleAttribute(name, 'px', 0, Math.round))); + +class Animation { + constructor(elt) { + this.elt = elt; + this.$current = {}; + this.$pending = {}; + } + + start(param1, param2, param3) { + let endCb = param1; + let stepCb = param2; + let useTransition = false; + if (typeof param1 === 'boolean') { + useTransition = param1; + endCb = param2; + stepCb = param3; + } + + this.stop(); + this.$start = {}; + this.$end = this.$pending; + this.$pending = {}; + this.$attributes = attributes.filter(attribute => attribute.setStart(this)); + this.$end.duration = this.$end.duration || 0; + this.$end.delay = this.$end.delay || 0; + this.$end.easing = easings[this.$end.easing] || easings.materialOut; + this.$end.endCb = typeof endCb === 'function' && endCb; + this.$end.stepCb = typeof stepCb === 'function' && stepCb; + this.$startTime = Date.now() + this.$end.delay; + if (!this.$end.duration) { + this.loop(false); + } else if (useTransition) { + this.loop(true); + } else { + this.$requestId = window.requestAnimationFrame(() => this.loop(false)); + } + return this.elt; + } + + stop() { + window.cancelAnimationFrame(this.$requestId); + } + + loop(useTransition) { + const onTransitionEnd = (evt) => { + if (evt.target === this.elt) { + this.elt.removeEventListener(transitionEndEvent, onTransitionEnd); + const { endCb } = this.$end; + this.$end.endCb = undefined; + if (endCb) { + endCb(); + } + } + }; + + let progress = (Date.now() - this.$startTime) / this.$end.duration; + let transition = ''; + if (useTransition) { + progress = 1; + const transitions = [ + 'all', + `${this.$end.duration}ms`, + this.$end.easing.toCSS(), + ]; + if (this.$end.delay) { + transitions.push(`${this.$end.duration}ms`); + } + transition = transitions.join(' '); + if (this.$end.endCb) { + this.elt.addEventListener(transitionEndEvent, onTransitionEnd); + } + } else if (progress < 1) { + this.$requestId = window.requestAnimationFrame(() => this.loop(false)); + if (progress < 0) { + return; + } + } else if (this.$end.endCb) { + this.$requestId = window.requestAnimationFrame(this.$end.endCb); + } + + const coeff = this.$end.easing.get(progress); + const transforms = this.$attributes.reduce((result, attribute) => { + if (progress < 1) { + const diff = this.$end[attribute.name] - this.$start[attribute.name]; + this.$current[attribute.name] = this.$start[attribute.name] + (diff * coeff); + } else { + this.$current[attribute.name] = this.$end[attribute.name]; + } + const transform = attribute.applyCurrent(this); + if (transform) { + result.push(transform); + } + return result; + }, []); + + if (transforms.length) { + transforms.push('translateZ(0)'); // activate GPU + } + const transform = transforms.join(' '); + this.elt.style[transformStyle] = transform; + this.elt.style[transitionStyle] = transition; + if (this.$end.stepCb) { + this.$end.stepCb(); + } + } +} + +attributes.map(attribute => attribute.name).concat('duration', 'easing', 'delay') + .forEach((name) => { + Animation.prototype[name] = function setter(val) { + this.$pending[name] = val; + return this; + }; + }); + +function animate(elt) { + if (!elt.$animation) { + elt.$animation = new Animation(elt); + } + return elt.$animation; +} + +export default { + animate, +}; diff --git a/src/services/backupSvc.js b/src/services/backupSvc.js new file mode 100644 index 0000000..3d9070f --- /dev/null +++ b/src/services/backupSvc.js @@ -0,0 +1,74 @@ +import workspaceSvc from './workspaceSvc'; +import utils from './utils'; + +export default { + async importBackup(jsonValue) { + const fileNameMap = {}; + const folderNameMap = {}; + const parentIdMap = {}; + const textMap = {}; + const propertiesMap = {}; + const discussionsMap = {}; + const commentsMap = {}; + const folderIdMap = { + trash: 'trash', + }; + + // Parse JSON value + const parsedValue = JSON.parse(jsonValue); + Object.entries(parsedValue).forEach(([id, value]) => { + if (value) { + const v4Match = id.match(/^file\.([^.]+)\.([^.]+)$/); + if (v4Match) { + // StackEdit v4 format + const [, v4Id, type] = v4Match; + if (type === 'title') { + fileNameMap[v4Id] = value; + } else if (type === 'content') { + textMap[v4Id] = value; + } + } else if (value.type === 'folder') { + // StackEdit v5 folder + folderIdMap[id] = utils.uid(); + folderNameMap[id] = value.name; + parentIdMap[id] = `${value.parentId || ''}`; + } else if (value.type === 'file') { + // StackEdit v5 file + fileNameMap[id] = value.name; + parentIdMap[id] = `${value.parentId || ''}`; + } else if (value.type === 'content') { + // StackEdit v5 content + const [fileId] = id.split('/'); + if (fileId) { + textMap[fileId] = value.text; + propertiesMap[fileId] = value.properties; + discussionsMap[fileId] = value.discussions; + commentsMap[fileId] = value.comments; + } + } + } + }); + + await utils.awaitSequence( + Object.keys(folderNameMap), + async externalId => workspaceSvc.setOrPatchItem({ + id: folderIdMap[externalId], + type: 'folder', + name: folderNameMap[externalId], + parentId: folderIdMap[parentIdMap[externalId]], + }), + ); + + await utils.awaitSequence( + Object.keys(fileNameMap), + async externalId => workspaceSvc.createFile({ + name: fileNameMap[externalId], + parentId: folderIdMap[parentIdMap[externalId]], + text: textMap[externalId], + properties: propertiesMap[externalId], + discussions: discussionsMap[externalId], + comments: commentsMap[externalId], + }, true), + ); + }, +}; diff --git a/src/services/badgeSvc.js b/src/services/badgeSvc.js new file mode 100644 index 0000000..964aea8 --- /dev/null +++ b/src/services/badgeSvc.js @@ -0,0 +1,37 @@ +import store from '../store'; + +let lastEarnedFeatureIds = null; +let debounceTimeoutId; + +const showInfo = () => { + const earnedBadges = store.getters['data/allBadges'] + .filter(badge => badge.isEarned && !lastEarnedFeatureIds.has(badge.featureId)); + if (earnedBadges.length) { + store.dispatch('notification/badge', earnedBadges.length > 1 + ? `您已获得 ${earnedBadges.length} 个徽章: ${earnedBadges.map(badge => `"${badge.name}"`).join(', ')}.` + : `您已获得 1 个徽章: "${earnedBadges[0].name}".`); + } + lastEarnedFeatureIds = null; +}; + +export default { + addBadge(featureId) { + if (!store.getters['data/badgeCreations'][featureId]) { + if (!lastEarnedFeatureIds) { + const earnedFeatureIds = store.getters['data/allBadges'] + .filter(badge => badge.isEarned) + .map(badge => badge.featureId); + lastEarnedFeatureIds = new Set(earnedFeatureIds); + } + + store.dispatch('data/patchBadgeCreations', { + [featureId]: { + created: Date.now(), + }, + }); + + clearTimeout(debounceTimeoutId); + debounceTimeoutId = setTimeout(() => showInfo(), 5000); + } + }, +}; diff --git a/src/services/chatGptSvc.js b/src/services/chatGptSvc.js new file mode 100644 index 0000000..0bd8c3b --- /dev/null +++ b/src/services/chatGptSvc.js @@ -0,0 +1,42 @@ +import store from '../store'; + +export default { + chat({ content }, callback) { + const xhr = new XMLHttpRequest(); + const url = 'https://api.openai-proxy.com/v1/chat/completions'; + xhr.open('POST', url); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.setRequestHeader('Authorization', `Bearer ${window.my_api_key}`); + xhr.send(JSON.stringify({ + model: 'gpt-3.5-turbo', + max_tokens: 3000, + top_p: 0, + temperature: 0.9, + frequency_penalty: 0, + presence_penalty: 0, + messages: [{ role: 'user', content }], + stream: true, + })); + let lastRespLen = 0; + xhr.onprogress = () => { + const responseText = xhr.response.substr(lastRespLen); + lastRespLen = xhr.response.length; + responseText.split('\n\n') + .filter(l => l.length > 0) + .forEach((text) => { + const item = text.substr(6); + if (item === '[DONE]') { + callback({ done: true }); + } else { + const data = JSON.parse(item); + callback({ content: data.choices[0].delta.content }); + } + }); + }; + xhr.onerror = () => { + store.dispatch('notification/error', 'ChatGPT接口请求异常!'); + callback({ error: 'ChatGPT接口请求异常!' }); + }; + return xhr; + }, +}; diff --git a/src/services/diffUtils.js b/src/services/diffUtils.js new file mode 100644 index 0000000..2bc1b19 --- /dev/null +++ b/src/services/diffUtils.js @@ -0,0 +1,201 @@ +import DiffMatchPatch from 'diff-match-patch'; +import utils from './utils'; + +const diffMatchPatch = new DiffMatchPatch(); +diffMatchPatch.Match_Distance = 10000; + +function makePatchableText(content, markerKeys, markerIdxMap) { + if (!content || !content.discussions) { + return null; + } + const markers = []; + // Sort keys to have predictable marker positions in case of same offset + const discussionKeys = Object.keys(content.discussions).sort(); + discussionKeys.forEach((discussionId) => { + const discussion = content.discussions[discussionId]; + + function addMarker(offsetName) { + const markerKey = discussionId + offsetName; + if (discussion[offsetName] !== undefined) { + let idx = markerIdxMap[markerKey]; + if (idx === undefined) { + idx = markerKeys.length; + markerIdxMap[markerKey] = idx; + markerKeys.push({ + id: discussionId, + offsetName, + }); + } + markers.push({ + idx, + offset: discussion[offsetName], + }); + } + } + + addMarker('start'); + addMarker('end'); + }); + + let lastOffset = 0; + let result = ''; + markers + .sort((marker1, marker2) => marker1.offset - marker2.offset) + .forEach((marker) => { + result += + content.text.slice(lastOffset, marker.offset) + + String.fromCharCode(0xe000 + marker.idx); // Use a character from the private use area + lastOffset = marker.offset; + }); + return result + content.text.slice(lastOffset); +} + +function stripDiscussionOffsets(objectMap) { + if (objectMap == null) { + return objectMap; + } + const result = {}; + Object.keys(objectMap).forEach((id) => { + result[id] = { + text: objectMap[id].text, + }; + }); + return result; +} + +function restoreDiscussionOffsets(content, markerKeys) { + if (markerKeys.length) { + // Go through markers + let count = 0; + content.text = content.text.replace( + new RegExp(`[\ue000-${String.fromCharCode((0xe000 + markerKeys.length) - 1)}]`, 'g'), + (match, offset) => { + const idx = match.charCodeAt(0) - 0xe000; + const markerKey = markerKeys[idx]; + const discussion = content.discussions[markerKey.id]; + if (discussion) { + discussion[markerKey.offsetName] = offset - count; + } + count += 1; + return ''; + }, + ); + // Sanitize offsets + Object.keys(content.discussions).forEach((discussionId) => { + const discussion = content.discussions[discussionId]; + if (discussion.start === undefined) { + discussion.start = discussion.end || 0; + } + if (discussion.end === undefined || discussion.end < discussion.start) { + discussion.end = discussion.start; + } + }); + } +} + +function mergeText(serverText, clientText, lastMergedText) { + const serverClientDiffs = diffMatchPatch.diff_main(serverText, clientText); + diffMatchPatch.diff_cleanupSemantic(serverClientDiffs); + // Fusion text is a mix of both server and client contents + const fusionText = serverClientDiffs.map(diff => diff[1]).join(''); + if (!lastMergedText) { + return fusionText; + } + // Let's try to find out what text has to be removed from fusion + const intersectionText = serverClientDiffs + // Keep only equalities + .filter(diff => diff[0] === DiffMatchPatch.DIFF_EQUAL) + .map(diff => diff[1]).join(''); + const lastMergedTextDiffs = diffMatchPatch.diff_main(lastMergedText, intersectionText) + // Keep only equalities and deletions + .filter(diff => diff[0] !== DiffMatchPatch.DIFF_INSERT); + diffMatchPatch.diff_cleanupSemantic(lastMergedTextDiffs); + // Make a patch with deletions only + const patches = diffMatchPatch.patch_make(lastMergedText, lastMergedTextDiffs); + // Apply patch to fusion text + return diffMatchPatch.patch_apply(patches, fusionText)[0]; +} + +function mergeValues(serverValue, clientValue, lastMergedValue) { + if (!lastMergedValue) { + return serverValue || clientValue; // Take the server value in priority + } + const newSerializedValue = utils.serializeObject(clientValue); + const serverSerializedValue = utils.serializeObject(serverValue); + if (newSerializedValue === serverSerializedValue) { + return serverValue; // no conflict + } + const oldSerializedValue = utils.serializeObject(lastMergedValue); + if (oldSerializedValue !== newSerializedValue && !serverValue) { + return clientValue; // Removed on server but changed on client + } + if (oldSerializedValue !== serverSerializedValue && !clientValue) { + return serverValue; // Removed on client but changed on server + } + if (oldSerializedValue !== newSerializedValue && oldSerializedValue === serverSerializedValue) { + return clientValue; // Take the client value + } + return serverValue; // Take the server value +} + +function mergeObjects(serverObject, clientObject, lastMergedObject = {}) { + const mergedObject = {}; + Object.keys({ + ...clientObject, + ...serverObject, + }).forEach((key) => { + const mergedValue = mergeValues(serverObject[key], clientObject[key], lastMergedObject[key]); + if (mergedValue != null) { + mergedObject[key] = mergedValue; + } + }); + return utils.deepCopy(mergedObject); +} + +function mergeContent(serverContent, clientContent, lastMergedContent = {}) { + const markerKeys = []; + const markerIdxMap = Object.create(null); + const lastMergedText = makePatchableText(lastMergedContent, markerKeys, markerIdxMap); + const serverText = makePatchableText(serverContent, markerKeys, markerIdxMap); + const clientText = makePatchableText(clientContent, markerKeys, markerIdxMap); + const isServerTextChanges = lastMergedText !== serverText; + const isClientTextChanges = lastMergedText !== clientText; + const isTextSynchronized = serverText === clientText; + let text = clientText; + if (!isTextSynchronized && isServerTextChanges) { + text = serverText; + if (isClientTextChanges) { + text = mergeText(serverText, clientText, lastMergedText); + } + } + + const result = { + text, + properties: mergeValues( + serverContent.properties, + clientContent.properties, + lastMergedContent.properties, + ), + discussions: mergeObjects( + stripDiscussionOffsets(serverContent.discussions), + stripDiscussionOffsets(clientContent.discussions), + stripDiscussionOffsets(lastMergedContent.discussions), + ), + comments: mergeObjects( + serverContent.comments, + clientContent.comments, + lastMergedContent.comments, + ), + // 服务端和本地都变更了 + mergeFlag: isServerTextChanges && isClientTextChanges, + }; + restoreDiscussionOffsets(result, markerKeys); + return result; +} + +export default { + makePatchableText, + restoreDiscussionOffsets, + mergeObjects, + mergeContent, +}; diff --git a/src/services/editor/cledit/cleditCore.js b/src/services/editor/cledit/cleditCore.js new file mode 100644 index 0000000..79ca06a --- /dev/null +++ b/src/services/editor/cledit/cleditCore.js @@ -0,0 +1,445 @@ +import DiffMatchPatch from 'diff-match-patch'; +import TurndownService from 'turndown/lib/turndown.browser.umd'; +import htmlSanitizer from '../../../libs/htmlSanitizer'; +import store from '../../../store'; + +function cledit(contentElt, scrollEltOpt, isMarkdown = false) { + const scrollElt = scrollEltOpt || contentElt; + const editor = { + $contentElt: contentElt, + $scrollElt: scrollElt, + $keystrokes: [], + $markers: {}, + }; + cledit.Utils.createEventHooks(editor); + const { debounce } = cledit.Utils; + + contentElt.setAttribute('tabindex', '0'); // To have focus even when disabled + editor.toggleEditable = (isEditable) => { + contentElt.contentEditable = isEditable == null ? !contentElt.contentEditable : isEditable; + }; + editor.toggleEditable(true); + + function getTextContent() { + // Markdown-it sanitization (Mac/DOS to Unix) + let textContent = contentElt.textContent.replace(/\r[\n\u0085]?|[\u2424\u2028\u0085]/g, '\n'); + if (textContent.slice(-1) !== '\n') { + textContent += '\n'; + } + return textContent; + } + + let lastTextContent = getTextContent(); + const highlighter = new cledit.Highlighter(editor); + + /* eslint-disable new-cap */ + const diffMatchPatch = new DiffMatchPatch(); + /* eslint-enable new-cap */ + const selectionMgr = new cledit.SelectionMgr(editor); + + function adjustCursorPosition(force) { + selectionMgr.saveSelectionState(true, true, force); + } + + function replaceContent(selectionStart, selectionEnd, replacement) { + const min = Math.min(selectionStart, selectionEnd); + const max = Math.max(selectionStart, selectionEnd); + const range = selectionMgr.createRange(min, max); + const rangeText = `${range}`; + // Range can contain a br element, which is not taken into account in rangeText + if (rangeText.length === max - min && rangeText === replacement) { + return null; + } + range.deleteContents(); + range.insertNode(document.createTextNode(replacement)); + return range; + } + + let ignoreUndo = false; + let noContentFix = false; + + function setContent(value, noUndo, maxStartOffsetOpt) { + const textContent = getTextContent(); + const maxStartOffset = maxStartOffsetOpt != null && maxStartOffsetOpt < textContent.length + ? maxStartOffsetOpt + : textContent.length - 1; + const startOffset = Math.min( + diffMatchPatch.diff_commonPrefix(textContent, value), + maxStartOffset, + ); + const endOffset = Math.min( + diffMatchPatch.diff_commonSuffix(textContent, value), + textContent.length - startOffset, + value.length - startOffset, + ); + const replacement = value.substring(startOffset, value.length - endOffset); + const range = replaceContent(startOffset, textContent.length - endOffset, replacement); + if (range) { + ignoreUndo = noUndo; + noContentFix = true; + } + return { + start: startOffset, + end: value.length - endOffset, + range, + }; + } + + const undoMgr = new cledit.UndoMgr(editor); + + function replace(selectionStart, selectionEnd, replacement) { + undoMgr.setDefaultMode('single'); + replaceContent(selectionStart, selectionEnd, replacement); + const startOffset = Math.min(selectionStart, selectionEnd); + const endOffset = startOffset + replacement.length; + selectionMgr.setSelectionStartEnd(endOffset, endOffset); + selectionMgr.updateCursorCoordinates(true); + } + + function replaceAll(search, replacement, startOffset = 0) { + undoMgr.setDefaultMode('single'); + const text = getTextContent(); + const subtext = getTextContent().slice(startOffset); + const value = subtext.replace(search, replacement); + if (value !== subtext) { + const offset = editor.setContent(text.slice(0, startOffset) + value); + selectionMgr.setSelectionStartEnd(offset.end, offset.end); + selectionMgr.updateCursorCoordinates(true); + } + } + + function focus() { + selectionMgr.restoreSelection(); + contentElt.focus(); + } + + function addMarker(marker) { + editor.$markers[marker.id] = marker; + } + + function removeMarker(marker) { + delete editor.$markers[marker.id]; + } + + const triggerSpellCheck = debounce(() => { + // Hack for Chrome to trigger the spell checker + const selection = window.getSelection(); + if (selectionMgr.hasFocus() + && !highlighter.isComposing + && selectionMgr.selectionStart === selectionMgr.selectionEnd + && selection.modify + ) { + if (selectionMgr.selectionStart) { + selection.modify('move', 'backward', 'character'); + selection.modify('move', 'forward', 'character'); + } else { + selection.modify('move', 'forward', 'character'); + selection.modify('move', 'backward', 'character'); + } + } + }, 10); + + let watcher; + let skipSaveSelection; + function checkContentChange(mutations) { + watcher.noWatch(() => { + const removedSections = []; + const modifiedSections = []; + + function markModifiedSection(node) { + let currentNode = node; + while (currentNode && currentNode !== contentElt) { + if (currentNode.section) { + const array = currentNode.parentNode ? modifiedSections : removedSections; + if (array.indexOf(currentNode.section) === -1) { + array.push(currentNode.section); + } + return; + } + currentNode = currentNode.parentNode; + } + } + + mutations.cl_each((mutation) => { + markModifiedSection(mutation.target); + mutation.addedNodes.cl_each(markModifiedSection); + mutation.removedNodes.cl_each(markModifiedSection); + }); + highlighter.fixContent(modifiedSections, removedSections, noContentFix); + noContentFix = false; + }); + + if (!skipSaveSelection) { + selectionMgr.saveSelectionState(); + } + skipSaveSelection = false; + + const newTextContent = getTextContent(); + const diffs = diffMatchPatch.diff_main(lastTextContent, newTextContent); + editor.$markers.cl_each((marker) => { + marker.adjustOffset(diffs); + }); + + const sectionList = highlighter.parseSections(newTextContent); + editor.$trigger('contentChanged', newTextContent, diffs, sectionList); + if (!ignoreUndo) { + undoMgr.addDiffs(lastTextContent, newTextContent, diffs); + undoMgr.setDefaultMode('typing'); + undoMgr.saveState(); + } + ignoreUndo = false; + lastTextContent = newTextContent; + triggerSpellCheck(); + } + + // Detect editor changes + watcher = new cledit.Watcher(editor, checkContentChange); + watcher.startWatching(); + + function setSelection(start, end) { + selectionMgr.setSelectionStartEnd(start, end == null ? start : end); + selectionMgr.updateCursorCoordinates(); + } + + function keydownHandler(handler) { + return (evt) => { + if ( + evt.which !== 17 && // Ctrl + evt.which !== 91 && // Cmd + evt.which !== 18 && // Alt + evt.which !== 16 // Shift + ) { + handler(evt); + } + }; + } + + let windowKeydownListener; + let windowMouseListener; + let windowResizeListener; + function tryDestroy() { + if (document.contains(contentElt)) { + return false; + } + watcher.stopWatching(); + window.removeEventListener('keydown', windowKeydownListener); + window.removeEventListener('mousedown', windowMouseListener); + window.removeEventListener('mouseup', windowMouseListener); + window.removeEventListener('resize', windowResizeListener); + editor.$trigger('destroy'); + return true; + } + + // In case of Ctrl/Cmd+A outside the editor element + windowKeydownListener = (evt) => { + if (!tryDestroy()) { + keydownHandler(() => { + adjustCursorPosition(); + })(evt); + } + }; + window.addEventListener('keydown', windowKeydownListener); + + // Mouseup can happen outside the editor element + windowMouseListener = () => { + if (!tryDestroy()) { + selectionMgr.saveSelectionState(true, false); + } + }; + window.addEventListener('mousedown', windowMouseListener); + window.addEventListener('mouseup', windowMouseListener); + + // Resize provokes cursor coordinate changes + windowResizeListener = () => { + if (!tryDestroy()) { + selectionMgr.updateCursorCoordinates(); + } + }; + window.addEventListener('resize', windowResizeListener); + + // Provokes selection changes and does not fire mouseup event on Chrome/OSX + contentElt.addEventListener( + 'contextmenu', + selectionMgr.saveSelectionState.cl_bind(selectionMgr, true, false), + ); + + contentElt.addEventListener('keydown', keydownHandler((evt) => { + selectionMgr.saveSelectionState(); + + // Perform keystroke + let contentChanging = false; + const textContent = getTextContent(); + let min = Math.min(selectionMgr.selectionStart, selectionMgr.selectionEnd); + let max = Math.max(selectionMgr.selectionStart, selectionMgr.selectionEnd); + const state = { + before: textContent.slice(0, min), + after: textContent.slice(max), + selection: textContent.slice(min, max), + isBackwardSelection: selectionMgr.selectionStart > selectionMgr.selectionEnd, + }; + editor.$keystrokes.cl_some((keystroke) => { + if (!keystroke.handler(evt, state, editor)) { + return false; + } + const newContent = state.before + state.selection + state.after; + if (newContent !== getTextContent()) { + editor.setContent(newContent, false, min); + contentChanging = true; + skipSaveSelection = true; + highlighter.cancelComposition = true; + } + min = state.before.length; + max = min + state.selection.length; + selectionMgr.setSelectionStartEnd( + state.isBackwardSelection ? max : min, + state.isBackwardSelection ? min : max, + !contentChanging, // Expect a restore selection on mutation event + ); + return true; + }); + + if (!contentChanging) { + // Optimization to avoid saving selection + adjustCursorPosition(); + } + })); + + contentElt.addEventListener('compositionstart', () => { + highlighter.isComposing += 1; + }); + + contentElt.addEventListener('compositionend', () => { + setTimeout(() => { + if (highlighter.isComposing) { + highlighter.isComposing -= 1; + if (!highlighter.isComposing) { + checkContentChange([]); + } + } + }, 1); + }); + + let turndownService; + if (isMarkdown) { + contentElt.addEventListener('copy', (evt) => { + if (evt.clipboardData) { + evt.clipboardData.setData('text/plain', selectionMgr.getSelectedText()); + evt.preventDefault(); + } + }); + + contentElt.addEventListener('cut', (evt) => { + if (evt.clipboardData) { + evt.clipboardData.setData('text/plain', selectionMgr.getSelectedText()); + evt.preventDefault(); + replace(selectionMgr.selectionStart, selectionMgr.selectionEnd, ''); + } else { + undoMgr.setCurrentMode('single'); + } + adjustCursorPosition(); + }); + + turndownService = new TurndownService(store.getters['data/computedSettings'].turndown); + turndownService.escape = str => str; // Disable escaping + } + + contentElt.addEventListener('paste', (evt) => { + undoMgr.setCurrentMode('single'); + evt.preventDefault(); + let data; + let { clipboardData } = evt; + if (clipboardData) { + data = clipboardData.getData('text/plain'); + if (turndownService) { + try { + const html = clipboardData.getData('text/html'); + if (html) { + const sanitizedHtml = htmlSanitizer.sanitizeHtml(html) + .replace(/ /g, ' '); // Replace non-breaking spaces with classic spaces + if (sanitizedHtml) { + data = turndownService.turndown(sanitizedHtml); + } + } + } catch (e) { + // Ignore + } + } + } else { + ({ clipboardData } = window.clipboardData); + data = clipboardData && clipboardData.getData('Text'); + } + if (!data) { + return; + } + replace(selectionMgr.selectionStart, selectionMgr.selectionEnd, data); + adjustCursorPosition(); + }); + + contentElt.addEventListener('focus', () => { + editor.$trigger('focus'); + }); + + contentElt.addEventListener('blur', () => { + editor.$trigger('blur'); + }); + + function addKeystroke(keystroke) { + const keystrokes = Array.isArray(keystroke) ? keystroke : [keystroke]; + editor.$keystrokes = editor.$keystrokes + .concat(keystrokes) + .sort((keystroke1, keystroke2) => keystroke1.priority - keystroke2.priority); + } + addKeystroke(cledit.defaultKeystrokes); + + editor.selectionMgr = selectionMgr; + editor.undoMgr = undoMgr; + editor.highlighter = highlighter; + editor.watcher = watcher; + editor.adjustCursorPosition = adjustCursorPosition; + editor.setContent = setContent; + editor.replace = replace; + editor.replaceAll = replaceAll; + editor.getContent = getTextContent; + editor.focus = focus; + editor.setSelection = setSelection; + editor.addKeystroke = addKeystroke; + editor.addMarker = addMarker; + editor.removeMarker = removeMarker; + + editor.init = (opts = {}) => { + const options = ({ + getCursorFocusRatio() { + return 0.1; + }, + sectionHighlighter(section) { + return section.text.replace(/&/g, '&').replace(/ document.head.contains(styleElt))) { + createStyleSheet(document); + } + + const contentElt = editor.$contentElt; + this.isComposing = 0; + + let sectionList = []; + let insertBeforeSection; + const useBr = cledit.Utils.isWebkit; + const trailingNodeTag = 'div'; + const hiddenLfInnerHtml = '
        '; + + const lfHtml = `${useBr ? hiddenLfInnerHtml : '\n'}`; + + this.fixContent = (modifiedSections, removedSections, noContentFix) => { + modifiedSections.cl_each((section) => { + section.forceHighlighting = true; + if (!noContentFix) { + if (useBr) { + section.elt.getElementsByClassName('hd-lf') + .cl_each(lfElt => lfElt.parentNode.removeChild(lfElt)); + section.elt.getElementsByTagName('br') + .cl_each(brElt => brElt.parentNode.replaceChild(document.createTextNode('\n'), brElt)); + } + if (section.elt.textContent.slice(-1) !== '\n') { + section.elt.appendChild(document.createTextNode('\n')); + } + } + }); + }; + + this.addTrailingNode = () => { + this.trailingNode = document.createElement(trailingNodeTag); + contentElt.appendChild(this.trailingNode); + }; + + class Section { + constructor(text) { + this.text = text.text === undefined ? text : text.text; + this.data = text.data; + } + setElement(elt) { + this.elt = elt; + elt.section = this; + } + } + + this.parseSections = (content, isInit) => { + if (this.isComposing && !this.cancelComposition) { + return sectionList; + } + + this.cancelComposition = false; + const newSectionList = (editor.options.sectionParser + ? editor.options.sectionParser(content) + : [content]) + .cl_map(sectionText => new Section(sectionText)); + + let modifiedSections = []; + let sectionsToRemove = []; + insertBeforeSection = undefined; + + if (isInit) { + // Render everything if isInit + sectionsToRemove = sectionList; + sectionList = newSectionList; + modifiedSections = newSectionList; + } else { + // Find modified section starting from top + let leftIndex = sectionList.length; + sectionList.cl_some((section, index) => { + const newSection = newSectionList[index]; + if (index >= newSectionList.length || + section.forceHighlighting || + // Check text modification + section.text !== newSection.text || + // Check that section has not been detached or moved + section.elt.parentNode !== contentElt || + // Check also the content since nodes can be injected in sections via copy/paste + section.elt.textContent !== newSection.text + ) { + leftIndex = index; + return true; + } + return false; + }); + + // Find modified section starting from bottom + let rightIndex = -sectionList.length; + sectionList.slice().reverse().cl_some((section, index) => { + const newSection = newSectionList[newSectionList.length - index - 1]; + if (index >= newSectionList.length || + section.forceHighlighting || + // Check modified + section.text !== newSection.text || + // Check that section has not been detached or moved + section.elt.parentNode !== contentElt || + // Check also the content since nodes can be injected in sections via copy/paste + section.elt.textContent !== newSection.text + ) { + rightIndex = -index; + return true; + } + return false; + }); + + if (leftIndex - rightIndex > sectionList.length) { + // Prevent overlap + rightIndex = leftIndex - sectionList.length; + } + + const leftSections = sectionList.slice(0, leftIndex); + modifiedSections = newSectionList.slice(leftIndex, newSectionList.length + rightIndex); + const rightSections = sectionList.slice(sectionList.length + rightIndex, sectionList.length); + [insertBeforeSection] = rightSections; + sectionsToRemove = sectionList.slice(leftIndex, sectionList.length + rightIndex); + sectionList = leftSections.concat(modifiedSections).concat(rightSections); + } + + const highlight = (section) => { + const html = editor.options.sectionHighlighter(section).replace(/\n/g, lfHtml); + const sectionElt = document.createElement('div'); + sectionElt.className = 'cledit-section'; + sectionElt.innerHTML = html; + section.setElement(sectionElt); + this.$trigger('sectionHighlighted', section); + }; + + const newSectionEltList = document.createDocumentFragment(); + modifiedSections.cl_each((section) => { + section.forceHighlighting = false; + highlight(section); + newSectionEltList.appendChild(section.elt); + }); + editor.watcher.noWatch(() => { + if (isInit) { + contentElt.innerHTML = ''; + contentElt.appendChild(newSectionEltList); + this.addTrailingNode(); + return; + } + + // Remove outdated sections + sectionsToRemove.cl_each((section) => { + // section may be already removed + if (section.elt.parentNode === contentElt) { + contentElt.removeChild(section.elt); + } + // To detect sections that come back with built-in undo + section.elt.section = undefined; + }); + + if (insertBeforeSection !== undefined) { + contentElt.insertBefore(newSectionEltList, insertBeforeSection.elt); + } else { + contentElt.appendChild(newSectionEltList); + } + + // Remove unauthorized nodes (text nodes outside of sections or + // duplicated sections via copy/paste) + let childNode = contentElt.firstChild; + while (childNode) { + const nextNode = childNode.nextSibling; + if (!childNode.section) { + contentElt.removeChild(childNode); + } + childNode = nextNode; + } + this.addTrailingNode(); + this.$trigger('highlighted'); + + if (editor.selectionMgr.hasFocus()) { + editor.selectionMgr.restoreSelection(); + editor.selectionMgr.updateCursorCoordinates(); + } + }); + + return sectionList; + }; +} + +cledit.Highlighter = Highlighter; + diff --git a/src/services/editor/cledit/cleditKeystroke.js b/src/services/editor/cledit/cleditKeystroke.js new file mode 100644 index 0000000..b2d6387 --- /dev/null +++ b/src/services/editor/cledit/cleditKeystroke.js @@ -0,0 +1,188 @@ +import cledit from './cleditCore'; + +function Keystroke(handler, priority) { + this.handler = handler; + this.priority = priority || 100; +} + +cledit.Keystroke = Keystroke; + +let clearNewline; +const charTypes = Object.create(null); + +// Word separators, as in Sublime Text +'./\\()"\'-:,.;<>~!@#$%^&*|+=[]{}`~?'.split('').cl_each((wordSeparator) => { + charTypes[wordSeparator] = 'wordSeparator'; +}); +charTypes[' '] = 'space'; +charTypes['\t'] = 'space'; +charTypes['\n'] = 'newLine'; + +function getNextWordOffset(text, offset, isBackward) { + let previousType; + let result = offset; + while ((isBackward && result > 0) || (!isBackward && result < text.length)) { + const currentType = charTypes[isBackward ? text[result - 1] : text[result]] || 'word'; + if (previousType && currentType !== previousType) { + if (previousType === 'word' || currentType === 'space' || previousType === 'newLine' || currentType === 'newLine') { + break; + } + } + previousType = currentType; + if (isBackward) { + result -= 1; + } else { + result += 1; + } + } + return result; +} + +cledit.defaultKeystrokes = [ + + new Keystroke((evt, state, editor) => { + if ((!evt.ctrlKey && !evt.metaKey) || evt.altKey) { + return false; + } + const keyCode = evt.charCode || evt.keyCode; + const keyCodeChar = String.fromCharCode(keyCode).toLowerCase(); + let action; + switch (keyCodeChar) { + case 'y': + action = 'redo'; + break; + case 'z': + action = evt.shiftKey ? 'redo' : 'undo'; + break; + default: + } + if (action) { + evt.preventDefault(); + setTimeout(() => editor.undoMgr[action](), 10); + return true; + } + return false; + }), + + new Keystroke((evt, state) => { + if (evt.which !== 9 /* tab */ || evt.metaKey || evt.ctrlKey) { + return false; + } + + const strSplice = (str, i, remove, add = '') => + str.slice(0, i) + add + str.slice(i + (+remove || 0)); + + evt.preventDefault(); + const isInverse = evt.shiftKey; + const lf = state.before.lastIndexOf('\n') + 1; + if (isInverse) { + if (/\s/.test(state.before.charAt(lf))) { + state.before = strSplice(state.before, lf, 1); + } + state.selection = state.selection.replace(/^[ \t]/gm, ''); + } else if (state.selection) { + state.before = strSplice(state.before, lf, 0, '\t'); + state.selection = state.selection.replace(/\n(?=[\s\S])/g, '\n\t'); + } else { + state.before += '\t'; + } + return true; + }), + + new Keystroke((evt, state, editor) => { + if (evt.which !== 13 /* enter */) { + clearNewline = false; + return false; + } + + evt.preventDefault(); + const lf = state.before.lastIndexOf('\n') + 1; + if (clearNewline) { + state.before = state.before.substring(0, lf); + state.selection = ''; + clearNewline = false; + return true; + } + clearNewline = false; + const previousLine = state.before.slice(lf); + const indent = previousLine.match(/^\s*/)[0]; + if (indent.length) { + clearNewline = true; + } + + editor.undoMgr.setCurrentMode('single'); + state.before += `\n${indent}`; + state.selection = ''; + return true; + }), + + new Keystroke((evt, state, editor) => { + if (evt.which !== 8 /* backspace */ && evt.which !== 46 /* delete */) { + return false; + } + + editor.undoMgr.setCurrentMode('delete'); + if (!state.selection) { + const isJump = (cledit.Utils.isMac && evt.altKey) || (!cledit.Utils.isMac && evt.ctrlKey); + if (isJump) { + // Custom kill word behavior + const text = state.before + state.after; + const offset = getNextWordOffset(text, state.before.length, evt.which === 8); + if (evt.which === 8) { + state.before = state.before.slice(0, offset); + } else { + state.after = state.after.slice(offset - text.length); + } + evt.preventDefault(); + return true; + } else if (evt.which === 8 && state.before.slice(-1) === '\n') { + // Special treatment for end of lines + state.before = state.before.slice(0, -1); + evt.preventDefault(); + return true; + } else if (evt.which === 46 && state.after.slice(0, 1) === '\n') { + state.after = state.after.slice(1); + evt.preventDefault(); + return true; + } + } else { + state.selection = ''; + evt.preventDefault(); + return true; + } + return false; + }), + + new Keystroke((evt, state, editor) => { + if (evt.which !== 37 /* left arrow */ && evt.which !== 39 /* right arrow */) { + return false; + } + const isJump = (cledit.Utils.isMac && evt.altKey) || (!cledit.Utils.isMac && evt.ctrlKey); + if (!isJump) { + return false; + } + + // Custom jump behavior + const textContent = editor.getContent(); + const offset = getNextWordOffset( + textContent, + editor.selectionMgr.selectionEnd, + evt.which === 37, + ); + if (evt.shiftKey) { + // rebuild the state completely + const min = Math.min(editor.selectionMgr.selectionStart, offset); + const max = Math.max(editor.selectionMgr.selectionStart, offset); + state.before = textContent.slice(0, min); + state.after = textContent.slice(max); + state.selection = textContent.slice(min, max); + state.isBackwardSelection = editor.selectionMgr.selectionStart > offset; + } else { + state.before = textContent.slice(0, offset); + state.after = textContent.slice(offset); + state.selection = ''; + } + evt.preventDefault(); + return true; + }), +]; diff --git a/src/services/editor/cledit/cleditMarker.js b/src/services/editor/cledit/cleditMarker.js new file mode 100644 index 0000000..f4ff550 --- /dev/null +++ b/src/services/editor/cledit/cleditMarker.js @@ -0,0 +1,49 @@ +import cledit from './cleditCore'; + +const DIFF_DELETE = -1; +const DIFF_INSERT = 1; +const DIFF_EQUAL = 0; + +let idCounter = 0; + +class Marker { + constructor(offset, trailing) { + this.id = idCounter; + idCounter += 1; + this.offset = offset; + this.trailing = trailing; + } + + adjustOffset(diffs) { + let startOffset = 0; + diffs.cl_each((diff) => { + const diffType = diff[0]; + const diffText = diff[1]; + const diffOffset = diffText.length; + switch (diffType) { + case DIFF_EQUAL: + startOffset += diffOffset; + break; + case DIFF_INSERT: + if ( + this.trailing + ? this.offset > startOffset + : this.offset >= startOffset + ) { + this.offset += diffOffset; + } + startOffset += diffOffset; + break; + case DIFF_DELETE: + if (this.offset > startOffset) { + this.offset -= Math.min(diffOffset, this.offset - startOffset); + } + break; + default: + } + }); + } +} + + +cledit.Marker = Marker; diff --git a/src/services/editor/cledit/cleditSelectionMgr.js b/src/services/editor/cledit/cleditSelectionMgr.js new file mode 100644 index 0000000..56a8170 --- /dev/null +++ b/src/services/editor/cledit/cleditSelectionMgr.js @@ -0,0 +1,431 @@ +import cledit from './cleditCore'; + +function SelectionMgr(editor) { + const { debounce } = cledit.Utils; + const contentElt = editor.$contentElt; + const scrollElt = editor.$scrollElt; + cledit.Utils.createEventHooks(this); + + let lastSelectionStart = 0; + let lastSelectionEnd = 0; + this.selectionStart = 0; + this.selectionEnd = 0; + this.cursorCoordinates = {}; + + this.findContainer = (offset) => { + const result = cledit.Utils.findContainer(contentElt, offset); + if (result.container.nodeValue === '\n') { + const hdLfElt = result.container.parentNode; + if (hdLfElt.className === 'hd-lf' && hdLfElt.previousSibling && hdLfElt.previousSibling.tagName === 'BR') { + result.container = hdLfElt.parentNode; + result.offsetInContainer = Array.prototype.indexOf.call( + result.container.childNodes, + result.offsetInContainer === 0 ? hdLfElt.previousSibling : hdLfElt, + ); + } + } + return result; + }; + + this.createRange = (start, end) => { + const range = document.createRange(); + const startContainer = typeof start === 'number' + ? this.findContainer(start < 0 ? 0 : start) + : start; + let endContainer = startContainer; + if (start !== end) { + endContainer = typeof end === 'number' + ? this.findContainer(end < 0 ? 0 : end) + : end; + } + range.setStart(startContainer.container, startContainer.offsetInContainer); + range.setEnd(endContainer.container, endContainer.offsetInContainer); + return range; + }; + + let adjustScroll; + const debouncedUpdateCursorCoordinates = debounce(() => { + const coordinates = this.getCoordinates( + this.selectionEnd, + this.selectionEndContainer, + this.selectionEndOffset, + ); + if (this.cursorCoordinates.top !== coordinates.top || + this.cursorCoordinates.height !== coordinates.height || + this.cursorCoordinates.left !== coordinates.left + ) { + this.cursorCoordinates = coordinates; + this.$trigger('cursorCoordinatesChanged', coordinates); + } + if (adjustScroll) { + let scrollEltHeight = scrollElt.clientHeight; + if (typeof adjustScroll === 'number') { + scrollEltHeight -= adjustScroll; + } + const adjustment = (scrollEltHeight / 2) * editor.options.getCursorFocusRatio(); + let cursorTop = this.cursorCoordinates.top + (this.cursorCoordinates.height / 2); + // Adjust cursorTop with contentElt position relative to scrollElt + cursorTop += (contentElt.getBoundingClientRect().top - scrollElt.getBoundingClientRect().top) + + scrollElt.scrollTop; + const minScrollTop = cursorTop - adjustment; + const maxScrollTop = (cursorTop + adjustment) - scrollEltHeight; + if (scrollElt.scrollTop > minScrollTop) { + scrollElt.scrollTop = minScrollTop; + } else if (scrollElt.scrollTop < maxScrollTop) { + scrollElt.scrollTop = maxScrollTop; + } + } + adjustScroll = false; + }); + + this.updateCursorCoordinates = (adjustScrollParam) => { + adjustScroll = adjustScroll || adjustScrollParam; + debouncedUpdateCursorCoordinates(); + }; + + let oldSelectionRange; + + const checkSelection = (selectionRange) => { + if (!oldSelectionRange || + oldSelectionRange.startContainer !== selectionRange.startContainer || + oldSelectionRange.startOffset !== selectionRange.startOffset || + oldSelectionRange.endContainer !== selectionRange.endContainer || + oldSelectionRange.endOffset !== selectionRange.endOffset + ) { + oldSelectionRange = selectionRange; + this.$trigger('selectionChanged', this.selectionStart, this.selectionEnd, selectionRange); + return true; + } + return false; + }; + + this.hasFocus = () => contentElt === document.activeElement; + + this.restoreSelection = () => { + const min = Math.min(this.selectionStart, this.selectionEnd); + const max = Math.max(this.selectionStart, this.selectionEnd); + const selectionRange = this.createRange(min, max); + if (!document.contains(selectionRange.commonAncestorContainer)) { + return null; + } + const selection = window.getSelection(); + selection.removeAllRanges(); + const isBackward = this.selectionStart > this.selectionEnd; + if (isBackward && selection.extend) { + const beginRange = selectionRange.cloneRange(); + beginRange.collapse(false); + selection.addRange(beginRange); + selection.extend(selectionRange.startContainer, selectionRange.startOffset); + } else { + selection.addRange(selectionRange); + } + checkSelection(selectionRange); + return selectionRange; + }; + + const saveLastSelection = debounce(() => { + lastSelectionStart = this.selectionStart; + lastSelectionEnd = this.selectionEnd; + }, 50); + + const setSelection = (start = this.selectionStart, end = this.selectionEnd) => { + this.selectionStart = start < 0 ? 0 : start; + this.selectionEnd = end < 0 ? 0 : end; + saveLastSelection(); + }; + + this.setSelectionStartEnd = (start, end, restoreSelection = true) => { + setSelection(start, end); + if (restoreSelection && this.hasFocus()) { + return this.restoreSelection(); + } + return null; + }; + + this.saveSelectionState = (() => { + // Credit: https://github.com/timdown/rangy + function arrayContains(arr, val) { + let i = arr.length; + while (i) { + i -= 1; + if (arr[i] === val) { + return true; + } + } + return false; + } + + function getClosestAncestorIn(node, ancestor, selfIsAncestor) { + let p; + let n = selfIsAncestor ? node : node.parentNode; + while (n) { + p = n.parentNode; + if (p === ancestor) { + return n; + } + n = p; + } + return null; + } + + function getNodeIndex(node) { + let i = 0; + let { previousSibling } = node; + while (previousSibling) { + i += 1; + ({ previousSibling } = previousSibling); + } + return i; + } + + function getCommonAncestor(node1, node2) { + const ancestors = []; + let n; + for (n = node1; n; n = n.parentNode) { + ancestors.push(n); + } + + for (n = node2; n; n = n.parentNode) { + if (arrayContains(ancestors, n)) { + return n; + } + } + + return null; + } + + function comparePoints(nodeA, offsetA, nodeB, offsetB) { + // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing + let n; + if (nodeA === nodeB) { + // Case 1: nodes are the same + if (offsetA === offsetB) { + return 0; + } + return offsetA < offsetB ? -1 : 1; + } + let nodeC = getClosestAncestorIn(nodeB, nodeA, true); + if (nodeC) { + // Case 2: node C (container B or an ancestor) is a child node of A + return offsetA <= getNodeIndex(nodeC) ? -1 : 1; + } + nodeC = getClosestAncestorIn(nodeA, nodeB, true); + if (nodeC) { + // Case 3: node C (container A or an ancestor) is a child node of B + return getNodeIndex(nodeC) < offsetB ? -1 : 1; + } + const root = getCommonAncestor(nodeA, nodeB); + if (!root) { + throw new Error('comparePoints error: nodes have no common ancestor'); + } + + // Case 4: containers are siblings or descendants of siblings + const childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true); + const childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true); + + if (childA === childB) { + // This shouldn't be possible + throw module.createError('comparePoints got to case 4 and childA and childB are the same!'); + } + n = root.firstChild; + while (n) { + if (n === childA) { + return -1; + } else if (n === childB) { + return 1; + } + n = n.nextSibling; + } + return 0; + } + + const save = () => { + let result; + if (this.hasFocus()) { + let { selectionStart } = this; + let { selectionEnd } = this; + const selection = window.getSelection(); + if (selection.rangeCount > 0) { + const selectionRange = selection.getRangeAt(0); + let node = selectionRange.startContainer; + // eslint-disable-next-line no-bitwise + if ((contentElt.compareDocumentPosition(node) + & window.Node.DOCUMENT_POSITION_CONTAINED_BY) + || contentElt === node + ) { + let offset = selectionRange.startOffset; + if (node.firstChild && offset > 0) { + node = node.childNodes[offset - 1]; + offset = node.textContent.length; + } + let container = node; + while (node !== contentElt) { + node = node.previousSibling; + while (node) { + offset += (node.textContent || '').length; + node = node.previousSibling; + } + node = container.parentNode; + container = node; + } + let selectionText = `${selectionRange}`; + // Fix end of line when only br is selected + const brElt = selectionRange.endContainer.firstChild; + if (brElt && brElt.tagName === 'BR' && selectionRange.endOffset === 1) { + selectionText += '\n'; + } + if (comparePoints( + selection.anchorNode, + selection.anchorOffset, + selection.focusNode, + selection.focusOffset, + ) === 1) { + selectionStart = offset + selectionText.length; + selectionEnd = offset; + } else { + selectionStart = offset; + selectionEnd = offset + selectionText.length; + } + + if (selectionStart === selectionEnd && selectionStart === editor.getContent().length) { + // If cursor is after the trailingNode + selectionEnd -= 1; + selectionStart = selectionEnd; + result = this.setSelectionStartEnd(selectionStart, selectionEnd); + } else { + setSelection(selectionStart, selectionEnd); + result = checkSelection(selectionRange); + // selectionRange doesn't change when selection is at the start of a section + result = result || lastSelectionStart !== this.selectionStart; + } + } + } + } + return result; + }; + + const saveCheckChange = () => save() && ( + lastSelectionStart !== this.selectionStart || lastSelectionEnd !== this.selectionEnd); + + let nextTickAdjustScroll = false; + const longerDebouncedSave = debounce(() => { + this.updateCursorCoordinates(saveCheckChange() && nextTickAdjustScroll); + nextTickAdjustScroll = false; + }, 10); + const debouncedSave = debounce(() => { + this.updateCursorCoordinates(saveCheckChange() && nextTickAdjustScroll); + // In some cases we have to wait a little longer to see the + // selection change (Cmd+A on Chrome OSX) + longerDebouncedSave(); + }); + + return (debounced, adjustScrollParam, forceAdjustScroll) => { + if (forceAdjustScroll) { + lastSelectionStart = undefined; + lastSelectionEnd = undefined; + } + if (debounced) { + nextTickAdjustScroll = nextTickAdjustScroll || adjustScrollParam; + debouncedSave(); + } else { + save(); + } + }; + })(); + + this.getSelectedText = () => { + const min = Math.min(this.selectionStart, this.selectionEnd); + const max = Math.max(this.selectionStart, this.selectionEnd); + return editor.getContent().substring(min, max); + }; + + this.getCoordinates = (inputOffset, containerParam, offsetInContainerParam) => { + let container = containerParam; + let offsetInContainer = offsetInContainerParam; + if (!container) { + const offset = this.findContainer(inputOffset); + ({ container } = offset); + ({ offsetInContainer } = offset); + } + let containerElt = container; + if (!containerElt.hasChildNodes() && container.parentNode) { + containerElt = container.parentNode; + } + let isInvisible = false; + while (!containerElt.offsetHeight) { + isInvisible = true; + if (containerElt.previousSibling) { + containerElt = containerElt.previousSibling; + } else { + containerElt = containerElt.parentNode; + if (!containerElt) { + return { + top: 0, + height: 0, + left: 0, + }; + } + } + } + let rect; + let left = 'left'; + if (isInvisible || container.textContent === '\n') { + rect = containerElt.getBoundingClientRect(); + } else { + const selectedChar = editor.getContent()[inputOffset]; + let startOffset = { + container, + offsetInContainer, + }; + let endOffset = { + container, + offsetInContainer, + }; + if (inputOffset > 0 && (selectedChar === undefined || selectedChar === '\n')) { + left = 'right'; + if (startOffset.offsetInContainer === 0) { + // Need to calculate offset-1 + startOffset = inputOffset - 1; + } else { + startOffset.offsetInContainer -= 1; + } + } else if (endOffset.offsetInContainer === container.textContent.length) { + // Need to calculate offset+1 + endOffset = inputOffset + 1; + } else { + endOffset.offsetInContainer += 1; + } + const range = this.createRange(startOffset, endOffset); + rect = range.getBoundingClientRect(); + } + const contentRect = contentElt.getBoundingClientRect(); + return { + top: Math.round((rect.top - contentRect.top) + contentElt.scrollTop), + height: Math.round(rect.height), + left: Math.round((rect[left] - contentRect.left) + contentElt.scrollLeft), + }; + }; + + this.getClosestWordOffset = (offset) => { + let offsetStart = 0; + let offsetEnd = 0; + let nextOffset = 0; + editor.getContent().split(/\s/).cl_some((word) => { + if (word) { + offsetStart = nextOffset; + offsetEnd = nextOffset + word.length; + if (offsetEnd > offset) { + return true; + } + } + nextOffset += word.length + 1; + return false; + }); + return { + start: offsetStart, + end: offsetEnd, + }; + }; +} + +cledit.SelectionMgr = SelectionMgr; diff --git a/src/services/editor/cledit/cleditUndoMgr.js b/src/services/editor/cledit/cleditUndoMgr.js new file mode 100644 index 0000000..70adf6e --- /dev/null +++ b/src/services/editor/cledit/cleditUndoMgr.js @@ -0,0 +1,176 @@ +import DiffMatchPatch from 'diff-match-patch'; +import cledit from './cleditCore'; + +function UndoMgr(editor) { + cledit.Utils.createEventHooks(this); + + /* eslint-disable new-cap */ + const diffMatchPatch = new DiffMatchPatch(); + /* eslint-enable new-cap */ + + const self = this; + let selectionMgr; + const undoStack = []; + const redoStack = []; + let currentState; + let previousPatches = []; + let currentPatches = []; + const { debounce } = cledit.Utils; + + this.options = { + undoStackMaxSize: 200, + bufferStateUntilIdle: 1000, + patchHandler: { + makePatches(oldContent, newContent, diffs) { + return diffMatchPatch.patch_make(oldContent, diffs); + }, + applyPatches(patches, content) { + return diffMatchPatch.patch_apply(patches, content)[0]; + }, + reversePatches(patches) { + const reversedPatches = diffMatchPatch.patch_deepCopy(patches).reverse(); + reversedPatches.cl_each((patch) => { + patch.diffs.cl_each((diff) => { + diff[0] = -diff[0]; + }); + }); + return reversedPatches; + }, + }, + }; + + let stateMgr; + function StateMgr() { + let currentTime; + let lastTime; + let lastMode; + + this.isBufferState = () => { + currentTime = Date.now(); + return this.currentMode !== 'single' && + this.currentMode === lastMode && + currentTime - lastTime < self.options.bufferStateUntilIdle; + }; + + this.setDefaultMode = (mode) => { + this.currentMode = this.currentMode || mode; + }; + + this.resetMode = () => { + stateMgr.currentMode = undefined; + lastMode = undefined; + }; + + this.saveMode = () => { + lastMode = this.currentMode; + this.currentMode = undefined; + lastTime = currentTime; + }; + } + + class State { + addToUndoStack() { + undoStack.push(this); + this.patches = previousPatches; + previousPatches = []; + } + addToRedoStack() { + redoStack.push(this); + this.patches = previousPatches; + previousPatches = []; + } + } + + stateMgr = new StateMgr(); + this.setCurrentMode = (mode) => { + stateMgr.currentMode = mode; + }; + this.setDefaultMode = stateMgr.setDefaultMode.cl_bind(stateMgr); + + this.addDiffs = (oldContent, newContent, diffs) => { + const patches = this.options.patchHandler.makePatches(oldContent, newContent, diffs); + patches.cl_each(patch => currentPatches.push(patch)); + }; + + function saveCurrentPatches() { + // Move currentPatches into previousPatches + Array.prototype.push.apply(previousPatches, currentPatches); + currentPatches = []; + } + + this.saveState = debounce(() => { + redoStack.length = 0; + if (!stateMgr.isBufferState()) { + currentState.addToUndoStack(); + + // Limit the size of the stack + while (undoStack.length > this.options.undoStackMaxSize) { + undoStack.shift(); + } + } + saveCurrentPatches(); + currentState = new State(); + stateMgr.saveMode(); + this.$trigger('undoStateChange'); + }); + + this.canUndo = () => !!undoStack.length; + this.canRedo = () => !!redoStack.length; + + const restoreState = (patchesParam, isForward) => { + let patches = patchesParam; + // Update editor + const content = editor.getContent(); + if (!isForward) { + patches = this.options.patchHandler.reversePatches(patches); + } + + const newContent = this.options.patchHandler.applyPatches(patches, content); + const newContentText = newContent.text || newContent; + const range = editor.setContent(newContentText, true); + const selection = newContent.selection || { + start: range.end, + end: range.end, + }; + + selectionMgr.setSelectionStartEnd(selection.start, selection.end); + selectionMgr.updateCursorCoordinates(true); + + stateMgr.resetMode(); + this.$trigger('undoStateChange'); + editor.adjustCursorPosition(); + }; + + this.undo = () => { + const state = undoStack.pop(); + if (!state) { + return; + } + saveCurrentPatches(); + currentState.addToRedoStack(); + restoreState(currentState.patches); + previousPatches = state.patches; + currentState = state; + }; + + this.redo = () => { + const state = redoStack.pop(); + if (!state) { + return; + } + currentState.addToUndoStack(); + restoreState(state.patches, true); + previousPatches = state.patches; + currentState = state; + }; + + this.init = (options) => { + this.options.cl_extend(options || {}); + ({ selectionMgr } = editor); + if (!currentState) { + currentState = new State(); + } + }; +} + +cledit.UndoMgr = UndoMgr; diff --git a/src/services/editor/cledit/cleditUtils.js b/src/services/editor/cledit/cleditUtils.js new file mode 100644 index 0000000..bbb365d --- /dev/null +++ b/src/services/editor/cledit/cleditUtils.js @@ -0,0 +1,129 @@ +import cledit from './cleditCore'; + +const Utils = { + isGecko: 'MozAppearance' in document.documentElement.style, + isWebkit: 'WebkitAppearance' in document.documentElement.style, + isMsie: 'msTransform' in document.documentElement.style, + isMac: navigator.userAgent.indexOf('Mac OS X') !== -1, +}; + +// Faster than setTimeout(0). Credit: https://github.com/stefanpenner/es6-promise +Utils.defer = (() => { + const queue = new Array(1000); + let queueLength = 0; + function flush() { + for (let i = 0; i < queueLength; i += 1) { + try { + queue[i](); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e.message, e.stack); + } + queue[i] = undefined; + } + queueLength = 0; + } + + let iterations = 0; + const observer = new window.MutationObserver(flush); + const node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return (fn) => { + queue[queueLength] = fn; + queueLength += 1; + if (queueLength === 1) { + iterations = (iterations + 1) % 2; + node.data = iterations; + } + }; +})(); + +Utils.debounce = (func, wait) => { + let timeoutId; + let isExpected; + return wait + ? () => { + clearTimeout(timeoutId); + timeoutId = setTimeout(func, wait); + } + : () => { + if (!isExpected) { + isExpected = true; + Utils.defer(() => { + isExpected = false; + func(); + }); + } + }; +}; + +Utils.createEventHooks = (object) => { + const listenerMap = Object.create(null); + object.$trigger = (eventType, ...args) => { + const listeners = listenerMap[eventType]; + if (listeners) { + listeners.cl_each((listener) => { + try { + listener.apply(object, args); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e.message, e.stack); + } + }); + } + }; + object.on = (eventType, listener) => { + let listeners = listenerMap[eventType]; + if (!listeners) { + listeners = []; + listenerMap[eventType] = listeners; + } + listeners.push(listener); + }; + object.off = (eventType, listener) => { + const listeners = listenerMap[eventType]; + if (listeners) { + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + } + }; +}; + +Utils.findContainer = (elt, offset) => { + let containerOffset = 0; + let container; + let child = elt; + do { + container = child; + child = child.firstChild; + if (child) { + do { + const len = child.textContent.length; + if (containerOffset <= offset && containerOffset + len > offset) { + break; + } + containerOffset += len; + child = child.nextSibling; + } while (child); + } + } while (child && child.firstChild && child.nodeType !== 3); + + if (child) { + return { + container: child, + offsetInContainer: offset - containerOffset, + }; + } + while (container.lastChild) { + container = container.lastChild; + } + return { + container, + offsetInContainer: container.nodeType === 3 ? container.textContent.length : 0, + }; +}; + +cledit.Utils = Utils; diff --git a/src/services/editor/cledit/cleditWatcher.js b/src/services/editor/cledit/cleditWatcher.js new file mode 100644 index 0000000..a1ec617 --- /dev/null +++ b/src/services/editor/cledit/cleditWatcher.js @@ -0,0 +1,34 @@ +import cledit from './cleditCore'; + +function Watcher(editor, listener) { + this.isWatching = false; + let contentObserver; + this.startWatching = () => { + this.stopWatching(); + this.isWatching = true; + contentObserver = new window.MutationObserver(listener); + contentObserver.observe(editor.$contentElt, { + childList: true, + subtree: true, + characterData: true, + }); + }; + this.stopWatching = () => { + if (contentObserver) { + contentObserver.disconnect(); + contentObserver = undefined; + } + this.isWatching = false; + }; + this.noWatch = (cb) => { + if (this.isWatching === true) { + this.stopWatching(); + cb(); + this.startWatching(); + } else { + cb(); + } + }; +} + +cledit.Watcher = Watcher; diff --git a/src/services/editor/cledit/index.js b/src/services/editor/cledit/index.js new file mode 100644 index 0000000..ba5167b --- /dev/null +++ b/src/services/editor/cledit/index.js @@ -0,0 +1,11 @@ +import '../../../libs/clunderscore'; +import cledit from './cleditCore'; +import './cleditHighlighter'; +import './cleditKeystroke'; +import './cleditMarker'; +import './cleditSelectionMgr'; +import './cleditUndoMgr'; +import './cleditUtils'; +import './cleditWatcher'; + +export default cledit; diff --git a/src/services/editor/editorSvcDiscussions.js b/src/services/editor/editorSvcDiscussions.js new file mode 100644 index 0000000..3805e1e --- /dev/null +++ b/src/services/editor/editorSvcDiscussions.js @@ -0,0 +1,256 @@ +import DiffMatchPatch from 'diff-match-patch'; +import cledit from './cledit'; +import utils from '../utils'; +import diffUtils from '../diffUtils'; +import store from '../../store'; +import EditorClassApplier from '../../components/common/EditorClassApplier'; +import PreviewClassApplier from '../../components/common/PreviewClassApplier'; + +let clEditor; +// let discussionIds = {}; +let discussionMarkers = {}; +let markerKeys; +let markerIdxMap; +let previousPatchableText; +let currentPatchableText; +let isChangePatch; +let contentId; +let editorClassAppliers = {}; +let previewClassAppliers = {}; + +function getDiscussionMarkers(discussion, discussionId, onMarker) { + const getMarker = (offsetName) => { + const markerKey = `${discussionId}:${offsetName}`; + let marker = discussionMarkers[markerKey]; + if (!marker) { + marker = new cledit.Marker(discussion[offsetName], offsetName === 'end'); + marker.discussionId = discussionId; + marker.offsetName = offsetName; + clEditor.addMarker(marker); + discussionMarkers[markerKey] = marker; + } + onMarker(marker); + }; + getMarker('start'); + getMarker('end'); +} + +function syncDiscussionMarkers(content, writeOffsets) { + const discussions = { + ...content.discussions, + }; + const newDiscussion = store.getters['discussion/newDiscussion']; + if (newDiscussion) { + discussions[store.state.discussion.newDiscussionId] = { + ...newDiscussion, + }; + } + Object.entries(discussionMarkers).forEach(([markerKey, marker]) => { + // Remove marker if discussion was removed + const discussion = discussions[marker.discussionId]; + if (!discussion) { + clEditor.removeMarker(marker); + delete discussionMarkers[markerKey]; + } + }); + + Object.entries(discussions).forEach(([discussionId, discussion]) => { + getDiscussionMarkers(discussion, discussionId, writeOffsets + ? (marker) => { + discussion[marker.offsetName] = marker.offset; + } + : (marker) => { + marker.offset = discussion[marker.offsetName]; + }); + }); + + if (writeOffsets && newDiscussion) { + store.commit( + 'discussion/patchNewDiscussion', + discussions[store.state.discussion.newDiscussionId], + ); + } +} + +function removeDiscussionMarkers() { + Object.entries(discussionMarkers).forEach(([, marker]) => { + clEditor.removeMarker(marker); + }); + discussionMarkers = {}; + markerKeys = []; + markerIdxMap = Object.create(null); +} + +const diffMatchPatch = new DiffMatchPatch(); + +function makePatches() { + const diffs = diffMatchPatch.diff_main(previousPatchableText, currentPatchableText); + return diffMatchPatch.patch_make(previousPatchableText, diffs); +} + +function applyPatches(patches) { + const newPatchableText = diffMatchPatch.patch_apply(patches, currentPatchableText)[0]; + let result = newPatchableText; + if (markerKeys.length) { + // Strip text markers + result = result.replace(new RegExp(`[\ue000-${String.fromCharCode((0xe000 + markerKeys.length) - 1)}]`, 'g'), ''); + } + // Expect a `contentChanged` event + if (result !== clEditor.getContent()) { + previousPatchableText = currentPatchableText; + currentPatchableText = newPatchableText; + isChangePatch = true; + } + return result; +} + +function reversePatches(patches) { + const result = diffMatchPatch.patch_deepCopy(patches).reverse(); + result.forEach((patch) => { + patch.diffs.forEach((diff) => { + diff[0] = -diff[0]; + }); + }); + return result; +} + +export default { + createClEditor(editorElt) { + this.clEditor = cledit(editorElt, editorElt.parentNode, true); + ({ clEditor } = this); + clEditor.on('contentChanged', (text) => { + const oldContent = store.getters['content/current']; + const newContent = { + ...utils.deepCopy(oldContent), + text: utils.sanitizeText(text), + }; + syncDiscussionMarkers(newContent, true); + if (!isChangePatch) { + previousPatchableText = currentPatchableText; + currentPatchableText = diffUtils.makePatchableText(newContent, markerKeys, markerIdxMap); + } else { + // Take a chance to restore discussion offsets on undo/redo + newContent.text = currentPatchableText; + diffUtils.restoreDiscussionOffsets(newContent, markerKeys); + syncDiscussionMarkers(newContent, false); + } + store.dispatch('content/patchCurrent', newContent); + isChangePatch = false; + }); + clEditor.on('focus', () => store.commit('discussion/setNewCommentFocus', false)); + }, + initClEditorInternal(opts) { + const content = store.getters['content/current']; + if (content) { + removeDiscussionMarkers(); // Markers will be recreated on contentChanged + const contentState = store.getters['contentState/current']; + const options = Object.assign({ + selectionStart: contentState.selectionStart, + selectionEnd: contentState.selectionEnd, + patchHandler: { + makePatches, + applyPatches, + reversePatches, + }, + }, opts); + + if (contentId !== content.id) { + contentId = content.id; + currentPatchableText = diffUtils.makePatchableText(content, markerKeys, markerIdxMap); + previousPatchableText = currentPatchableText; + syncDiscussionMarkers(content, false); + options.content = content.text; + } + + clEditor.init(options); + } + }, + applyContent() { + if (clEditor) { + const content = store.getters['content/current']; + if (clEditor.setContent(content.text, true).range) { + // Marker will be recreated on contentChange + removeDiscussionMarkers(); + } else { + syncDiscussionMarkers(content, false); + } + } + }, + getTrimmedSelection() { + const { selectionMgr } = clEditor; + let start = Math.min(selectionMgr.selectionStart, selectionMgr.selectionEnd); + let end = Math.max(selectionMgr.selectionStart, selectionMgr.selectionEnd); + const text = clEditor.getContent(); + while ((text[start] || '').match(/\s/)) { + start += 1; + } + while ((text[end - 1] || '').match(/\s/)) { + end -= 1; + } + return start < end && { start, end }; + }, + initHighlighters() { + store.watch( + () => store.getters['discussion/newDiscussion'], + () => syncDiscussionMarkers(store.getters['content/current'], false), + ); + + store.watch( + () => store.getters['discussion/currentFileDiscussions'], + (discussions) => { + const classGetter = (type, discussionId) => () => { + const classes = [`discussion-${type}-highlighting--${discussionId}`, `discussion-${type}-highlighting`]; + if (store.state.discussion.currentDiscussionId === discussionId) { + classes.push(`discussion-${type}-highlighting--selected`); + } + return classes; + }; + const offsetGetter = discussionId => () => { + const startMarker = discussionMarkers[`${discussionId}:start`]; + const endMarker = discussionMarkers[`${discussionId}:end`]; + return startMarker && endMarker && { + start: startMarker.offset, + end: endMarker.offset, + }; + }; + + // Editor class appliers + const oldEditorClassAppliers = editorClassAppliers; + editorClassAppliers = {}; + Object.keys(discussions).forEach((discussionId) => { + const classApplier = oldEditorClassAppliers[discussionId] || new EditorClassApplier( + classGetter('editor', discussionId), + offsetGetter(discussionId), + { discussionId }, + ); + editorClassAppliers[discussionId] = classApplier; + }); + // Clean unused class appliers + Object.entries(oldEditorClassAppliers).forEach(([discussionId, classApplier]) => { + if (!editorClassAppliers[discussionId]) { + classApplier.stop(); + } + }); + + // Preview class appliers + const oldPreviewClassAppliers = previewClassAppliers; + previewClassAppliers = {}; + Object.keys(discussions).forEach((discussionId) => { + const classApplier = oldPreviewClassAppliers[discussionId] || new PreviewClassApplier( + classGetter('preview', discussionId), + offsetGetter(discussionId), + { discussionId }, + ); + previewClassAppliers[discussionId] = classApplier; + }); + // Clean unused class appliers + Object.entries(oldPreviewClassAppliers).forEach(([discussionId, classApplier]) => { + if (!previewClassAppliers[discussionId]) { + classApplier.stop(); + } + }); + }, + ); + }, +}; + diff --git a/src/services/editor/editorSvcUtils.js b/src/services/editor/editorSvcUtils.js new file mode 100644 index 0000000..6edc584 --- /dev/null +++ b/src/services/editor/editorSvcUtils.js @@ -0,0 +1,151 @@ +import DiffMatchPatch from 'diff-match-patch'; +import cledit from './cledit'; +import animationSvc from '../animationSvc'; +import store from '../../store'; + +const diffMatchPatch = new DiffMatchPatch(); + +export default { + /** + * Get an object describing the position of the scroll bar in the file. + */ + getScrollPosition(elt = store.getters['layout/styles'].showEditor + ? this.editorElt : this.previewElt) { + const dimensionKey = elt === this.editorElt + ? 'editorDimension' + : 'previewDimension'; + const { scrollTop } = elt.parentNode; + let result; + if (this.previewCtxMeasured) { + this.previewCtxMeasured.sectionDescList.some((sectionDesc, sectionIdx) => { + if (scrollTop >= sectionDesc[dimensionKey].endOffset) { + return false; + } + const posInSection = (scrollTop - sectionDesc[dimensionKey].startOffset) / + (sectionDesc[dimensionKey].height || 1); + result = { + sectionIdx, + posInSection, + }; + return true; + }); + } + return result; + }, + + /** + * Restore the scroll position from the current file content state. + */ + restoreScrollPosition() { + const { scrollPosition } = store.getters['contentState/current']; + if (scrollPosition && this.previewCtxMeasured) { + const sectionDesc = this.previewCtxMeasured.sectionDescList[scrollPosition.sectionIdx]; + if (sectionDesc) { + const editorScrollTop = sectionDesc.editorDimension.startOffset + + (sectionDesc.editorDimension.height * scrollPosition.posInSection); + this.editorElt.parentNode.scrollTop = Math.floor(editorScrollTop); + const previewScrollTop = sectionDesc.previewDimension.startOffset + + (sectionDesc.previewDimension.height * scrollPosition.posInSection); + this.previewElt.parentNode.scrollTop = Math.floor(previewScrollTop); + } + } + }, + + /** + * Get the offset in the preview corresponding to the offset of the markdown in the editor + */ + getPreviewOffset( + editorOffset, + sectionDescList = (this.previewCtxWithDiffs || {}).sectionDescList, + ) { + if (!sectionDescList) { + return null; + } + let offset = editorOffset; + let previewOffset = 0; + sectionDescList.some((sectionDesc) => { + if (!sectionDesc.textToPreviewDiffs) { + previewOffset = null; + return true; + } + if (sectionDesc.section.text.length >= offset) { + previewOffset += diffMatchPatch.diff_xIndex(sectionDesc.textToPreviewDiffs, offset); + return true; + } + offset -= sectionDesc.section.text.length; + previewOffset += sectionDesc.previewText.length; + return false; + }); + return previewOffset; + }, + + /** + * Get the offset of the markdown in the editor corresponding to the offset in the preview + */ + getEditorOffset( + previewOffset, + sectionDescList = (this.previewCtxWithDiffs || {}).sectionDescList, + ) { + if (!sectionDescList) { + return null; + } + let offset = previewOffset; + let editorOffset = 0; + sectionDescList.some((sectionDesc) => { + if (!sectionDesc.textToPreviewDiffs) { + editorOffset = null; + return true; + } + if (sectionDesc.previewText.length >= offset) { + const previewToTextDiffs = sectionDesc.textToPreviewDiffs + .map(diff => [-diff[0], diff[1]]); + editorOffset += diffMatchPatch.diff_xIndex(previewToTextDiffs, offset); + return true; + } + offset -= sectionDesc.previewText.length; + editorOffset += sectionDesc.section.text.length; + return false; + }); + return editorOffset; + }, + + /** + * Get the coordinates of an offset in the preview + */ + getPreviewOffsetCoordinates(offset) { + const start = cledit.Utils.findContainer(this.previewElt, offset && offset - 1); + const end = cledit.Utils.findContainer(this.previewElt, offset || offset + 1); + const range = document.createRange(); + range.setStart(start.container, start.offsetInContainer); + range.setEnd(end.container, end.offsetInContainer); + const rect = range.getBoundingClientRect(); + const contentRect = this.previewElt.getBoundingClientRect(); + return { + top: Math.round((rect.top - contentRect.top) + this.previewElt.scrollTop), + height: Math.round(rect.height), + left: Math.round((rect.right - contentRect.left) + this.previewElt.scrollLeft), + }; + }, + + /** + * Scroll the preview (or the editor if preview is hidden) to the specified anchor + */ + scrollToAnchor(anchor) { + let scrollTop = 0; + const scrollerElt = this.previewElt.parentNode; + const elt = document.getElementById(anchor); + if (elt) { + scrollTop = elt.offsetTop; + } + const maxScrollTop = scrollerElt.scrollHeight - scrollerElt.offsetHeight; + if (scrollTop < 0) { + scrollTop = 0; + } else if (scrollTop > maxScrollTop) { + scrollTop = maxScrollTop; + } + animationSvc.animate(scrollerElt) + .scrollTop(scrollTop) + .duration(360) + .start(); + }, +}; diff --git a/src/services/editor/sectionUtils.js b/src/services/editor/sectionUtils.js new file mode 100644 index 0000000..86fe120 --- /dev/null +++ b/src/services/editor/sectionUtils.js @@ -0,0 +1,114 @@ +class SectionDimension { + constructor(startOffset, endOffset) { + this.startOffset = startOffset; + this.endOffset = endOffset; + this.height = endOffset - startOffset; + } +} + +const dimensionNormalizer = dimensionName => (editorSvc) => { + const dimensionList = editorSvc.previewCtx.sectionDescList + .map(sectionDesc => sectionDesc[dimensionName]); + let dimension; + let i; + let j; + for (i = 0; i < dimensionList.length; i += 1) { + dimension = dimensionList[i]; + if (dimension.height) { + for (j = i + 1; j < dimensionList.length && dimensionList[j].height === 0; j += 1) { + // Loop + } + const normalizeFactor = j - i; + if (normalizeFactor !== 1) { + const normalizedHeight = dimension.height / normalizeFactor; + dimension.height = normalizedHeight; + dimension.endOffset = dimension.startOffset + dimension.height; + for (j = i + 1; j < i + normalizeFactor; j += 1) { + const startOffset = dimension.endOffset; + dimension = dimensionList[j]; + dimension.startOffset = startOffset; + dimension.height = normalizedHeight; + dimension.endOffset = dimension.startOffset + dimension.height; + } + i = j - 1; + } + } + } +}; + +const normalizeEditorDimensions = dimensionNormalizer('editorDimension'); +const normalizePreviewDimensions = dimensionNormalizer('previewDimension'); +const normalizeTocDimensions = dimensionNormalizer('tocDimension'); + +export default { + measureSectionDimensions(editorSvc) { + let editorSectionOffset = 0; + let previewSectionOffset = 0; + let tocSectionOffset = 0; + let sectionDesc = editorSvc.previewCtx.sectionDescList[0]; + let nextSectionDesc; + let i = 1; + for (; i < editorSvc.previewCtx.sectionDescList.length; i += 1) { + nextSectionDesc = editorSvc.previewCtx.sectionDescList[i]; + + // Measure editor section + let newEditorSectionOffset = nextSectionDesc.editorElt + ? nextSectionDesc.editorElt.offsetTop + : editorSectionOffset; + newEditorSectionOffset = newEditorSectionOffset > editorSectionOffset + ? newEditorSectionOffset + : editorSectionOffset; + sectionDesc.editorDimension = new SectionDimension( + editorSectionOffset, + newEditorSectionOffset, + ); + editorSectionOffset = newEditorSectionOffset; + + // Measure preview section + let newPreviewSectionOffset = nextSectionDesc.previewElt + ? nextSectionDesc.previewElt.offsetTop + : previewSectionOffset; + newPreviewSectionOffset = newPreviewSectionOffset > previewSectionOffset + ? newPreviewSectionOffset + : previewSectionOffset; + sectionDesc.previewDimension = new SectionDimension( + previewSectionOffset, + newPreviewSectionOffset, + ); + previewSectionOffset = newPreviewSectionOffset; + + // Measure TOC section + let newTocSectionOffset = nextSectionDesc.tocElt + ? nextSectionDesc.tocElt.offsetTop + (nextSectionDesc.tocElt.offsetHeight / 2) + : tocSectionOffset; + newTocSectionOffset = newTocSectionOffset > tocSectionOffset + ? newTocSectionOffset + : tocSectionOffset; + sectionDesc.tocDimension = new SectionDimension(tocSectionOffset, newTocSectionOffset); + tocSectionOffset = newTocSectionOffset; + + sectionDesc = nextSectionDesc; + } + + // Last section + sectionDesc = editorSvc.previewCtx.sectionDescList[i - 1]; + if (sectionDesc) { + sectionDesc.editorDimension = new SectionDimension( + editorSectionOffset, + editorSvc.editorElt.scrollHeight, + ); + sectionDesc.previewDimension = new SectionDimension( + previewSectionOffset, + editorSvc.previewElt.scrollHeight, + ); + sectionDesc.tocDimension = new SectionDimension( + tocSectionOffset, + editorSvc.tocElt.scrollHeight, + ); + } + + normalizeEditorDimensions(editorSvc); + normalizePreviewDimensions(editorSvc); + normalizeTocDimensions(editorSvc); + }, +}; diff --git a/src/services/editorSvc.js b/src/services/editorSvc.js new file mode 100644 index 0000000..d59d0cf --- /dev/null +++ b/src/services/editorSvc.js @@ -0,0 +1,685 @@ +import Vue from 'vue'; +import DiffMatchPatch from 'diff-match-patch'; +import Prism from 'prismjs'; +import markdownItPandocRenderer from 'markdown-it-pandoc-renderer'; +import md5 from 'js-md5'; +import cledit from './editor/cledit'; +import pagedown from '../libs/pagedown'; +import htmlSanitizer from '../libs/htmlSanitizer'; +import markdownConversionSvc from './markdownConversionSvc'; +import markdownGrammarSvc from './markdownGrammarSvc'; +import sectionUtils from './editor/sectionUtils'; +import extensionSvc from './extensionSvc'; +import editorSvcDiscussions from './editor/editorSvcDiscussions'; +import editorSvcUtils from './editor/editorSvcUtils'; +import utils from './utils'; +import store from '../store'; +import syncSvc from './syncSvc'; +import constants from '../data/constants'; +import localDbSvc from './localDbSvc'; + +const allowDebounce = (action, wait) => { + let timeoutId; + return (doDebounce = false, ...params) => { + clearTimeout(timeoutId); + if (doDebounce) { + timeoutId = setTimeout(() => action(...params), wait); + } else { + action(...params); + } + }; +}; + +const diffMatchPatch = new DiffMatchPatch(); +let instantPreview = true; +let tokens; + +class SectionDesc { + constructor(section, previewElt, tocElt, html) { + this.section = section; + this.editorElt = section.elt; + this.previewElt = previewElt; + this.tocElt = tocElt; + this.html = html; + } +} + +const pathUrlMap = Object.create(null); + +const getImgUrl = async (uri) => { + if (uri.indexOf('http://') !== 0 && uri.indexOf('https://') !== 0) { + const currDirNode = store.getters['explorer/selectedNodeFolder']; + const absoluteImgPath = utils.getAbsoluteFilePath(currDirNode, uri); + if (pathUrlMap[absoluteImgPath]) { + return pathUrlMap[absoluteImgPath]; + } + const md5Id = md5(absoluteImgPath); + let imgItem = await localDbSvc.getImgItem(md5Id); + if (!imgItem) { + await syncSvc.syncImg(absoluteImgPath); + imgItem = await localDbSvc.getImgItem(md5Id); + } + if (imgItem) { + // imgItem 如果不存在 则加载 TODO + const imgFile = utils.base64ToBlob(imgItem.content, uri); + const url = URL.createObjectURL(imgFile); + pathUrlMap[absoluteImgPath] = url; + return url; + } + return ''; + } + return uri; +}; + +// Use a vue instance as an event bus +const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils, { + // Elements + editorElt: null, + previewElt: null, + tocElt: null, + // Other objects + clEditor: null, + pagedownEditor: null, + options: null, + prismGrammars: null, + converter: null, + parsingCtx: null, + conversionCtx: null, + previewCtx: { + sectionDescList: [], + }, + previewCtxMeasured: null, + previewCtxWithDiffs: null, + sectionList: null, + selectionRange: null, + previewSelectionRange: null, + previewSelectionStartOffset: null, + + /** + * Initialize the Prism grammar with the options + */ + initPrism() { + const options = { + ...this.options, + insideFences: markdownConversionSvc.defaultOptions.insideFences, + }; + this.prismGrammars = markdownGrammarSvc.makeGrammars(options); + }, + + /** + * Initialize the markdown-it converter with the options + */ + initConverter() { + this.converter = markdownConversionSvc.createConverter(this.options, true); + }, + + /** + * Initialize the cledit editor with markdown-it section parser and Prism highlighter + */ + initClEditor() { + this.previewCtxMeasured = null; + editorSvc.$emit('previewCtxMeasured', null); + this.previewCtxWithDiffs = null; + editorSvc.$emit('previewCtxWithDiffs', null); + const options = { + sectionHighlighter: section => Prism + .highlight(section.text, this.prismGrammars[section.data]), + sectionParser: (text) => { + this.parsingCtx = markdownConversionSvc.parseSections(this.converter, text); + return this.parsingCtx.sections; + }, + getCursorFocusRatio: () => { + if (store.getters['data/layoutSettings'].focusMode) { + return 1; + } + return 0.15; + }, + }; + this.initClEditorInternal(options); + this.restoreScrollPosition(); + }, + + /** + * Finish the conversion initiated by the section parser + */ + convert() { + this.conversionCtx = markdownConversionSvc.convert(this.parsingCtx, this.conversionCtx); + this.$emit('conversionCtx', this.conversionCtx); + ({ tokens } = this.parsingCtx.markdownState); + }, + + /** + * Refresh the preview with the result of `convert()` + */ + async refreshPreview() { + const sectionDescList = []; + let sectionPreviewElt; + let sectionTocElt; + let sectionIdx = 0; + let sectionDescIdx = 0; + let insertBeforePreviewElt = this.previewElt.firstChild; + let insertBeforeTocElt = this.tocElt.firstChild; + let previewHtml = ''; + let loadingImages = []; + this.conversionCtx.htmlSectionDiff.forEach((item) => { + for (let i = 0; i < item[1].length; i += 1) { + const section = this.conversionCtx.sectionList[sectionIdx]; + if (item[0] === 0) { + let sectionDesc = this.previewCtx.sectionDescList[sectionDescIdx]; + sectionDescIdx += 1; + if (sectionDesc.editorElt !== section.elt) { + // Force textToPreviewDiffs computation + sectionDesc = new SectionDesc( + section, + sectionDesc.previewElt, + sectionDesc.tocElt, + sectionDesc.html, + ); + } + sectionDescList.push(sectionDesc); + previewHtml += sectionDesc.html; + sectionIdx += 1; + insertBeforePreviewElt = insertBeforePreviewElt.nextSibling; + insertBeforeTocElt = insertBeforeTocElt.nextSibling; + } else if (item[0] === -1) { + sectionDescIdx += 1; + sectionPreviewElt = insertBeforePreviewElt; + insertBeforePreviewElt = insertBeforePreviewElt.nextSibling; + this.previewElt.removeChild(sectionPreviewElt); + sectionTocElt = insertBeforeTocElt; + insertBeforeTocElt = insertBeforeTocElt.nextSibling; + this.tocElt.removeChild(sectionTocElt); + } else if (item[0] === 1) { + const html = htmlSanitizer.sanitizeHtml(this.conversionCtx.htmlSectionList[sectionIdx]); + sectionIdx += 1; + + // Create preview section element + sectionPreviewElt = document.createElement('div'); + sectionPreviewElt.className = 'cl-preview-section'; + sectionPreviewElt.innerHTML = html; + if (insertBeforePreviewElt) { + this.previewElt.insertBefore(sectionPreviewElt, insertBeforePreviewElt); + } else { + this.previewElt.appendChild(sectionPreviewElt); + } + extensionSvc.sectionPreview(sectionPreviewElt, this.options, true); + const imgs = Array.prototype.slice.call(sectionPreviewElt.getElementsByTagName('img')).map((imgElt) => { + if (imgElt.src.indexOf(constants.origin) >= 0) { + const uri = decodeURIComponent(imgElt.attributes.src.nodeValue); + imgElt.removeAttribute('src'); + return { imgElt, uri }; + } + return { imgElt }; + }); + loadingImages = [ + ...loadingImages, + ...imgs, + ]; + + Array.prototype.slice.call(sectionPreviewElt.getElementsByTagName('a')).forEach((aElt) => { + const url = aElt.attributes && aElt.attributes.href && aElt.attributes.href.nodeValue; + if (!url || url.indexOf('http://') >= 0 || url.indexOf('https://') >= 0 || url.indexOf('#') >= 0) { + return; + } + aElt.href = 'javascript:void(0);'; // eslint-disable-line no-script-url + aElt.setAttribute('onclick', `window.viewFileByPath('${utils.decodeUrlPath(url)}')`); + }); + + // Create TOC section element + sectionTocElt = document.createElement('div'); + sectionTocElt.className = 'cl-toc-section'; + const headingElt = sectionPreviewElt.querySelector('h1, h2, h3, h4, h5, h6'); + if (headingElt) { + const clonedElt = headingElt.cloneNode(true); + clonedElt.removeAttribute('id'); + sectionTocElt.appendChild(clonedElt); + // 创建一个新的 元素 + const contentElt = document.createElement('span'); + contentElt.className = 'content'; + // 将原始内容移动到新的 元素中 + while (headingElt.firstChild) { + contentElt.appendChild(headingElt.firstChild); + } + const prefixElt = document.createElement('span'); + prefixElt.className = 'prefix'; + headingElt.insertBefore(prefixElt, headingElt.firstChild); + // 将新的 元素替换原始元素 + headingElt.appendChild(contentElt); + const suffixElt = document.createElement('span'); + suffixElt.className = 'suffix'; + headingElt.appendChild(suffixElt); + } + if (insertBeforeTocElt) { + this.tocElt.insertBefore(sectionTocElt, insertBeforeTocElt); + } else { + this.tocElt.appendChild(sectionTocElt); + } + + previewHtml += html; + sectionDescList.push(new SectionDesc(section, sectionPreviewElt, sectionTocElt, html)); + } + } + }); + + this.tocElt.classList[ + this.tocElt.querySelector('.cl-toc-section *') ? 'remove' : 'add' + ]('toc-tab--empty'); + + this.previewCtx = { + markdown: this.conversionCtx.text, + html: previewHtml.replace(/^\s+|\s+$/g, ''), + text: this.previewElt.textContent, + sectionDescList, + }; + this.$emit('previewCtx', this.previewCtx); + this.makeTextToPreviewDiffs(); + + // Wait for images to load + const loadedPromises = loadingImages.map(it => new Promise((resolve, reject) => { + if (!it.imgElt.src && it.uri) { + getImgUrl(it.uri).then((newUrl) => { + it.imgElt.src = newUrl; + resolve(); + }, () => reject(new Error('加载当前空间图片出错'))); + return; + } + if (!it.imgElt.src) { + resolve(); + return; + } + const img = new window.Image(); + img.onload = resolve; + img.onerror = resolve; + img.src = it.imgElt.src; + })); + await Promise.all(loadedPromises); + + // Debounce if sections have already been measured + this.measureSectionDimensions(!!this.previewCtxMeasured); + }, + + /** + * Measure the height of each section in editor, preview and toc. + */ + measureSectionDimensions: allowDebounce((restoreScrollPosition = false, force = false) => { + if (force || editorSvc.previewCtx !== editorSvc.previewCtxMeasured) { + sectionUtils.measureSectionDimensions(editorSvc); + editorSvc.previewCtxMeasured = editorSvc.previewCtx; + if (restoreScrollPosition) { + editorSvc.restoreScrollPosition(); + } + editorSvc.$emit('previewCtxMeasured', editorSvc.previewCtxMeasured); + } + }, 500), + + /** + * Compute the diffs between editor's markdown and preview's html + * asynchronously unless there is only one section to compute. + */ + makeTextToPreviewDiffs() { + if (editorSvc.previewCtx !== editorSvc.previewCtxWithDiffs) { + const makeOne = () => { + let hasOne = false; + const hasMore = editorSvc.previewCtx.sectionDescList + .some((sectionDesc) => { + if (!sectionDesc.textToPreviewDiffs) { + if (hasOne) { + return true; + } + if (!sectionDesc.previewText) { + sectionDesc.previewText = sectionDesc.previewElt.textContent; + } + sectionDesc.textToPreviewDiffs = diffMatchPatch.diff_main( + sectionDesc.section.text, + sectionDesc.previewText, + ); + hasOne = true; + } + return false; + }); + if (hasMore) { + setTimeout(() => makeOne(), 10); + } else { + editorSvc.previewCtxWithDiffs = editorSvc.previewCtx; + editorSvc.$emit('previewCtxWithDiffs', editorSvc.previewCtxWithDiffs); + } + }; + makeOne(); + } + }, + + /** + * Save editor selection/scroll state into the store. + */ + saveContentState: allowDebounce(() => { + const scrollPosition = editorSvc.getScrollPosition() || + store.getters['contentState/current'].scrollPosition; + store.dispatch('contentState/patchCurrent', { + selectionStart: editorSvc.clEditor.selectionMgr.selectionStart, + selectionEnd: editorSvc.clEditor.selectionMgr.selectionEnd, + scrollPosition, + }); + }, 100), + + /** + * Report selection from the preview to the editor. + */ + saveSelection: allowDebounce(() => { + const selection = window.getSelection(); + let range = selection.rangeCount && selection.getRangeAt(0); + if (range) { + if ( + /* eslint-disable no-bitwise */ + !(editorSvc.previewElt.compareDocumentPosition(range.startContainer) & + window.Node.DOCUMENT_POSITION_CONTAINED_BY) || + !(editorSvc.previewElt.compareDocumentPosition(range.endContainer) & + window.Node.DOCUMENT_POSITION_CONTAINED_BY) + /* eslint-enable no-bitwise */ + ) { + range = null; + } + } + if (editorSvc.previewSelectionRange !== range) { + let previewSelectionStartOffset; + let previewSelectionEndOffset; + if (range) { + const startRange = document.createRange(); + startRange.setStart(editorSvc.previewElt, 0); + startRange.setEnd(range.startContainer, range.startOffset); + previewSelectionStartOffset = `${startRange}`.length; + previewSelectionEndOffset = previewSelectionStartOffset + `${range}`.length; + const editorStartOffset = editorSvc.getEditorOffset(previewSelectionStartOffset); + const editorEndOffset = editorSvc.getEditorOffset(previewSelectionEndOffset); + if (editorStartOffset != null && editorEndOffset != null) { + editorSvc.clEditor.selectionMgr.setSelectionStartEnd( + editorStartOffset, + editorEndOffset, + ); + } + } + editorSvc.previewSelectionRange = range; + editorSvc.$emit('previewSelectionRange', editorSvc.previewSelectionRange); + } + }, 50), + + /** + * Returns the pandoc AST generated from the file tokens and the converter options + */ + getPandocAst() { + return tokens && markdownItPandocRenderer(tokens, this.converter.options); + }, + + /** + * Pass the elements to the store and initialize the editor. + */ + init(editorElt, previewElt, tocElt) { + this.editorElt = editorElt; + this.previewElt = previewElt; + this.tocElt = tocElt; + + this.createClEditor(editorElt); + + this.clEditor.on('contentChanged', (content, diffs, sectionList) => { + this.parsingCtx = { + ...this.parsingCtx, + sectionList, + }; + }); + this.clEditor.undoMgr.on('undoStateChange', () => { + const canUndo = this.clEditor.undoMgr.canUndo(); + if (canUndo !== store.state.layout.canUndo) { + store.commit('layout/setCanUndo', canUndo); + } + const canRedo = this.clEditor.undoMgr.canRedo(); + if (canRedo !== store.state.layout.canRedo) { + store.commit('layout/setCanRedo', canRedo); + } + }); + this.pagedownEditor = pagedown({ + input: Object.create(this.clEditor), + }); + this.pagedownEditor.run(); + this.pagedownEditor.hooks.set('insertLinkDialog', (callback) => { + store.dispatch('modal/open', { + type: 'link', + callback, + }); + return true; + }); + this.pagedownEditor.hooks.set('insertImageDialog', (callback) => { + store.dispatch('modal/open', { + type: 'image', + callback, + }); + return true; + }); + this.pagedownEditor.hooks.set('insertChatGptDialog', (callback) => { + store.dispatch('modal/open', { + type: 'chatGpt', + callback, + }); + return true; + }); + this.pagedownEditor.hooks.set('insertImageUploading', (callback) => { + callback(store.getters['img/currImgId']); + return true; + }); + this.editorElt.parentNode.addEventListener('scroll', () => this.saveContentState(true)); + this.previewElt.parentNode.addEventListener('scroll', () => this.saveContentState(true)); + + const refreshPreview = allowDebounce(() => { + this.convert(); + if (instantPreview) { + this.refreshPreview(); + this.measureSectionDimensions(false, true); + } else { + setTimeout(() => this.refreshPreview(), 10); + } + instantPreview = false; + }, 25); + + let newSectionList; + let newSelectionRange; + const onEditorChanged = allowDebounce(() => { + if (this.sectionList !== newSectionList) { + this.sectionList = newSectionList; + this.$emit('sectionList', this.sectionList); + refreshPreview(!instantPreview); + } + if (this.selectionRange !== newSelectionRange) { + this.selectionRange = newSelectionRange; + this.$emit('selectionRange', this.selectionRange); + } + this.saveContentState(); + }, 10); + + this.clEditor.selectionMgr.on('selectionChanged', (start, end, selectionRange) => { + newSelectionRange = selectionRange; + onEditorChanged(!instantPreview); + }); + + /* ----------------------------- + * Inline images + */ + + const imgCache = Object.create(null); + + const hashImgElt = imgElt => `${imgElt.src}:${imgElt.width || -1}:${imgElt.height || -1}`; + + const addToImgCache = (imgElt) => { + const hash = hashImgElt(imgElt); + let entries = imgCache[hash]; + if (!entries) { + entries = []; + imgCache[hash] = entries; + } + entries.push(imgElt); + }; + + const getFromImgCache = (imgEltsToCache) => { + const hash = hashImgElt(imgEltsToCache); + const entries = imgCache[hash]; + if (!entries) { + return null; + } + let imgElt; + return entries + .some((entry) => { + if (this.editorElt.contains(entry)) { + return false; + } + imgElt = entry; + return true; + }) && imgElt; + }; + + const triggerImgCacheGc = cledit.Utils.debounce(() => { + Object.entries(imgCache).forEach(([src, entries]) => { + // Filter entries that are not attached to the DOM + const filteredEntries = entries.filter(imgElt => this.editorElt.contains(imgElt)); + if (filteredEntries.length) { + imgCache[src] = filteredEntries; + } else { + delete imgCache[src]; + } + }); + }, 100); + + let imgEltsToCache = []; + if (store.getters['data/computedSettings'].editor.inlineImages) { + this.clEditor.highlighter.on('sectionHighlighted', (section) => { + const loadImgs = []; + section.elt.getElementsByClassName('token img').cl_each((imgTokenElt) => { + const srcElt = imgTokenElt.querySelector('.token.cl-src'); + if (srcElt) { + // Create an img element before the .img.token and wrap both elements + // into a .token.img-wrapper + const imgElt = document.createElement('img'); + imgElt.style.display = 'none'; + const uri = srcElt.textContent; + if (!/^unsafe/.test(htmlSanitizer.sanitizeUri(uri, true))) { + imgElt.onload = () => { + imgElt.style.display = ''; + }; + imgElt.src = uri; + // Take img size into account + const sizeElt = imgTokenElt.querySelector('.token.cl-size'); + if (sizeElt) { + const match = sizeElt.textContent.match(/=(\d*)x(\d*)/); + if (match[1]) { + imgElt.width = parseInt(match[1], 10); + } + if (match[2]) { + imgElt.height = parseInt(match[2], 10); + } + } + imgEltsToCache.push(imgElt); + if (imgElt.src.indexOf(origin) >= 0) { + imgElt.removeAttribute('src'); + loadImgs.push({ imgElt, uri: decodeURIComponent(uri) }); + } + } + const imgTokenWrapper = document.createElement('span'); + imgTokenWrapper.className = 'token img-wrapper'; + imgTokenElt.parentNode.insertBefore(imgTokenWrapper, imgTokenElt); + imgTokenWrapper.appendChild(imgElt); + imgTokenWrapper.appendChild(imgTokenElt); + } + }); + if (loadImgs.length) { + // Wait for images to load + const loadWorkspaceImg = loadImgs.map(it => new Promise((resolve, reject) => { + getImgUrl(it.uri).then((newUrl) => { + it.imgElt.src = newUrl; + resolve(); + }, () => reject(new Error(`加载当前空间图片出错,uri:${it.uri}`))); + })); + Promise.all(loadWorkspaceImg).then(); + } + }); + } + this.clEditor.highlighter.on('highlighted', () => { + imgEltsToCache.forEach((imgElt) => { + const cachedImgElt = getFromImgCache(imgElt); + if (cachedImgElt) { + // Found a previously loaded image that has just been released + imgElt.parentNode.replaceChild(cachedImgElt, imgElt); + } else { + addToImgCache(imgElt); + } + }); + imgEltsToCache = []; + // Eject released images from cache + triggerImgCacheGc(); + }); + + this.clEditor.on('contentChanged', (content, diffs, sectionList) => { + newSectionList = sectionList; + onEditorChanged(!instantPreview); + }); + + // clEditorSvc.setPreviewElt(element[0].querySelector('.preview__inner-2')) + // var previewElt = element[0].querySelector('.preview') + // clEditorSvc.isPreviewTop = previewElt.scrollTop < 10 + // previewElt.addEventListener('scroll', function () { + // var isPreviewTop = previewElt.scrollTop < 10 + // if (isPreviewTop !== clEditorSvc.isPreviewTop) { + // clEditorSvc.isPreviewTop = isPreviewTop + // scope.$apply() + // } + // }) + + // Watch file content changes + let lastContentId = null; + let lastProperties; + store.watch( + () => store.getters['content/currentChangeTrigger'], + () => { + const content = store.getters['content/current']; + // Track ID changes + let initClEditor = false; + if (content.id !== lastContentId) { + instantPreview = true; + lastContentId = content.id; + initClEditor = true; + } + // Track properties changes + if (content.properties !== lastProperties) { + lastProperties = content.properties; + const options = extensionSvc.getOptions(store.getters['content/currentProperties']); + if (utils.serializeObject(options) !== utils.serializeObject(this.options)) { + this.options = options; + this.initPrism(); + this.initConverter(); + initClEditor = true; + } + } + if (initClEditor) { + this.initClEditor(); + } + // Apply potential text and discussion changes + this.applyContent(); + }, { + immediate: true, + }, + ); + + // Disable editor if hidden or if no content is loaded + store.watch( + () => store.getters['content/isCurrentEditable'], + editable => this.clEditor.toggleEditable(!!editable), { + immediate: true, + }, + ); + + store.watch( + () => utils.serializeObject(store.getters['layout/styles']), + () => this.measureSectionDimensions(false, true, true), + ); + + this.initHighlighters(); + this.$emit('inited'); + }, +}); + +export default editorSvc; diff --git a/src/services/explorerSvc.js b/src/services/explorerSvc.js new file mode 100644 index 0000000..0735f73 --- /dev/null +++ b/src/services/explorerSvc.js @@ -0,0 +1,98 @@ +import store from '../store'; +import workspaceSvc from './workspaceSvc'; +import badgeSvc from './badgeSvc'; + +export default { + newItem(isFolder = false) { + let parentId = store.getters['explorer/selectedNodeFolder'].item.id; + if (parentId === 'trash' // Not allowed to create new items in the trash + || (isFolder && parentId === 'temp') // Not allowed to create new folders in the temp folder + ) { + parentId = null; + } + store.dispatch('explorer/openNode', parentId); + store.commit('explorer/setNewItem', { + type: isFolder ? 'folder' : 'file', + parentId, + }); + }, + async deleteItem() { + const selectedNode = store.getters['explorer/selectedNode']; + if (selectedNode.isNil) { + return; + } + + if (selectedNode.isTrash || selectedNode.item.parentId === 'trash') { + try { + await store.dispatch('modal/open', 'trashDeletion'); + } catch (e) { + // Cancel + } + return; + } + + // See if we have a confirmation dialog to show + let moveToTrash = true; + try { + if (selectedNode.isTemp) { + await store.dispatch('modal/open', 'tempFolderDeletion'); + moveToTrash = false; + } else if (selectedNode.item.parentId === 'temp') { + await store.dispatch('modal/open', { + type: 'tempFileDeletion', + item: selectedNode.item, + }); + moveToTrash = false; + } else if (selectedNode.isFolder) { + await store.dispatch('modal/open', { + type: 'folderDeletion', + item: selectedNode.item, + }); + } + } catch (e) { + return; // cancel + } + + const deleteFile = (id) => { + if (moveToTrash) { + workspaceSvc.setOrPatchItem({ + id, + parentId: 'trash', + }); + } else { + workspaceSvc.deleteFile(id); + } + }; + + if (selectedNode === store.getters['explorer/selectedNode']) { + const currentFileId = store.getters['file/current'].id; + let doClose = selectedNode.item.id === currentFileId; + if (selectedNode.isFolder) { + const recursiveDelete = (folderNode) => { + folderNode.folders.forEach(recursiveDelete); + folderNode.files.forEach((fileNode) => { + doClose = doClose || fileNode.item.id === currentFileId; + deleteFile(fileNode.item.id); + }); + store.commit('folder/deleteItem', folderNode.item.id); + }; + recursiveDelete(selectedNode); + badgeSvc.addBadge('removeFolder'); + } else { + deleteFile(selectedNode.item.id); + badgeSvc.addBadge('removeFile'); + } + if (doClose) { + // Close the current file by opening the last opened, not deleted one + store.getters['data/lastOpenedIds'].some((id) => { + const file = store.state.file.itemsById[id]; + if (file.parentId === 'trash') { + return false; + } + store.commit('file/setCurrentId', id); + return true; + }); + } + } + }, +}; diff --git a/src/services/exportSvc.js b/src/services/exportSvc.js new file mode 100644 index 0000000..4106474 --- /dev/null +++ b/src/services/exportSvc.js @@ -0,0 +1,193 @@ +import md5 from 'js-md5'; +import FileSaver from 'file-saver'; +import TemplateWorker from 'worker-loader!./templateWorker.js'; // eslint-disable-line +import localDbSvc from './localDbSvc'; +import markdownConversionSvc from './markdownConversionSvc'; +import extensionSvc from './extensionSvc'; +import utils from './utils'; +import store from '../store'; +import htmlSanitizer from '../libs/htmlSanitizer'; + +function groupHeadings(headings, level = 1) { + const result = []; + let currentItem; + + function pushCurrentItem() { + if (currentItem) { + if (currentItem.children.length > 0) { + currentItem.children = groupHeadings(currentItem.children, level + 1); + } + result.push(currentItem); + } + } + headings.forEach((heading) => { + if (heading.level !== level) { + currentItem = currentItem || { + children: [], + }; + currentItem.children.push(heading); + } else { + pushCurrentItem(); + currentItem = heading; + } + }); + pushCurrentItem(); + return result; +} + +const getImgBase64 = async (uri) => { + if (uri.indexOf('http://') !== 0 && uri.indexOf('https://') !== 0) { + const currDirNode = store.getters['explorer/selectedNodeFolder']; + const absoluteImgPath = utils.getAbsoluteFilePath(currDirNode, uri); + const md5Id = md5(absoluteImgPath); + const imgItem = await localDbSvc.getImgItem(md5Id); + if (imgItem) { + const potIdx = uri.lastIndexOf('.'); + const suffix = potIdx > -1 ? uri.substring(potIdx + 1) : 'png'; + const mime = `image/${suffix}`; + return `data:${mime};base64,${imgItem.content}`; + } + return ''; + } + return uri; +}; + + +const containerElt = document.createElement('div'); +containerElt.className = 'hidden-rendering-container'; +document.body.appendChild(containerElt); + +export default { + /** + * Apply the template to the file content + */ + async applyTemplate(fileId, template = { + value: '{{{files.0.content.text}}}', + helpers: '', + }, pdf = false) { + const file = store.state.file.itemsById[fileId]; + const content = await localDbSvc.loadItem(`${fileId}/content`); + const properties = utils.computeProperties(content.properties); + const options = extensionSvc.getOptions(properties); + const converter = markdownConversionSvc.createConverter(options, true); + const parsingCtx = markdownConversionSvc.parseSections(converter, content.text); + const conversionCtx = markdownConversionSvc.convert(parsingCtx); + const html = conversionCtx.htmlSectionList.map(htmlSanitizer.sanitizeHtml).join(''); + const colorThemeClass = `app--${store.getters['data/computedSettings'].colorTheme}`; + const themeClass = `preview-theme--${store.state.theme.currPreviewTheme}`; + let themeStyleContent = ''; + const themeStyleEle = document.getElementById(`preview-theme-${store.state.theme.currPreviewTheme}`); + if (themeStyleEle) { + themeStyleContent = themeStyleEle.innerText; + } + containerElt.innerHTML = html; + extensionSvc.sectionPreview(containerElt, options); + + // Unwrap tables + containerElt.querySelectorAll('.table-wrapper').cl_each((wrapperElt) => { + while (wrapperElt.firstChild) { + wrapperElt.parentNode.insertBefore(wrapperElt.firstChild, wrapperElt.nextSibling); + } + wrapperElt.parentNode.removeChild(wrapperElt); + }); + + // 替换相对路径图片为blob图片 + const imgs = Array.prototype.slice.call(containerElt.getElementsByTagName('img')).map((imgElt) => { + let uri = imgElt.attributes && imgElt.attributes.src && imgElt.attributes.src.nodeValue; + if (uri && uri.indexOf('http://') !== 0 && uri.indexOf('https://') !== 0) { + uri = decodeURIComponent(uri); + imgElt.removeAttribute('src'); + return { imgElt, uri }; + } + return { imgElt }; + }); + const loadedPromises = imgs.map(it => new Promise((resolve, reject) => { + if (!it.imgElt.src && it.uri) { + getImgBase64(it.uri).then((newUrl) => { + it.imgElt.src = newUrl; + resolve(); + }, () => reject(new Error('加载当前空间图片出错'))); + return; + } + resolve(); + })); + await Promise.all(loadedPromises); + + // Make TOC + const allHeaders = containerElt.querySelectorAll('h1,h2,h3,h4,h5,h6'); + Array.prototype.slice.call(allHeaders).forEach((headingElt) => { + // 创建一个新的 元素 + const contentElt = document.createElement('span'); + contentElt.className = 'content'; + // 将原始内容移动到新的 元素中 + while (headingElt.firstChild) { + contentElt.appendChild(headingElt.firstChild); + } + const prefixElt = document.createElement('span'); + prefixElt.className = 'prefix'; + headingElt.insertBefore(prefixElt, headingElt.firstChild); + // 将新的 元素替换原始元素 + headingElt.appendChild(contentElt); + const suffixElt = document.createElement('span'); + suffixElt.className = 'suffix'; + headingElt.appendChild(suffixElt); + }); + const headings = allHeaders.cl_map(headingElt => ({ + title: headingElt.textContent, + anchor: headingElt.id, + level: parseInt(headingElt.tagName.slice(1), 10), + children: [], + })); + const toc = groupHeadings(headings); + const view = { + pdf, + files: [{ + name: file.name, + content: { + text: content.text, + properties, + yamlProperties: content.properties, + html: containerElt.innerHTML, + toc, + colorThemeClass, + themeClass, + themeStyleContent, + }, + }], + }; + containerElt.innerHTML = ''; + + // Run template conversion in a Worker to prevent attacks from helpers + const worker = new TemplateWorker(); + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + worker.terminate(); + reject(new Error('Template generation timeout.')); + }, 10000); + worker.addEventListener('message', (e) => { + clearTimeout(timeoutId); + worker.terminate(); + // e.data can contain unsafe data if helpers attempts to call postMessage + const [err, result] = e.data; + if (err) { + reject(new Error(`${err}`)); + } else { + resolve(`${result}`); + } + }); + worker.postMessage([template.value, view, template.helpers]); + }); + }, + + /** + * Export a file to disk. + */ + async exportToDisk(fileId, type, template) { + const file = store.state.file.itemsById[fileId]; + const html = await this.applyTemplate(fileId, template); + const blob = new Blob([html], { + type: 'text/plain;charset=utf-8', + }); + FileSaver.saveAs(blob, `${file.name}.${type}`); + }, +}; diff --git a/src/services/extensionSvc.js b/src/services/extensionSvc.js new file mode 100644 index 0000000..b288259 --- /dev/null +++ b/src/services/extensionSvc.js @@ -0,0 +1,37 @@ +const getOptionsListeners = []; +const initConverterListeners = []; +const sectionPreviewListeners = []; + +export default { + onGetOptions(listener) { + getOptionsListeners.push(listener); + }, + + onInitConverter(priority, listener) { + initConverterListeners[priority] = listener; + }, + + onSectionPreview(listener) { + sectionPreviewListeners.push(listener); + }, + + getOptions(properties, isCurrentFile) { + return getOptionsListeners.reduce((options, listener) => { + listener(options, properties, isCurrentFile); + return options; + }, {}); + }, + + initConverter(markdown, options) { + // Use forEach as it's a sparsed array + initConverterListeners.forEach((listener) => { + listener(markdown, options); + }); + }, + + sectionPreview(elt, options, isEditor) { + sectionPreviewListeners.forEach((listener) => { + listener(elt, options, isEditor); + }); + }, +}; diff --git a/src/services/gitWorkspaceSvc.js b/src/services/gitWorkspaceSvc.js new file mode 100644 index 0000000..67a8b59 --- /dev/null +++ b/src/services/gitWorkspaceSvc.js @@ -0,0 +1,236 @@ +import store from '../store'; +import utils from '../services/utils'; + +const endsWith = (str, suffix) => str.slice(-suffix.length) === suffix; + +export default { + shaByPath: Object.create(null), + makeChanges(tree) { + const workspacePath = store.getters['workspace/currentWorkspace'].path || ''; + + // Store all blobs sha + this.shaByPath = Object.create(null); + // Store interesting paths + const treeFolderMap = Object.create(null); + const treeFileMap = Object.create(null); + const treeDataMap = Object.create(null); + const treeSyncLocationMap = Object.create(null); + const treePublishLocationMap = Object.create(null); + + tree.filter(({ type, path }) => type === 'blob' && path.indexOf(workspacePath) === 0) + .forEach((blobEntry) => { + // Make path relative + const path = blobEntry.path.slice(workspacePath.length); + // Collect blob sha + this.shaByPath[path] = blobEntry.sha; + if (path.indexOf('.stackedit-data/') === 0) { + treeDataMap[path] = true; + } else { + // Collect parents path + let parentPath = ''; + path.split('/').slice(0, -1).forEach((folderName) => { + const folderPath = `${parentPath}${folderName}/`; + treeFolderMap[folderPath] = parentPath; + parentPath = folderPath; + }); + // Collect file path + if (endsWith(path, '.md')) { + treeFileMap[path] = parentPath; + } else if (endsWith(path, '.sync')) { + treeSyncLocationMap[path] = true; + } else if (endsWith(path, '.publish')) { + treePublishLocationMap[path] = true; + } + } + }); + + // Collect changes + const changes = []; + const idsByPath = {}; + const syncDataByPath = store.getters['data/syncDataById']; + const { itemIdsByGitPath } = store.getters; + const getIdFromPath = (path, isFile) => { + let itemId = idsByPath[path]; + if (!itemId) { + const existingItemId = itemIdsByGitPath[path]; + if (existingItemId + // Reuse a file ID only if it has already been synced + && (!isFile || syncDataByPath[path] + // Content may have already been synced + || syncDataByPath[`/${path}`]) + ) { + itemId = existingItemId; + } else { + // Otherwise, make a new ID for a new item + itemId = utils.uid(); + } + // If it's a file path, add the content path as well + if (isFile) { + idsByPath[`/${path}`] = `${itemId}/content`; + } + idsByPath[path] = itemId; + } + return itemId; + }; + + // Folder creations/updates + // Assume map entries are sorted from top to bottom + Object.entries(treeFolderMap).forEach(([path, parentPath]) => { + if (path === '.stackedit-trash/') { + idsByPath[path] = 'trash'; + } else { + const item = utils.addItemHash({ + id: getIdFromPath(path), + type: 'folder', + name: path.slice(parentPath.length, -1), + parentId: idsByPath[parentPath] || null, + }); + + const folderSyncData = syncDataByPath[path]; + if (!folderSyncData || folderSyncData.hash !== item.hash) { + changes.push({ + syncDataId: path, + item, + syncData: { + id: path, + type: item.type, + hash: item.hash, + }, + }); + } + } + }); + + // File/content creations/updates + Object.entries(treeFileMap).forEach(([path, parentPath]) => { + const fileId = getIdFromPath(path, true); + const contentPath = `/${path}`; + const contentId = idsByPath[contentPath]; + + // File creations/updates + const item = utils.addItemHash({ + id: fileId, + type: 'file', + name: path.slice(parentPath.length, -'.md'.length), + parentId: idsByPath[parentPath] || null, + }); + + const fileSyncData = syncDataByPath[path]; + if (!fileSyncData || fileSyncData.hash !== item.hash) { + changes.push({ + syncDataId: path, + item, + syncData: { + id: path, + type: item.type, + hash: item.hash, + }, + }); + } + + // Content creations/updates + const contentSyncData = syncDataByPath[contentPath]; + if (!contentSyncData || contentSyncData.sha !== this.shaByPath[path]) { + const type = 'content'; + // Use `/` as a prefix to get a unique syncData id + changes.push({ + syncDataId: contentPath, + item: { + id: contentId, + type, + // Need a truthy value to force downloading the content + hash: 1, + }, + syncData: { + id: contentPath, + type, + // Need a truthy value to force downloading the content + hash: 1, + }, + }); + } + }); + + // Data creations/updates + const syncDataById = store.getters['data/syncDataById']; + Object.keys(treeDataMap).forEach((path) => { + // Only settings、workspaces、template data are stored + const [, id] = path.match(/^\.stackedit-data\/(settings|workspaces|badgeCreations|templates)\.json$/) || []; + if (id) { + idsByPath[path] = id; + idsByPath[id] = id; + const syncData = syncDataById[id]; + if (!syncData || syncData.sha !== this.shaByPath[path]) { + const type = 'data'; + changes.push({ + syncDataId: id, + item: { + id, + type, + // Need a truthy value to force saving sync data + hash: 1, + }, + syncData: { + id, + type, + // Need a truthy value to force downloading the content + hash: 1, + }, + }); + } + } + }); + + // Location creations/updates + [{ + type: 'syncLocation', + map: treeSyncLocationMap, + pathMatcher: /^([\s\S]+)\.([\w-]+)\.sync$/, + }, { + type: 'publishLocation', + map: treePublishLocationMap, + pathMatcher: /^([\s\S]+)\.([\w-]+)\.publish$/, + }] + .forEach(({ type, map, pathMatcher }) => Object.keys(map).forEach((path) => { + const [, filePath, data] = path.match(pathMatcher) || []; + if (filePath) { + // If there is a corresponding md file in the tree + const fileId = idsByPath[`${filePath}.md`]; + if (fileId) { + // Reuse existing ID or create a new one + const id = itemIdsByGitPath[path] || utils.uid(); + idsByPath[path] = id; + + const item = utils.addItemHash({ + ...JSON.parse(utils.decodeBase64(data)), + id, + type, + fileId, + }); + + const locationSyncData = syncDataByPath[path]; + if (!locationSyncData || locationSyncData.hash !== item.hash) { + changes.push({ + syncDataId: path, + item, + syncData: { + id: path, + type: item.type, + hash: item.hash, + }, + }); + } + } + } + })); + + // Deletions + Object.keys(syncDataByPath).forEach((path) => { + if (!idsByPath[path]) { + changes.push({ syncDataId: path }); + } + }); + + return changes; + }, +}; diff --git a/src/services/imageSvc.js b/src/services/imageSvc.js new file mode 100644 index 0000000..99228c8 --- /dev/null +++ b/src/services/imageSvc.js @@ -0,0 +1,94 @@ +import md5 from 'js-md5'; +import store from '../store'; +import utils from './utils'; +import localDbSvc from './localDbSvc'; +import smmsHelper from '../services/providers/helpers/smmsHelper'; +import giteaHelper from '../services/providers/helpers/giteaHelper'; +import githubHelper from '../services/providers/helpers/githubHelper'; +import customHelper from '../services/providers/helpers/customHelper'; + +const getImagePath = (confPath, imgType) => { + const time = new Date(); + const date = time.getDate(); + const month = time.getMonth() + 1; + const year = time.getFullYear(); + const path = confPath.replace('{YYYY}', year).replace('{MM}', `0${month}`.slice(-2)) + .replace('{DD}', `0${date}`.slice(-2)).replace('{MDNAME}', store.getters['file/current'].name); + return `${path}${path.endsWith('/') ? '' : '/'}${utils.uid()}.${imgType.split('/')[1]}`; +}; + +export default { + // 上传图片 返回图片链接 + // { url: 'http://xxxx', error: 'xxxxxx'} + async updateImg(imgFile) { + // 操作图片上传 + const currStorage = store.getters['img/getCheckedStorage']; + if (!currStorage) { + return { error: '暂无已选择的图床!' }; + } + // 判断是否文档空间路径 + if (currStorage.type === 'workspace') { + // 如果不是git仓库 则提示不支持 + if (!store.getters['workspace/currentWorkspaceIsGit']) { + return { error: '暂无已选择的图床!' }; + } + const path = getImagePath(currStorage.sub, imgFile.type); + // 保存到indexeddb + const base64 = await utils.encodeFiletoBase64(imgFile); + const currDirNode = store.getters['explorer/selectedNodeFolder']; + const absolutePath = utils.getAbsoluteFilePath(currDirNode, path); + await localDbSvc.saveImg({ + id: md5(absolutePath), + path: absolutePath, + content: base64, + }); + return { url: path.replaceAll(' ', '%20') }; + } + if (!currStorage.provider) { + return { error: '暂无已选择的图床!' }; + } + const token = store.getters[`data/${currStorage.provider}TokensBySub`][currStorage.sub]; + if (!token) { + return { error: '暂无已选择的图床!' }; + } + let url = ''; + // token图床类型 + if (currStorage.type === 'token') { + const helper = currStorage.provider === 'smms' ? smmsHelper : customHelper; + url = await helper.uploadFile({ + token, + file: imgFile, + }); + } else if (currStorage.type === 'tokenRepo') { // git repo图床类型 + const checkStorages = token.imgStorages.filter(it => it.sid === currStorage.sid); + if (!checkStorages || checkStorages.length === 0) { + return { error: '暂无已选择的图床!' }; + } + const checkStorage = checkStorages[0]; + const path = getImagePath(checkStorage.path, imgFile.type); + if (currStorage.provider === 'gitea') { + const result = await giteaHelper.uploadFile({ + token, + projectId: checkStorage.repoUri, + branch: checkStorage.branch, + path, + content: imgFile, + isImg: true, + }); + url = result.content.download_url; + } else if (currStorage.provider === 'github') { + const result = await githubHelper.uploadFile({ + token, + owner: checkStorage.owner, + repo: checkStorage.repo, + branch: checkStorage.branch, + path, + content: imgFile, + isImg: true, + }); + url = result.content.download_url; + } + } + return { url }; + }, +}; diff --git a/src/services/localDbSvc.js b/src/services/localDbSvc.js new file mode 100644 index 0000000..11b4fc0 --- /dev/null +++ b/src/services/localDbSvc.js @@ -0,0 +1,510 @@ +import utils from './utils'; +import store from '../store'; +import welcomeFile from '../data/welcomeFile.md'; +import workspaceSvc from './workspaceSvc'; +import constants from '../data/constants'; + +const deleteMarkerMaxAge = 1000; +const dbVersion = 3; +const dbStoreName = 'objects'; +const imgDbStoreName = 'imgs'; +const imgWaitUploadIdsKey = 'waitUploadImgIds'; +const { silent } = utils.queryParams; +const resetApp = localStorage.getItem('resetStackEdit'); +if (resetApp) { + localStorage.removeItem('resetStackEdit'); +} + +class Connection { + constructor(workspaceId = store.getters['workspace/currentWorkspace'].id) { + this.getTxCbs = []; + + // Make the DB name + this.dbName = utils.getDbName(workspaceId); + + // Init connection + const request = indexedDB.open(this.dbName, dbVersion); + + request.onerror = () => { + throw new Error('无法连接到IndexedDB.'); + }; + + request.onsuccess = (event) => { + this.db = event.target.result; + this.db.onversionchange = () => window.location.reload(); + + this.getTxCbs.forEach(({ onTx, onError }) => this.createTx(onTx, onError)); + this.getTxCbs = null; + }; + + request.onupgradeneeded = (event) => { + const eventDb = event.target.result; + // const oldVersion = event.oldVersion || 0; + if (!eventDb.objectStoreNames.contains(dbStoreName)) { + // Create store + const dbStore = eventDb.createObjectStore(dbStoreName, { + keyPath: 'id', + }); + dbStore.createIndex('tx', 'tx', { + unique: false, + }); + } + if (!eventDb.objectStoreNames.contains(imgDbStoreName)) { + eventDb.createObjectStore(imgDbStoreName, { + keyPath: 'id', + }); + } + }; + } + + /** + * Create a transaction asynchronously. + */ + createTx(onTx, onError) { + // If DB is not ready, keep callbacks for later + if (!this.db) { + return this.getTxCbs.push({ onTx, onError }); + } + + // Open transaction in read/write will prevent conflict with other tabs + const tx = this.db.transaction(this.db.objectStoreNames, 'readwrite'); + tx.onerror = onError; + + return onTx(tx); + } +} + +const contentTypes = { + content: true, + contentState: true, + syncedContent: true, +}; + +const hashMap = {}; +constants.types.forEach((type) => { + hashMap[type] = Object.create(null); +}); +const lsHashMap = Object.create(null); + +const localDbSvc = { + lastTx: 0, + hashMap, + connection: null, + + /** + * Sync data items stored in the localStorage. + */ + syncLocalStorage() { + constants.localStorageDataIds.forEach((id) => { + const key = `data/${id}`; + + // Skip reloading the layoutSettings + if (id !== 'layoutSettings' || !lsHashMap[id]) { + try { + // Try to parse the item from the localStorage + const storedItem = JSON.parse(localStorage.getItem(key)); + if (storedItem.hash && lsHashMap[id] !== storedItem.hash) { + // Item has changed, replace it in the store + store.commit('data/setItem', storedItem); + lsHashMap[id] = storedItem.hash; + } + } catch (e) { + // Ignore parsing issue + } + } + + // Write item if different from stored one + const item = store.state.data.lsItemsById[id]; + if (item && item.hash !== lsHashMap[id]) { + localStorage.setItem(key, JSON.stringify(item)); + lsHashMap[id] = item.hash; + } + }); + }, + + /** + * Return a promise that will be resolved once the synchronization between the store and the + * localDb will be finished. Effectively, open a transaction, then read and apply all changes + * from the DB since the previous transaction, then write all the changes from the store. + */ + async sync() { + return new Promise((resolve, reject) => { + // Create the DB transaction + this.connection.createTx((tx) => { + const { lastTx } = this; + + // Look for DB changes and apply them to the store + this.readAll(tx, (storeItemMap) => { + // Sanitize the workspace if changes have been applied + if (lastTx !== this.lastTx) { + workspaceSvc.sanitizeWorkspace(); + } + + // Persist all the store changes into the DB + this.writeAll(storeItemMap, tx); + // Sync the localStorage + this.syncLocalStorage(); + // Done + resolve(); + }); + }, () => reject(new Error('Local DB access error.'))); + }); + }, + + /** + * Read and apply all changes from the DB since previous transaction. + */ + readAll(tx, cb) { + let { lastTx } = this; + const dbStore = tx.objectStore(dbStoreName); + const index = dbStore.index('tx'); + const range = IDBKeyRange.lowerBound(this.lastTx, true); + const changes = []; + index.openCursor(range).onsuccess = (event) => { + const cursor = event.target.result; + if (cursor) { + const item = cursor.value; + if (item.tx > lastTx) { + lastTx = item.tx; + if (this.lastTx && item.tx - this.lastTx > deleteMarkerMaxAge) { + // We may have missed some delete markers + window.location.reload(); + return; + } + } + // Collect change + changes.push(item); + cursor.continue(); + return; + } + + // Read the collected changes + const storeItemMap = { ...store.getters.allItemsById }; + changes.forEach((item) => { + this.readDbItem(item, storeItemMap); + // If item is an old delete marker, remove it from the DB + if (!item.hash && lastTx - item.tx > deleteMarkerMaxAge) { + dbStore.delete(item.id); + } + }); + + this.lastTx = lastTx; + cb(storeItemMap); + }; + }, + async saveImg(imgItem) { + await this.writeImgItem(imgItem); + const waitUploadIdsItem = (await this.getImgItem(imgWaitUploadIdsKey)) + || { id: imgWaitUploadIdsKey, ids: [] }; + const waitUplodIds = waitUploadIdsItem.ids || []; + // 如果已上传 + if (imgItem.uploaded) { + waitUplodIds.splice(waitUplodIds.indexOf(imgItem.id), 1); + } else { + waitUplodIds.push(imgItem.id); + } + waitUploadIdsItem.ids = waitUplodIds; + await this.writeImgItem(waitUploadIdsItem); + }, + // 获取待上传的图片id + async getWaitUploadImgIds() { + const waitUploadIdsItem = (await this.getImgItem(imgWaitUploadIdsKey)) + || { id: imgWaitUploadIdsKey, ids: [] }; + return waitUploadIdsItem.ids || []; + }, + /** + * 写入图片 + */ + async writeImgItem(imgItem) { + return new Promise((resolve, reject) => { + // Create the DB transaction + this.connection.createTx((tx) => { + const dbStore = tx.objectStore(imgDbStoreName); + dbStore.put(imgItem); + resolve(); + }, () => reject(new Error('保存图片异常'))); + }); + }, + /** + * 读取图片 + */ + async getImgItem(id) { + return new Promise((resolve, reject) => { + // Get the item from DB + this.connection.createTx((tx) => { + const dbStore = tx.objectStore(imgDbStoreName); + const request = dbStore.get(id); + request.onsuccess = () => { + const dbItem = request.result; + resolve(dbItem); + }; + }, () => reject(new Error('indexeddb获取图片异常'))); + }); + }, + + /** + * Write all changes from the store since previous transaction. + */ + writeAll(storeItemMap, tx) { + if (silent) { + // Skip writing to DB in silent mode + return; + } + const dbStore = tx.objectStore(dbStoreName); + const incrementedTx = this.lastTx + 1; + + // Remove deleted store items + Object.keys(this.hashMap).forEach((type) => { + // Remove this type only if file is deleted + let checker = cb => id => !storeItemMap[id] && cb(id); + if (contentTypes[type]) { + // For content types, remove item only if file is deleted + checker = cb => (id) => { + if (!storeItemMap[id]) { + const [fileId] = id.split('/'); + if (!store.state.file.itemsById[fileId]) { + cb(id); + } + } + }; + } + Object.keys(this.hashMap[type]).forEach(checker((id) => { + // Put a delete marker to notify other tabs + dbStore.put({ + id, + type, + tx: incrementedTx, + }); + delete this.hashMap[type][id]; + this.lastTx = incrementedTx; + })); + }); + + // Put changes + Object.entries(storeItemMap).forEach(([, storeItem]) => { + // Store object has changed + if (this.hashMap[storeItem.type][storeItem.id] !== storeItem.hash) { + const item = { + ...storeItem, + tx: incrementedTx, + }; + dbStore.put(item); + this.hashMap[item.type][item.id] = item.hash; + this.lastTx = incrementedTx; + } + }); + }, + + /** + * Read and apply one DB change. + */ + readDbItem(dbItem, storeItemMap) { + const storeItem = storeItemMap[dbItem.id]; + if (!dbItem.hash) { + // DB item is a delete marker + delete this.hashMap[dbItem.type][dbItem.id]; + if (storeItem) { + // Remove item from the store + store.commit(`${storeItem.type}/deleteItem`, storeItem.id); + delete storeItemMap[storeItem.id]; + } + } else if (this.hashMap[dbItem.type][dbItem.id] !== dbItem.hash) { + // DB item is different from the corresponding store item + this.hashMap[dbItem.type][dbItem.id] = dbItem.hash; + // Update content only if it exists in the store + if (storeItem || !contentTypes[dbItem.type]) { + // Put item in the store + dbItem.tx = undefined; + store.commit(`${dbItem.type}/setItem`, dbItem); + storeItemMap[dbItem.id] = dbItem; + } + } + }, + + /** + * Retrieve an item from the DB and put it in the store. + */ + async loadItem(id) { + // Check if item is in the store + const itemInStore = store.getters.allItemsById[id]; + if (itemInStore) { + // Use deepCopy to freeze item + return Promise.resolve(itemInStore); + } + return new Promise((resolve, reject) => { + // Get the item from DB + const onError = () => reject(new Error('Data not available.')); + this.connection.createTx((tx) => { + const dbStore = tx.objectStore(dbStoreName); + const request = dbStore.get(id); + request.onsuccess = () => { + const dbItem = request.result; + if (!dbItem || !dbItem.hash) { + onError(); + } else { + this.hashMap[dbItem.type][dbItem.id] = dbItem.hash; + // Put item in the store + dbItem.tx = undefined; + store.commit(`${dbItem.type}/setItem`, dbItem); + resolve(dbItem); + } + }; + }, () => onError()); + }); + }, + + /** + * Unload from the store contents that haven't been opened recently + */ + async unloadContents() { + await this.sync(); + // Keep only last opened files in memory + const lastOpenedFileIdSet = new Set(store.getters['data/lastOpenedIds']); + Object.keys(contentTypes).forEach((type) => { + store.getters[`${type}/items`].forEach((item) => { + const [fileId] = item.id.split('/'); + if (!lastOpenedFileIdSet.has(fileId)) { + // Remove item from the store + store.commit(`${type}/deleteItem`, item.id); + } + }); + }); + }, + + /** + * Create the connection and start syncing. + */ + async init() { + // Reset the app if the reset flag was passed + if (resetApp) { + await Promise.all(Object.keys(store.getters['workspace/workspacesById']) + .map(workspaceId => workspaceSvc.removeWorkspace(workspaceId))); + constants.localStorageDataIds.forEach((id) => { + // Clean data stored in localStorage + localStorage.removeItem(`data/${id}`); + }); + throw new Error('RELOAD'); + } + + // Create the connection + this.connection = new Connection(); + + // Load the DB + await localDbSvc.sync(); + + // Watch workspace deletions and persist them as soon as possible + // to make the changes available to reloading workspace tabs. + store.watch( + () => store.getters['data/workspaces'], + () => this.syncLocalStorage(), + ); + + // Save welcome file content hash if not done already + const hash = utils.hash(welcomeFile); + const { welcomeFileHashes } = store.getters['data/localSettings']; + if (!welcomeFileHashes[hash]) { + store.dispatch('data/patchLocalSettings', { + welcomeFileHashes: { + ...welcomeFileHashes, + [hash]: 1, + }, + }); + } + + // If app was last opened 7 days ago and synchronization is off + if (!store.getters['workspace/syncToken'] && + (store.state.workspace.lastFocus + constants.cleanTrashAfter < Date.now()) + ) { + // Clean files + store.getters['file/items'] + .filter(file => file.parentId === 'trash') // If file is in the trash + .forEach(file => workspaceSvc.deleteFile(file.id)); + } + + // Sync local DB periodically + utils.setInterval(() => localDbSvc.sync(), 1000); + + // watch current file changing + store.watch( + () => store.getters['file/current'].id, + async () => { + // See if currentFile is real, ie it has an ID + const currentFile = store.getters['file/current']; + // If current file has no ID, get the most recent file + if (!currentFile.id) { + const recentFile = store.getters['file/lastOpened']; + // Set it as the current file + if (recentFile.id) { + store.commit('file/setCurrentId', recentFile.id); + } else { + // If still no ID, create a new file + const newFile = await workspaceSvc.createFile({ + name: 'Welcome file', + text: welcomeFile, + }, true); + // Set it as the current file + store.commit('file/setCurrentId', newFile.id); + } + } else { + try { + // Load contentState from DB + await localDbSvc.loadContentState(currentFile.id); + // Load syncedContent from DB + await localDbSvc.loadSyncedContent(currentFile.id); + // Load content from DB + try { + await localDbSvc.loadItem(`${currentFile.id}/content`); + } catch (err) { + // Failure (content is not available), go back to previous file + const lastOpenedFile = store.getters['file/lastOpened']; + store.commit('file/setCurrentId', lastOpenedFile.id); + throw err; + } + // Set last opened file + store.dispatch('data/setLastOpenedId', currentFile.id); + // Cancel new discussion and open the gutter if file contains discussions + store.commit( + 'discussion/setCurrentDiscussionId', + store.getters['discussion/nextDiscussionId'], + ); + } catch (err) { + console.error(err); // eslint-disable-line no-console + store.dispatch('notification/error', err); + } + } + }, + { immediate: true }, + ); + }, + + getWorkspaceItems(workspaceId, onItem, onFinish = () => {}) { + const connection = new Connection(workspaceId); + connection.createTx((tx) => { + const dbStore = tx.objectStore(dbStoreName); + const index = dbStore.index('tx'); + index.openCursor().onsuccess = (event) => { + const cursor = event.target.result; + if (cursor) { + onItem(cursor.value); + cursor.continue(); + } else { + connection.db.close(); + onFinish(); + } + }; + }); + + // Return a cancel function + return () => connection.db.close(); + }, +}; + +const loader = type => fileId => localDbSvc.loadItem(`${fileId}/${type}`) + // Item does not exist, create it + .catch(() => store.commit(`${type}/setItem`, { + id: `${fileId}/${type}`, + })); +localDbSvc.loadSyncedContent = loader('syncedContent'); +localDbSvc.loadContentState = loader('contentState'); + +export default localDbSvc; diff --git a/src/services/markdownConversionSvc.js b/src/services/markdownConversionSvc.js new file mode 100644 index 0000000..77fb8a7 --- /dev/null +++ b/src/services/markdownConversionSvc.js @@ -0,0 +1,273 @@ +import DiffMatchPatch from 'diff-match-patch'; +import Prism from 'prismjs'; +import MarkdownIt from 'markdown-it'; +import markdownGrammarSvc from './markdownGrammarSvc'; +import extensionSvc from './extensionSvc'; +import utils from './utils'; + +const htmlSectionMarker = '\uF111\uF222\uF333\uF444'; +const diffMatchPatch = new DiffMatchPatch(); + +// Create aliases for syntax highlighting +const languageAliases = ({ + js: 'javascript', + json: 'javascript', + html: 'markup', + svg: 'markup', + xml: 'markup', + py: 'python', + rb: 'ruby', + yml: 'yaml', + ps1: 'powershell', + psm1: 'powershell', +}); +Object.entries(languageAliases).forEach(([alias, language]) => { + Prism.languages[alias] = Prism.languages[language]; +}); + +// Add programming language parsing capability to markdown fences +const insideFences = {}; +Object.entries(Prism.languages).forEach(([name, language]) => { + if (Prism.util.type(language) === 'Object') { + insideFences[`language-${name}`] = { + pattern: new RegExp(`(\`\`\`|~~~)${name}\\W[\\s\\S]*`), + inside: { + 'cl cl-pre': /(```|~~~).*/, + rest: language, + }, + }; + } +}); + +// Disable spell checking in specific tokens +const noSpellcheckTokens = Object.create(null); +[ + 'code', + 'pre', + 'pre gfm cn-code', + 'math block', + 'math inline', + 'math expr block', + 'math expr inline', + 'latex block', +] + .forEach((key) => { + noSpellcheckTokens[key] = true; + }); +Prism.hooks.add('wrap', (env) => { + if (noSpellcheckTokens[env.type]) { + env.attributes.spellcheck = 'false'; + } +}); + +function createFlagMap(arr) { + return arr.reduce((map, type) => ({ ...map, [type]: true }), {}); +} +const startSectionBlockTypeMap = createFlagMap([ + 'paragraph_open', + 'blockquote_open', + 'heading_open', + 'code', + 'fence', + 'table_open', + 'html_block', + 'bullet_list_open', + 'ordered_list_open', + 'hr', + 'dl_open', +]); +const listBlockTypeMap = createFlagMap([ + 'bullet_list_open', + 'ordered_list_open', +]); +const blockquoteBlockTypeMap = createFlagMap([ + 'blockquote_open', +]); +const tableBlockTypeMap = createFlagMap([ + 'table_open', +]); +const deflistBlockTypeMap = createFlagMap([ + 'dl_open', +]); + +function hashArray(arr, valueHash, valueArray) { + const hash = []; + arr.forEach((str) => { + let strHash = valueHash[str]; + if (strHash === undefined) { + strHash = valueArray.length; + valueArray.push(str); + valueHash[str] = strHash; + } + hash.push(strHash); + }); + return String.fromCharCode.apply(null, hash); +} + +export default { + defaultOptions: null, + defaultConverter: null, + defaultPrismGrammars: null, + + init() { + const defaultProperties = { extensions: utils.computedPresets.default }; + + // Default options for the markdown converter and the grammar + this.defaultOptions = { + ...extensionSvc.getOptions(defaultProperties), + insideFences, + }; + + this.defaultConverter = this.createConverter(this.defaultOptions); + this.defaultPrismGrammars = markdownGrammarSvc.makeGrammars(this.defaultOptions); + }, + + /** + * Creates a converter and init it with extensions. + * @returns {Object} A converter. + */ + createConverter(options) { + // Let the listeners add the rules + const converter = new MarkdownIt('zero'); + converter.core.ruler.enable([], true); + converter.block.ruler.enable([], true); + converter.inline.ruler.enable([], true); + extensionSvc.initConverter(converter, options); + Object.keys(startSectionBlockTypeMap).forEach((type) => { + const rule = converter.renderer.rules[type] || converter.renderer.renderToken; + converter.renderer.rules[type] = (tokens, idx, opts, env, self) => { + if (tokens[idx].sectionDelimiter) { + // Add section delimiter + return htmlSectionMarker + rule.call(converter.renderer, tokens, idx, opts, env, self); + } + return rule.call(converter.renderer, tokens, idx, opts, env, self); + }; + }); + return converter; + }, + + /** + * Parse markdown sections by passing the 2 first block rules of the markdown-it converter. + * @param {Object} converter The markdown-it converter. + * @param {String} text The text to be parsed. + * @returns {Object} A parsing context to be passed to `convert`. + */ + parseSections(converter, text) { + const markdownState = new converter.core.State(text, converter, {}); + const markdownCoreRules = converter.core.ruler.getRules(''); + markdownCoreRules[0](markdownState); // Pass the normalize rule + markdownCoreRules[1](markdownState); // Pass the block rule + const lines = text.split('\n'); + if (!lines[lines.length - 1]) { + // In cledit, last char is always '\n'. + // Remove it as one will be added by addSection + lines.pop(); + } + const parsingCtx = { + text, + sections: [], + converter, + markdownState, + markdownCoreRules, + }; + let data = 'main'; + let i = 0; + + function addSection(maxLine) { + const section = { + text: '', + data, + }; + for (; i < maxLine; i += 1) { + section.text += `${lines[i]}\n`; + } + if (section) { + parsingCtx.sections.push(section); + } + } + markdownState.tokens.forEach((token, index) => { + // index === 0 means there are empty lines at the begining of the file + if (token.level === 0 && startSectionBlockTypeMap[token.type] === true) { + if (index > 0) { + token.sectionDelimiter = true; + addSection(token.map[0]); + } + if (listBlockTypeMap[token.type] === true) { + data = 'list'; + } else if (blockquoteBlockTypeMap[token.type] === true) { + data = 'blockquote'; + } else if (tableBlockTypeMap[token.type] === true) { + data = 'table'; + } else if (deflistBlockTypeMap[token.type] === true) { + data = 'deflist'; + } else { + data = 'main'; + } + } + }); + addSection(lines.length); + return parsingCtx; + }, + + /** + * Convert markdown sections previously parsed with `parseSections`. + * @param {Object} parsingCtx The parsing context returned by `parseSections`. + * @param {Object} previousConversionCtx The conversion context returned by a previous call + * to `convert`, in order to calculate the `htmlSectionDiff` of the returned conversion context. + * @returns {Object} A conversion context. + */ + convert(parsingCtx, previousConversionCtx) { + // This function can be called twice without editor modification + // so prevent from converting it again. + if (!parsingCtx.markdownState.isConverted) { + // Skip 2 first rules previously passed in parseSections + parsingCtx.markdownCoreRules.slice(2).forEach(rule => rule(parsingCtx.markdownState)); + parsingCtx.markdownState.isConverted = true; + } + const { tokens } = parsingCtx.markdownState; + const html = parsingCtx.converter.renderer.render( + tokens, + parsingCtx.converter.options, + parsingCtx.markdownState.env, + ); + const htmlSectionList = html.split(htmlSectionMarker); + if (htmlSectionList[0] === '') { + htmlSectionList.shift(); + } + const valueHash = Object.create(null); + const valueArray = []; + const newSectionHash = hashArray(htmlSectionList, valueHash, valueArray); + let htmlSectionDiff; + if (previousConversionCtx) { + const oldSectionHash = hashArray( + previousConversionCtx.htmlSectionList, + valueHash, + valueArray, + ); + htmlSectionDiff = diffMatchPatch.diff_main(oldSectionHash, newSectionHash, false); + } else { + htmlSectionDiff = [ + [1, newSectionHash], + ]; + } + return { + text: parsingCtx.text, + sectionList: parsingCtx.sectionList, + htmlSectionList, + htmlSectionDiff, + }; + }, + + /** + * Helper to highlight arbitrary markdown + * @param {Object} markdown The markdown content to highlight. + * @param {Object} converter An optional converter. + * @param {Object} grammars Optional grammars. + * @returns {Object} The highlighted markdown in HTML format. + */ + highlight(markdown, converter = this.defaultConverter, grammars = this.defaultPrismGrammars) { + const parsingCtx = this.parseSections(converter, markdown); + return parsingCtx.sections + .map(section => Prism.highlight(section.text, grammars[section.data])).join(''); + }, +}; diff --git a/src/services/markdownGrammarSvc.js b/src/services/markdownGrammarSvc.js new file mode 100644 index 0000000..54677f8 --- /dev/null +++ b/src/services/markdownGrammarSvc.js @@ -0,0 +1,435 @@ +const charInsideUrl = '(&|[-A-Z0-9+@#/%?=~_|[\\]()!:,.;])'; +const charEndingUrl = '(&|[-A-Z0-9+@#/%=~_|[\\])])'; +const urlPattern = new RegExp(`(https?|ftp)(://${charInsideUrl}*${charEndingUrl})(?=$|\\W)`, 'gi'); +const emailPattern = /(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)/gi; + +const markup = { + comment: //g, + tag: { + pattern: /<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi, + inside: { + tag: { + pattern: /^<\/?[\w:-]+/i, + inside: { + punctuation: /^<\/?/, + namespace: /^[\w-]+?:/, + }, + }, + 'attr-value': { + pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi, + inside: { + punctuation: /=|>|"/g, + }, + }, + punctuation: /\/?>/g, + 'attr-name': { + pattern: /[\w:-]+/g, + inside: { + namespace: /^[\w-]+?:/, + }, + }, + }, + }, + entity: /&#?[\da-z]{1,8};/gi, +}; + +const latex = { + // A tex command e.g. \foo + keyword: /\\(?:[^a-zA-Z]|[a-zA-Z]+)/g, + // Curly and square braces + lparen: /[[({]/g, + // Curly and square braces + rparen: /[\])}]/g, + // A comment. Tex comments start with % and go to + // the end of the line + comment: /%.*/g, +}; + +export default { + makeGrammars(options) { + const grammars = { + main: {}, + list: {}, + blockquote: {}, + table: {}, + deflist: {}, + }; + + grammars.deflist.deflist = { + pattern: new RegExp( + [ + '^ {0,3}\\S.*\\n', // Description line + '(?:[ \\t]*\\n)?', // Optional empty line + '(?:', + '[ \\t]*:[ \\t].*\\n', // Colon line + '(?:', + '(?:', + '.*\\S.*\\n', // Non-empty line + '|', + '[ \\t]*\\n(?! ?\\S)', // Or empty line not followed by unindented line + ')', + ')*', + '(?:[ \\t]*\\n)*', // Empty lines + ')+', + ].join(''), + 'm', + ), + inside: { + term: /^.+/, + cl: /^[ \t]*:[ \t]/gm, + }, + }; + + const insideFences = options.insideFences || {}; + insideFences['cl cl-pre'] = /```|~~~/; + if (options.fence) { + grammars.main['pre gfm cn-code'] = { + pattern: /^(```|~~~)[\s\S]*?\n\1 *$/gm, + inside: insideFences, + }; + grammars.list['pre gfm cn-code'] = { + pattern: /^(?: {4}|\t)(```|~~~)[\s\S]*?\n(?: {4}|\t)\1\s*$/gm, + inside: insideFences, + }; + grammars.deflist.deflist.inside['pre gfm cn-code'] = grammars.list['pre gfm cn-code']; + } + + grammars.main['h1 alt cn-head'] = { + pattern: /^.+\n[=]{2,}[ \t]*$/gm, + inside: { + 'cl cl-hash': /=+[ \t]*$/, + }, + }; + grammars.main['h2 alt cn-head'] = { + pattern: /^.+\n[-]{2,}[ \t]*$/gm, + inside: { + 'cl cl-hash': /-+[ \t]*$/, + }, + }; + grammars.main['cn-toc'] = { + pattern: /^\[(TOC|toc)\]$/gm, + }; + for (let i = 6; i >= 1; i -= 1) { + grammars.main[`h${i} cn-head`] = { + pattern: new RegExp(`^#{${i}}[ \t].+$`, 'gm'), + inside: { + 'cl cl-hash': new RegExp(`^#{${i}}`), + }, + }; + } + + const list = /^[ \t]*([*+-]|\d+\.)[ \t]/gm; + const blockquote = { + pattern: /^\s*>.*(?:\n[ \t]*\S.*)*/gm, + inside: { + 'cl cl-gt': /^\s*>/gm, + 'cl cl-li': list, + }, + }; + grammars.list.blockquote = blockquote; + grammars.blockquote.blockquote = blockquote; + grammars.deflist.deflist.inside.blockquote = blockquote; + grammars.list['cl cl-li'] = list; + grammars.blockquote['cl cl-li'] = list; + grammars.deflist.deflist.inside['cl cl-li'] = list; + + grammars.table.table = { + pattern: new RegExp( + [ + '^\\s*\\S.*[|].*\\n', // Header Row + '[-| :]+\\n', // Separator + '(?:.*[|].*\\n?)*', // Table rows + '$', + ].join(''), + 'gm', + ), + inside: { + 'cl cl-title-separator': /^[-| :]+$/gm, + 'cl cl-pipe': /[|]/gm, + }, + }; + + grammars.main.hr = { + pattern: /^ {0,3}([*\-_] *){3,}$/gm, + }; + + if (options.tasklist) { + grammars.list.task = { + pattern: /^\[[ xX]\] /, + inside: { + cl: /[[\]]/, + strong: /[xX]/, + }, + }; + } + + const defs = {}; + if (options.footnote) { + defs.fndef = { + pattern: /^ {0,3}\[\^.*?\]:.*$/gm, + inside: { + 'ref-id': { + pattern: /^ {0,3}\[\^.*?\]/, + inside: { + cl: /(\[\^|\])/, + }, + }, + }, + }; + } + if (options.abbr) { + defs.abbrdef = { + pattern: /^ {0,3}\*\[.*?\]:.*$/gm, + inside: { + 'abbr-id': { + pattern: /^ {0,3}\*\[.*?\]/, + inside: { + cl: /(\*\[|\])/, + }, + }, + }, + }; + } + defs.linkdef = { + pattern: /^ {0,3}\[.*?\]:.*$/gm, + inside: { + 'link-id': { + pattern: /^ {0,3}\[.*?\]/, + inside: { + cl: /[[\]]/, + }, + }, + url: urlPattern, + }, + }; + + Object.entries(defs).forEach(([name, def]) => { + grammars.main[name] = def; + grammars.list[name] = def; + grammars.blockquote[name] = def; + grammars.table[name] = def; + grammars.deflist[name] = def; + }); + + grammars.main.pre = { + pattern: /^\s*\n(?: {4}|\t).*\S.*\n((?: {4}|\t).*\n)*/gm, + }; + + const rest = {}; + rest['code cn-code'] = { + pattern: /(`+)[\s\S]*?\1/g, + inside: { + 'cl cl-code': /`/, + }, + }; + if (options.math) { + rest['math block'] = { + pattern: /\\\\\[[\s\S]*?\\\\\]/g, + inside: { + 'cl cl-bracket-start': /^\\\\\[/, + 'cl cl-bracket-end': /\\\\\]$/, + rest: latex, + }, + }; + rest['math inline'] = { + pattern: /\\\\\([\s\S]*?\\\\\)/g, + inside: { + 'cl cl-bracket-start': /^\\\\\(/, + 'cl cl-bracket-end': /\\\\\)$/, + rest: latex, + }, + }; + rest['math expr block'] = { + pattern: /(\$\$)[\s\S]*?\1/g, + inside: { + 'cl cl-bracket-start': /^\$\$/, + 'cl cl-bracket-end': /\$\$$/, + rest: latex, + }, + }; + rest['math expr inline'] = { + pattern: /\$(?!\s)[\s\S]*?\S\$(?!\d)/g, + inside: { + 'cl cl-bracket-start': /^\$/, + 'cl cl-bracket-end': /\$$/, + rest: latex, + }, + }; + } + if (options.footnote) { + rest.inlinefn = { + pattern: /\^\[.+?\]/g, + inside: { + cl: /(\^\[|\])/, + }, + }; + rest.fn = { + pattern: /\[\^.+?\]/g, + inside: { + cl: /(\[\^|\])/, + }, + }; + } + rest.img = { + pattern: /!\[.*?\]\(.+?\)/g, + inside: { + 'cl cl-title': /['‘][^'’]*['’]|["“][^"”]*["”](?=\)$)/, + 'cl cl-src': { + pattern: /(\]\()[^('" \t]+(?=[)'" \t])/, + lookbehind: true, + }, + }, + }; + if (options.imgsize) { + rest.img.inside['cl cl-size'] = /=\d*x\d*/; + } + rest.link = { + pattern: /\[.*?\]\(.+?\)/gm, + inside: { + 'cl cl-underlined-text': { + pattern: /(\[)[^\]]*/, + lookbehind: true, + }, + 'cl cl-title': /['‘][^'’]*['’]|["“][^"”]*["”](?=\)$)/, + }, + }; + rest.imgref = { + pattern: /!\[.*?\][ \t]*\[.*?\]/g, + }; + rest.linkref = { + pattern: /\[.*?\][ \t]*\[.*?\]/g, + inside: { + 'cl cl-underlined-text': { + pattern: /^(\[)[^\]]*(?=\][ \t]*\[)/, + lookbehind: true, + }, + }, + }; + rest.comment = markup.comment; + rest.tag = markup.tag; + rest.url = urlPattern; + rest.email = emailPattern; + rest['strong cn-strong'] = { + pattern: /(^|[^.*])(__|\*\*)(?![_*])[\s\S]*?\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + 'cl cl-strong cl-start': /^(__|\*\*)/, + 'cl cl-strong cl-close': /(__|\*\*)$/, + }, + }; + rest.em = { + pattern: /(^|[^.*])(_|\*)(?![_*])[\s\S]*?\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + 'cl cl-em cl-start': /^(_|\*)/, + 'cl cl-em cl-close': /(_|\*)$/, + }, + }; + rest['strong em'] = { + pattern: /(^|[^.*])(__|\*\*)(_|\*)(?![_*])[\s\S]*?\3\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + 'cl cl-strong cl-start': /^(__|\*\*)(_|\*)/, + 'cl cl-strong cl-close': /(_|\*)(__|\*\*)$/, + }, + }; + rest['strong em inv'] = { + pattern: /(^|[^.*])(_|\*)(__|\*\*)(?![_*])[\s\S]*?\3\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + 'cl cl-strong cl-start': /^(_|\*)(__|\*\*)/, + 'cl cl-strong cl-close': /(__|\*\*)(_|\*)$/, + }, + }; + if (options.del) { + rest.del = { + pattern: /(^|[^.*])(~~)[\s\S]*?\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + cl: /~~/, + 'cl-del-text': /[^~]+/, + }, + }; + } + if (options.mark) { + rest.mark = { + pattern: /(^|[^.*])(==)[\s\S]*?\2(?=([^.*]|$))/gm, + lookbehind: true, + inside: { + cl: /==/, + 'cl-mark-text': /[^=]+/, + }, + }; + } + if (options.sub) { + rest.sub = { + pattern: /(~)(?=\S)(.*?\S)\1/gm, + inside: { + cl: /~/, + }, + }; + } + if (options.sup) { + rest.sup = { + pattern: /(\^)(?=\S)(.*?\S)\1/gm, + inside: { + cl: /\^/, + }, + }; + } + rest.entity = markup.entity; + + for (let c = 6; c >= 1; c -= 1) { + grammars.main[`h${c} cn-head`].inside.rest = rest; + } + grammars.main['h1 alt cn-head'].inside.rest = rest; + grammars.main['h2 alt cn-head'].inside.rest = rest; + grammars.table.table.inside.rest = rest; + grammars.main.rest = rest; + grammars.list.rest = rest; + grammars.blockquote.blockquote.inside.rest = rest; + grammars.deflist.deflist.inside.rest = rest; + if (options.footnote) { + grammars.main.fndef.inside.rest = rest; + } + + const restLight = { + code: rest['code cn-code'], + inlinefn: rest.inlinefn, + fn: rest.fn, + link: rest.link, + linkref: rest.linkref, + }; + rest['strong cn-strong'].inside.rest = restLight; + rest.em.inside.rest = restLight; + if (options.del) { + rest.del.inside.rest = restLight; + } + if (options.mark) { + rest.mark.inside.rest = restLight; + } + + const inside = { + code: rest['code cn-code'], + comment: rest.comment, + tag: rest.tag, + // strong: rest.strong, + strong: rest['strong cn-strong'], + em: rest.em, + del: rest.del, + sub: rest.sub, + sup: rest.sup, + entity: markup.entity, + }; + rest.link.inside['cl cl-underlined-text'].inside = inside; + rest.linkref.inside['cl cl-underlined-text'].inside = inside; + + // Wrap any other characters to allow paragraph folding + Object.entries(grammars).forEach(([, grammar]) => { + grammar.rest = grammar.rest || {}; + grammar.rest.p = /.+/; + }); + + return grammars; + }, +}; diff --git a/src/services/networkSvc.js b/src/services/networkSvc.js new file mode 100644 index 0000000..5fd52f6 --- /dev/null +++ b/src/services/networkSvc.js @@ -0,0 +1,342 @@ +import utils from './utils'; +import store from '../store'; +import constants from '../data/constants'; + +const scriptLoadingPromises = Object.create(null); +const authorizeTimeout = 6 * 60 * 1000; // 2 minutes +const silentAuthorizeTimeout = 15 * 1000; // 15 secondes (which will be reattempted) +const networkTimeout = 30 * 1000; // 30 sec +let isConnectionDown = false; +const userInactiveAfter = 3 * 60 * 1000; // 3 minutes (twice the default sync period) +let lastActivity = 0; +let lastFocus = 0; +let isConfLoading = false; +let isConfLoaded = false; + +function parseHeaders(xhr) { + const pairs = xhr.getAllResponseHeaders().trim().split('\n'); + const headers = {}; + pairs.forEach((header) => { + const split = header.trim().split(':'); + const key = split.shift().trim().toLowerCase(); + const value = split.join(':').trim(); + headers[key] = value; + }); + return headers; +} + +function isRetriable(err) { + if (err.status === 403) { + const googleReason = ((((err.body || {}).error || {}).errors || [])[0] || {}).reason; + return googleReason === 'rateLimitExceeded' || googleReason === 'userRateLimitExceeded'; + } + return err.status === 429 || (err.status >= 500 && err.status < 600); +} + +export default { + async init() { + // Keep track of the last user activity + const setLastActivity = () => { + lastActivity = Date.now(); + }; + window.document.addEventListener('mousedown', setLastActivity); + window.document.addEventListener('keydown', setLastActivity); + window.document.addEventListener('touchstart', setLastActivity); + + // Keep track of the last window focus + lastFocus = 0; + const setLastFocus = () => { + lastFocus = Date.now(); + localStorage.setItem(store.getters['workspace/lastFocusKey'], lastFocus); + setLastActivity(); + }; + if (document.hasFocus()) { + setLastFocus(); + } + window.addEventListener('focus', setLastFocus); + + // Check that browser is online periodically + const checkOffline = async () => { + const isBrowserOffline = window.navigator.onLine === false; + if (!isBrowserOffline + && store.state.lastOfflineCheck + networkTimeout + 5000 < Date.now() + && this.isUserActive() + ) { + store.commit('updateLastOfflineCheck'); + const script = document.createElement('script'); + let timeout; + try { + await new Promise((resolve, reject) => { + script.onload = resolve; + script.onerror = reject; + script.src = `https://res.wx.qq.com/open/js/jweixin-1.2.0.js?${Date.now()}`; + try { + document.head.appendChild(script); // This can fail with bad network + timeout = setTimeout(reject, networkTimeout); + } catch (e) { + reject(e); + } + }); + isConnectionDown = false; + } catch (e) { + isConnectionDown = true; + } finally { + clearTimeout(timeout); + document.head.removeChild(script); + } + } + const offline = isBrowserOffline || isConnectionDown; + if (store.state.offline !== offline) { + store.commit('setOffline', offline); + if (offline) { + store.dispatch('notification/error', '已离线!'); + } else { + store.dispatch('notification/info', '恢复上线了!'); + this.getServerConf(); + } + } + }; + + utils.setInterval(checkOffline, 1000); + window.addEventListener('online', () => { + isConnectionDown = false; + checkOffline(); + }); + window.addEventListener('offline', checkOffline); + await checkOffline(); + this.getServerConf(); + }, + async getServerConf() { + if (!store.state.offline && !isConfLoading && !isConfLoaded) { + try { + isConfLoading = true; + const res = await this.request({ url: 'conf' }); + await store.dispatch('data/setServerConf', res.body); + isConfLoaded = true; + } finally { + isConfLoading = false; + } + } + }, + isWindowFocused() { + // We don't use state.workspace.lastFocus as it's not reactive + const storedLastFocus = localStorage.getItem(store.getters['workspace/lastFocusKey']); + return parseInt(storedLastFocus, 10) === lastFocus; + }, + isUserActive() { + return lastActivity > Date.now() - userInactiveAfter && this.isWindowFocused(); + }, + isConfLoaded() { + return !!Object.keys(store.getters['data/serverConf']).length; + }, + async loadScript(url) { + if (!scriptLoadingPromises[url]) { + scriptLoadingPromises[url] = new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.onload = resolve; + script.onerror = () => { + scriptLoadingPromises[url] = null; + reject(); + }; + script.src = url; + document.head.appendChild(script); + }); + } + return scriptLoadingPromises[url]; + }, + async startOauth2(url, params = {}, silent = false, reattempt = false) { + try { + // Build the authorize URL + const state = utils.uid(); + const authorizeUrl = utils.addQueryParams(url, { + ...params, + state, + redirect_uri: constants.oauth2RedirectUri, + }); + + let iframeElt; + let wnd; + if (silent) { + // Use an iframe as wnd for silent mode + iframeElt = utils.createHiddenIframe(authorizeUrl); + document.body.appendChild(iframeElt); + wnd = iframeElt.contentWindow; + } else { + // Open a tab otherwise + wnd = window.open(authorizeUrl); + if (!wnd) { + throw new Error('The authorize window was blocked.'); + } + } + + let checkClosedInterval; + let closeTimeout; + let msgHandler; + try { + return await new Promise((resolve, reject) => { + if (silent) { + iframeElt.onerror = () => { + reject(new Error('Unknown error.')); + }; + closeTimeout = setTimeout(() => { + if (!reattempt) { + reject(new Error('REATTEMPT')); + } else { + isConnectionDown = true; + store.commit('setOffline', true); + store.commit('updateLastOfflineCheck'); + reject(new Error('You are offline.')); + } + }, silentAuthorizeTimeout); + } else { + closeTimeout = setTimeout(() => { + reject(new Error('Timeout.')); + }, authorizeTimeout); + } + + msgHandler = (event) => { + if (event.source === wnd && event.origin === constants.origin) { + const data = utils.parseQueryParams(`${event.data}`.slice(1)); + if (data.error || data.state !== state) { + console.error(data); // eslint-disable-line no-console + reject(new Error('Could not get required authorization.')); + } else { + resolve({ + accessToken: data.access_token, + code: data.code, + idToken: data.id_token, + expiresIn: data.expires_in, + }); + } + } + }; + + window.addEventListener('message', msgHandler); + if (!silent) { + checkClosedInterval = setInterval(() => { + if (wnd.closed) { + reject(new Error('Authorize window was closed.')); + } + }, 250); + } + }); + } finally { + clearInterval(checkClosedInterval); + if (!silent && !wnd.closed) { + wnd.close(); + } + if (iframeElt) { + document.body.removeChild(iframeElt); + } + clearTimeout(closeTimeout); + window.removeEventListener('message', msgHandler); + } + } catch (e) { + if (e.message === 'REATTEMPT') { + return this.startOauth2(url, params, silent, true); + } + throw e; + } + }, + async request(config, offlineCheck = false) { + let retryAfter = 500; // 500 ms + const maxRetryAfter = 10 * 1000; // 10 sec + const sanitizedConfig = Object.assign({}, config); + sanitizedConfig.timeout = sanitizedConfig.timeout || networkTimeout; + sanitizedConfig.headers = Object.assign({}, sanitizedConfig.headers); + if (sanitizedConfig.body && typeof sanitizedConfig.body === 'object') { + sanitizedConfig.body = JSON.stringify(sanitizedConfig.body); + sanitizedConfig.headers['Content-Type'] = 'application/json'; + } else if (sanitizedConfig.formData) { + const data = new FormData(); + Object.keys(sanitizedConfig.formData).forEach((key) => { + const formVal = sanitizedConfig.formData[key]; + data.append(key, formVal); + }); + sanitizedConfig.formData = data; + } + const attempt = async () => { + try { + return await new Promise((resolve, reject) => { + if (offlineCheck) { + store.commit('updateLastOfflineCheck'); + } + + const xhr = new window.XMLHttpRequest(); + xhr.withCredentials = sanitizedConfig.withCredentials || false; + + const timeoutId = setTimeout(() => { + xhr.abort(); + if (offlineCheck) { + isConnectionDown = true; + store.commit('setOffline', true); + reject(new Error('You are offline.')); + } else { + reject(new Error('Network request timeout.')); + } + }, sanitizedConfig.timeout); + + xhr.onload = () => { + if (offlineCheck) { + isConnectionDown = false; + } + clearTimeout(timeoutId); + const result = { + status: xhr.status, + headers: parseHeaders(xhr), + body: sanitizedConfig.blob ? xhr.response : xhr.responseText, + }; + if (!sanitizedConfig.raw && !sanitizedConfig.blob) { + try { + result.body = JSON.parse(result.body); + } catch (e) { + // ignore + } + } + if (result.status >= 200 && result.status < 300) { + resolve(result); + } else { + reject(result); + } + }; + + xhr.onerror = () => { + clearTimeout(timeoutId); + if (offlineCheck) { + isConnectionDown = true; + store.commit('setOffline', true); + reject(new Error('You are offline.')); + } else { + reject(new Error('Network request failed.')); + } + }; + + const url = utils.addQueryParams(sanitizedConfig.url, sanitizedConfig.params); + xhr.open(sanitizedConfig.method || 'GET', url); + Object.entries(sanitizedConfig.headers).forEach(([key, value]) => { + if (value) { + xhr.setRequestHeader(key, `${value}`); + } + }); + if (sanitizedConfig.blob) { + xhr.responseType = 'blob'; + } + xhr.send(sanitizedConfig.body || sanitizedConfig.formData || null); + }); + } catch (err) { + // Try again later in case of retriable error + if (isRetriable(err) && retryAfter < maxRetryAfter) { + await new Promise((resolve) => { + setTimeout(resolve, retryAfter); + // Exponential backoff + retryAfter *= 2; + }); + return attempt(); + } + throw err; + } + }; + + return attempt(); + }, +}; diff --git a/src/services/optional/index.js b/src/services/optional/index.js new file mode 100644 index 0000000..e6efbb9 --- /dev/null +++ b/src/services/optional/index.js @@ -0,0 +1,4 @@ +import './shortcuts'; +import './keystrokes'; +import './scrollSync'; +import './taskChange'; diff --git a/src/services/optional/keystrokes.js b/src/services/optional/keystrokes.js new file mode 100644 index 0000000..0d347a4 --- /dev/null +++ b/src/services/optional/keystrokes.js @@ -0,0 +1,188 @@ +import cledit from '../editor/cledit'; +import editorSvc from '../editorSvc'; +import store from '../../store'; + +const { Keystroke } = cledit; +const indentRegexp = /^ {0,3}>[ ]*|^[ \t]*[*+-][ \t](?:\[[ xX]\][ \t])?|^([ \t]*)\d+\.[ \t](?:\[[ xX]\][ \t])?|^\s+/; +let clearNewline; +let lastSelection; + +function fixNumberedList(state, indent) { + if (state.selection + || indent === undefined + || !store.getters['data/computedSettings'].editor.listAutoNumber + ) { + return; + } + const spaceIndent = indent.replace(/\t/g, ' '); + const indentRegex = new RegExp(`^[ \\s]*$|^${spaceIndent}(\\d+\\.[ \\t])?(( )?.*)$`); + + function getHits(lines) { + let hits = []; + let pendingHits = []; + + function flush() { + if (!pendingHits.hasHit && pendingHits.hasNoIndent) { + return false; + } + hits = hits.concat(pendingHits); + pendingHits = []; + return true; + } + + lines.some((line) => { + const match = line.replace( + /^[ \t]*/, + wholeMatch => wholeMatch.replace(/\t/g, ' '), + ).match(indentRegex); + if (!match || line.match(/^#+ /)) { // Line not empty, not indented, or title + flush(); + return true; + } + pendingHits.push({ + line, + match, + }); + if (match[2] !== undefined) { + if (match[1]) { + pendingHits.hasHit = true; + } else if (!match[3]) { + pendingHits.hasNoIndent = true; + } + } else if (!flush()) { + return true; + } + return false; + }); + return hits; + } + + function formatHits(hits) { + let num; + return hits.map((hit) => { + if (hit.match[1]) { + if (!num) { + num = parseInt(hit.match[1], 10); + } + const result = indent + num + hit.match[1].slice(-2) + hit.match[2]; + num += 1; + return result; + } + return hit.line; + }); + } + + const before = state.before.split('\n'); + before.unshift(''); // Add an extra line (fixes #184) + const after = state.after.split('\n'); + let currentLine = before.pop() || ''; + const currentPos = currentLine.length; + currentLine += after.shift() || ''; + let lines = before.concat(currentLine).concat(after); + let idx = before.length - getHits(before.slice().reverse()).length; // Prevents starting from 0 + while (idx <= before.length + 1) { + const hits = formatHits(getHits(lines.slice(idx))); + if (!hits.length) { + idx += 1; + } else { + lines = lines.slice(0, idx).concat(hits).concat(lines.slice(idx + hits.length)); + idx += hits.length; + } + } + currentLine = lines[before.length]; + state.before = lines.slice(1, before.length); // As we've added an extra line + state.before.push(currentLine.slice(0, currentPos)); + state.before = state.before.join('\n'); + state.after = [currentLine.slice(currentPos)].concat(lines.slice(before.length + 1)); + state.after = state.after.join('\n'); +} + +function enterKeyHandler(evt, state) { + if (evt.which !== 13) { + // Not enter + clearNewline = false; + return false; + } + + evt.preventDefault(); + + // Get the last line before the selection + const lastLf = state.before.lastIndexOf('\n') + 1; + const lastLine = state.before.slice(lastLf); + // See if the line is indented + const indentMatch = lastLine.match(indentRegexp) || ['']; + if (clearNewline && !state.selection && state.before.length === lastSelection) { + state.before = state.before.substring(0, lastLf); + state.selection = ''; + clearNewline = false; + fixNumberedList(state, indentMatch[1]); + return true; + } + clearNewline = false; + const indent = indentMatch[0]; + if (indent.length) { + clearNewline = true; + } + + editorSvc.clEditor.undoMgr.setCurrentMode('single'); + + state.before += `\n${indent}`; + state.selection = ''; + lastSelection = state.before.length; + fixNumberedList(state, indentMatch[1]); + return true; +} + +function tabKeyHandler(evt, state) { + if (evt.which !== 9 || evt.metaKey || evt.ctrlKey) { + // Not tab + return false; + } + + const strSplice = (str, i, remove, add) => + str.slice(0, i) + (add || '') + str.slice(i + (+remove || 0)); + + evt.preventDefault(); + const isInverse = evt.shiftKey; + const lastLf = state.before.lastIndexOf('\n') + 1; + const lastLine = state.before.slice(lastLf); + const currentLine = lastLine + state.selection + state.after; + const indentMatch = currentLine.match(indentRegexp); + if (isInverse) { + const previousChar = state.before.slice(-1); + if (/\s/.test(state.before.charAt(lastLf))) { + state.before = strSplice(state.before, lastLf, 1); + if (indentMatch) { + fixNumberedList(state, indentMatch[1]); + if (indentMatch[1]) { + fixNumberedList(state, indentMatch[1].slice(1)); + } + } + } + const selection = previousChar + state.selection; + state.selection = selection.replace(/\n[ \t]/gm, '\n'); + if (previousChar) { + state.selection = state.selection.slice(1); + } + } else if ( + // If selection is not empty + state.selection + // Or we are in an indented paragraph and the cursor is over the indentation characters + || (indentMatch && indentMatch[0].length >= lastLine.length) + ) { + state.before = strSplice(state.before, lastLf, 0, '\t'); + state.selection = state.selection.replace(/\n(?=.)/g, '\n\t'); + if (indentMatch) { + fixNumberedList(state, indentMatch[1]); + fixNumberedList(state, `\t${indentMatch[1]}`); + } + } else { + state.before += '\t'; + } + return true; +} + +editorSvc.$on('inited', () => { + editorSvc.clEditor.addKeystroke(new Keystroke(enterKeyHandler, 50)); + editorSvc.clEditor.addKeystroke(new Keystroke(tabKeyHandler, 50)); +}); diff --git a/src/services/optional/scrollSync.js b/src/services/optional/scrollSync.js new file mode 100644 index 0000000..d997538 --- /dev/null +++ b/src/services/optional/scrollSync.js @@ -0,0 +1,180 @@ +import store from '../../store'; +import animationSvc from '../animationSvc'; +import editorSvc from '../editorSvc'; + +let editorScrollerElt; +let previewScrollerElt; +let editorFinishTimeoutId; +let previewFinishTimeoutId; +let skipAnimation; +let isScrollEditor; +let isScrollPreview; +let isEditorMoving; +let isPreviewMoving; +let sectionDescList = []; + +let throttleTimeoutId; +let throttleLastTime = 0; + +function throttle(func, wait) { + clearTimeout(throttleTimeoutId); + const currentTime = Date.now(); + const localWait = (wait + throttleLastTime) - currentTime; + if (localWait < 1) { + throttleLastTime = currentTime; + func(); + } else { + throttleTimeoutId = setTimeout(() => { + throttleLastTime = Date.now(); + func(); + }, localWait); + } +} + +const doScrollSync = () => { + const localSkipAnimation = skipAnimation || !store.getters['layout/styles'].showSidePreview; + skipAnimation = false; + if (!store.getters['data/layoutSettings'].scrollSync || sectionDescList.length === 0) { + return; + } + let editorScrollTop = editorScrollerElt.scrollTop; + if (editorScrollTop < 0) { + editorScrollTop = 0; + } + const previewScrollTop = previewScrollerElt.scrollTop; + let scrollTo; + if (isScrollEditor) { + // Scroll the preview + isScrollEditor = false; + sectionDescList.some((sectionDesc) => { + if (editorScrollTop > sectionDesc.editorDimension.endOffset) { + return false; + } + const posInSection = (editorScrollTop - sectionDesc.editorDimension.startOffset) + / (sectionDesc.editorDimension.height || 1); + scrollTo = (sectionDesc.previewDimension.startOffset + + (sectionDesc.previewDimension.height * posInSection)); + return true; + }); + scrollTo = Math.min( + scrollTo, + previewScrollerElt.scrollHeight - previewScrollerElt.offsetHeight, + ); + + throttle(() => { + clearTimeout(previewFinishTimeoutId); + animationSvc.animate(previewScrollerElt) + .scrollTop(scrollTo) + .duration(!localSkipAnimation && 100) + .start(() => { + previewFinishTimeoutId = setTimeout(() => { + isPreviewMoving = false; + }, 100); + }, () => { + isPreviewMoving = true; + }); + }, localSkipAnimation ? 500 : 50); + } else if (!store.getters['layout/styles'].showEditor || isScrollPreview) { + // Scroll the editor + isScrollPreview = false; + sectionDescList.some((sectionDesc) => { + if (previewScrollTop > sectionDesc.previewDimension.endOffset) { + return false; + } + const posInSection = (previewScrollTop - sectionDesc.previewDimension.startOffset) + / (sectionDesc.previewDimension.height || 1); + scrollTo = (sectionDesc.editorDimension.startOffset + + (sectionDesc.editorDimension.height * posInSection)); + return true; + }); + scrollTo = Math.min( + scrollTo, + editorScrollerElt.scrollHeight - editorScrollerElt.offsetHeight, + ); + + throttle(() => { + clearTimeout(editorFinishTimeoutId); + animationSvc.animate(editorScrollerElt) + .scrollTop(scrollTo) + .duration(!localSkipAnimation && 100) + .start(() => { + editorFinishTimeoutId = setTimeout(() => { + isEditorMoving = false; + }, 100); + }, () => { + isEditorMoving = true; + }); + }, localSkipAnimation ? 500 : 50); + } +}; + +let isPreviewRefreshing; +let timeoutId; + +const forceScrollSync = () => { + if (!isPreviewRefreshing) { + doScrollSync(); + } +}; +store.watch(() => store.getters['data/layoutSettings'].scrollSync, forceScrollSync); + +editorSvc.$on('inited', () => { + editorScrollerElt = editorSvc.editorElt.parentNode; + previewScrollerElt = editorSvc.previewElt.parentNode; + + editorScrollerElt.addEventListener('scroll', () => { + if (isEditorMoving) { + return; + } + isScrollEditor = true; + isScrollPreview = false; + doScrollSync(); + }); + + previewScrollerElt.addEventListener('scroll', () => { + if (isPreviewMoving || isPreviewRefreshing) { + return; + } + isScrollPreview = true; + isScrollEditor = false; + doScrollSync(); + }); +}); + +editorSvc.$on('sectionList', () => { + clearTimeout(timeoutId); + isPreviewRefreshing = true; + sectionDescList = []; +}); + +editorSvc.$on('previewCtx', () => { + // Assume the user is writing in the editor + isScrollEditor = store.getters['layout/styles'].showEditor; + // A preview scrolling event can occur if height is smaller + timeoutId = setTimeout(() => { + isPreviewRefreshing = false; + }, 100); +}); + +store.watch( + () => store.getters['layout/styles'].showEditor, + (showEditor) => { + isScrollEditor = showEditor; + isScrollPreview = !showEditor; + skipAnimation = true; + }, +); + +store.watch( + () => store.getters['file/current'].id, + () => { + skipAnimation = true; + }, +); + +editorSvc.$on('previewCtxMeasured', (previewCtxMeasured) => { + if (previewCtxMeasured) { + ({ sectionDescList } = previewCtxMeasured); + forceScrollSync(); + } +}); diff --git a/src/services/optional/shortcuts.js b/src/services/optional/shortcuts.js new file mode 100644 index 0000000..5a5c695 --- /dev/null +++ b/src/services/optional/shortcuts.js @@ -0,0 +1,109 @@ +import Mousetrap from 'mousetrap'; +import store from '../../store'; +import editorSvc from '../../services/editorSvc'; +import syncSvc from '../../services/syncSvc'; + +// Skip shortcuts if modal is open +Mousetrap.prototype.stopCallback = () => store.getters['modal/config']; + +const pagedownHandler = name => () => { + editorSvc.pagedownEditor.uiManager.doClick(name); + return true; +}; + +const findReplaceOpener = type => () => { + store.dispatch('findReplace/open', { + type, + findText: editorSvc.clEditor.selectionMgr.hasFocus() && + editorSvc.clEditor.selectionMgr.getSelectedText(), + }); + return true; +}; + +const toggleEditor = () => () => { + store.dispatch('data/toggleEditor', !store.getters['data/layoutSettings'].showEditor); + return true; +}; + +// 非编辑模式下支持的快捷键 +const noEditableShortcutMethods = ['toggleeditor']; + +const methods = { + bold: pagedownHandler('bold'), + italic: pagedownHandler('italic'), + strikethrough: pagedownHandler('strikethrough'), + link: pagedownHandler('link'), + quote: pagedownHandler('quote'), + code: pagedownHandler('code'), + image: pagedownHandler('image'), + chatgpt: pagedownHandler('chatgpt'), + olist: pagedownHandler('olist'), + ulist: pagedownHandler('ulist'), + clist: pagedownHandler('clist'), + heading: pagedownHandler('heading'), + inline: pagedownHandler('heading'), + hr: pagedownHandler('hr'), + inlineformula: pagedownHandler('inlineformula'), + toggleeditor: toggleEditor(), + sync() { + if (syncSvc.isSyncPossible()) { + syncSvc.requestSync(); + } + return true; + }, + find: findReplaceOpener('find'), + replace: findReplaceOpener('replace'), + expand(param1, param2) { + const text = `${param1 || ''}`; + const replacement = `${param2 || ''}`; + if (text && replacement) { + setTimeout(() => { + const { selectionMgr } = editorSvc.clEditor; + let offset = selectionMgr.selectionStart; + if (offset === selectionMgr.selectionEnd) { + const range = selectionMgr.createRange(offset - text.length, offset); + if (`${range}` === text) { + range.deleteContents(); + range.insertNode(document.createTextNode(replacement)); + offset = (offset - text.length) + replacement.length; + selectionMgr.setSelectionStartEnd(offset, offset); + selectionMgr.updateCursorCoordinates(true); + } + } + }, 1); + } + }, +}; + +store.watch( + () => ({ + computedSettings: store.getters['data/computedSettings'], + isCurrentEditable: store.getters['content/isCurrentEditable'], + }), + ({ computedSettings, isCurrentEditable }) => { + Mousetrap.reset(); + + Object.entries(computedSettings.shortcuts).forEach(([key, shortcut]) => { + if (shortcut) { + const method = `${shortcut.method || shortcut}`; + let params = shortcut.params || []; + if (!Array.isArray(params)) { + params = [params]; + } + if (Object.prototype.hasOwnProperty.call(methods, method)) { + try { + // editor is editable or 一些非编辑模式下支持的快捷键 + if (isCurrentEditable || noEditableShortcutMethods.indexOf(method) !== -1) { + Mousetrap.bind(`${key}`, () => !methods[method].apply(null, params)); + } + } catch (e) { + // Ignore + } + } + } + }); + }, + { + immediate: true, + }, +); diff --git a/src/services/optional/taskChange.js b/src/services/optional/taskChange.js new file mode 100644 index 0000000..a575d3b --- /dev/null +++ b/src/services/optional/taskChange.js @@ -0,0 +1,47 @@ +import editorSvc from '../editorSvc'; +import store from '../../store'; + +editorSvc.$on('inited', () => { + const getPreviewOffset = (elt) => { + let offset = 0; + if (!elt || elt === editorSvc.previewElt) { + return offset; + } + let { previousSibling } = elt; + while (previousSibling) { + offset += previousSibling.textContent.length; + ({ previousSibling } = previousSibling); + } + return offset + getPreviewOffset(elt.parentNode); + }; + + editorSvc.previewElt.addEventListener('click', (evt) => { + if (evt.target.classList.contains('task-list-item-checkbox')) { + evt.preventDefault(); + if (store.getters['content/isCurrentEditable']) { + const editorContent = editorSvc.clEditor.getContent(); + // Use setTimeout to ensure evt.target.checked has the old value + setTimeout(() => { + // Make sure content has not changed + if (editorContent === editorSvc.clEditor.getContent()) { + const previewOffset = getPreviewOffset(evt.target); + const endOffset = editorSvc.getEditorOffset(previewOffset + 1); + if (endOffset != null) { + const startOffset = editorContent.lastIndexOf('\n', endOffset) + 1; + const line = editorContent.slice(startOffset, endOffset); + const match = line.match(/^([ \t]*(?:[*+-]|\d+\.)[ \t]+\[)[ xX](\] .*)/); + if (match) { + let newContent = editorContent.slice(0, startOffset); + newContent += match[1]; + newContent += evt.target.checked ? ' ' : 'x'; + newContent += match[2]; + newContent += editorContent.slice(endOffset); + editorSvc.clEditor.setContent(newContent, true); + } + } + } + }, 10); + } + } + }); +}); diff --git a/src/services/providers/bloggerPageProvider.js b/src/services/providers/bloggerPageProvider.js new file mode 100644 index 0000000..8a655be --- /dev/null +++ b/src/services/providers/bloggerPageProvider.js @@ -0,0 +1,45 @@ +import store from '../../store'; +import googleHelper from './helpers/googleHelper'; +import Provider from './common/Provider'; + +export default new Provider({ + id: 'bloggerPage', + name: 'Blogger Page', + getToken({ sub }) { + const token = store.getters['data/googleTokensBySub'][sub]; + return token && token.isBlogger ? token : null; + }, + getLocationUrl({ blogId, pageId }) { + return `https://www.blogger.com/blogger.g?blogID=${blogId}#editor/target=page;pageID=${pageId}`; + }, + getLocationDescription({ pageId }) { + return pageId; + }, + async publish(token, html, metadata, publishLocation) { + const page = await googleHelper.uploadBlogger({ + token, + blogUrl: publishLocation.blogUrl, + blogId: publishLocation.blogId, + postId: publishLocation.pageId, + title: metadata.title, + content: html, + isPage: true, + }); + return { + ...publishLocation, + blogId: page.blog.id, + pageId: page.id, + }; + }, + makeLocation(token, blogUrl, pageId) { + const location = { + providerId: this.id, + sub: token.sub, + blogUrl, + }; + if (pageId) { + location.pageId = pageId; + } + return location; + }, +}); diff --git a/src/services/providers/bloggerProvider.js b/src/services/providers/bloggerProvider.js new file mode 100644 index 0000000..f84d604 --- /dev/null +++ b/src/services/providers/bloggerProvider.js @@ -0,0 +1,45 @@ +import store from '../../store'; +import googleHelper from './helpers/googleHelper'; +import Provider from './common/Provider'; + +export default new Provider({ + id: 'blogger', + name: 'Blogger', + getToken({ sub }) { + const token = store.getters['data/googleTokensBySub'][sub]; + return token && token.isBlogger ? token : null; + }, + getLocationUrl({ blogId, postId }) { + return `https://www.blogger.com/blogger.g?blogID=${blogId}#editor/target=post;postID=${postId}`; + }, + getLocationDescription({ postId }) { + return postId; + }, + async publish(token, html, metadata, publishLocation) { + const post = await googleHelper.uploadBlogger({ + ...publishLocation, + token, + title: metadata.title, + content: html, + labels: metadata.tags, + isDraft: metadata.status === 'draft', + published: metadata.date, + }); + return { + ...publishLocation, + blogId: post.blog.id, + postId: post.id, + }; + }, + makeLocation(token, blogUrl, postId) { + const location = { + providerId: this.id, + sub: token.sub, + blogUrl, + }; + if (postId) { + location.postId = postId; + } + return location; + }, +}); diff --git a/src/services/providers/common/Provider.js b/src/services/providers/common/Provider.js new file mode 100644 index 0000000..1a74aae --- /dev/null +++ b/src/services/providers/common/Provider.js @@ -0,0 +1,102 @@ +import providerRegistry from './providerRegistry'; +import emptyContent from '../../../data/empties/emptyContent'; +import utils from '../../utils'; +import store from '../../../store'; +import workspaceSvc from '../../workspaceSvc'; + +const dataExtractor = /\s*$/; + +export default class Provider { + prepareChanges = changes => changes + onChangesApplied = () => {} + + constructor(props) { + Object.assign(this, props); + providerRegistry.register(this); + } + + /** + * Serialize content in a self contain Markdown compatible format + */ + static serializeContent(content) { + let result = content.text; + const data = {}; + if (content.properties.length > 1) { + data.properties = content.properties; + } + if (Object.keys(content.discussions).length) { + data.discussions = content.discussions; + } + if (Object.keys(content.comments).length) { + data.comments = content.comments; + } + if (content.history && content.history.length) { + data.history = content.history; + } + if (Object.keys(data).length) { + const serializedData = utils.encodeBase64(JSON.stringify(data)).replace(/(.{50})/g, '$1\n'); + result += ``; + } + return result; + } + + /** + * Parse content serialized with serializeContent() + */ + static parseContent(serializedContent, id) { + let text = serializedContent; + const extractedData = dataExtractor.exec(serializedContent); + let result; + if (!extractedData) { + // In case stackedit's data has been manually removed, try to restore them + result = utils.deepCopy(store.state.content.itemsById[id]) || emptyContent(id); + } else { + result = emptyContent(id); + try { + const serializedData = extractedData[1].replace(/\s/g, ''); + const parsedData = JSON.parse(utils.decodeBase64(serializedData)); + text = text.slice(0, extractedData.index); + if (parsedData.properties) { + result.properties = utils.sanitizeText(parsedData.properties); + } + if (parsedData.discussions) { + result.discussions = parsedData.discussions; + } + if (parsedData.comments) { + result.comments = parsedData.comments; + } + result.history = parsedData.history; + } catch (e) { + // Ignore + } + } + result.text = utils.sanitizeText(text); + if (!result.history) { + result.history = []; + } + return utils.addItemHash(result); + } + + /** + * Find and open a file with location that meets the criteria + */ + static openFileWithLocation(criteria) { + const location = utils.search(store.getters['syncLocation/items'], criteria); + if (location) { + // Found one, open it if it exists + const item = store.state.file.itemsById[location.fileId]; + if (item) { + store.commit('file/setCurrentId', item.id); + // If file is in the trash, restore it + if (item.parentId === 'trash') { + workspaceSvc.setOrPatchItem({ + ...item, + parentId: null, + }); + } + return true; + } + } + return false; + } +} diff --git a/src/services/providers/common/providerRegistry.js b/src/services/providers/common/providerRegistry.js new file mode 100644 index 0000000..d3b9021 --- /dev/null +++ b/src/services/providers/common/providerRegistry.js @@ -0,0 +1,7 @@ +export default { + providersById: {}, + register(provider) { + this.providersById[provider.id] = provider; + return provider; + }, +}; diff --git a/src/services/providers/couchdbWorkspaceProvider.js b/src/services/providers/couchdbWorkspaceProvider.js new file mode 100644 index 0000000..e8af418 --- /dev/null +++ b/src/services/providers/couchdbWorkspaceProvider.js @@ -0,0 +1,229 @@ +import store from '../../store'; +import couchdbHelper from './helpers/couchdbHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import badgeSvc from '../badgeSvc'; + +let syncLastSeq; + +export default new Provider({ + id: 'couchdbWorkspace', + name: 'CouchDB', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ dbUrl }) { + return { + providerId: this.id, + dbUrl, + }; + }, + getWorkspaceLocationUrl({ dbUrl }) { + return dbUrl; + }, + getSyncDataUrl(fileSyncData, { id }) { + const { dbUrl } = this.getToken(); + return `${dbUrl}/${id}/data`; + }, + getSyncDataDescription(fileSyncData, { id }) { + return id; + }, + async initWorkspace() { + const dbUrl = (utils.queryParams.dbUrl || '').replace(/\/?$/, ''); // Remove trailing / + const workspaceParams = this.getWorkspaceParams({ dbUrl }); + const workspaceId = utils.makeWorkspaceId(workspaceParams); + + // Create the token if it doesn't exist + if (!store.getters['data/couchdbTokensBySub'][workspaceId]) { + store.dispatch('data/addCouchdbToken', { + sub: workspaceId, + dbUrl, + }); + } + + // Create the workspace if it doesn't exist + if (!store.getters['workspace/workspacesById'][workspaceId]) { + try { + // Make sure the database exists and retrieve its name + const db = await couchdbHelper.getDb(store.getters['data/couchdbTokensBySub'][workspaceId]); + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + id: workspaceId, + name: db.db_name, + providerId: this.id, + dbUrl, + }, + }); + } catch (e) { + throw new Error(`${dbUrl} is not accessible. Make sure you have the proper permissions.`); + } + } + + badgeSvc.addBadge('addCouchdbWorkspace'); + return store.getters['workspace/workspacesById'][workspaceId]; + }, + async getChanges() { + const syncToken = store.getters['workspace/syncToken']; + const lastSeq = store.getters['data/localSettings'].syncLastSeq; + const result = await couchdbHelper.getChanges(syncToken, lastSeq); + const changes = result.changes.filter((change) => { + if (!change.deleted && change.doc) { + change.item = change.doc.item; + if (!change.item || !change.item.id || !change.item.type) { + return false; + } + // Build sync data + change.syncData = { + id: change.id, + itemId: change.item.id, + type: change.item.type, + hash: change.item.hash, + rev: change.doc._rev, // eslint-disable-line no-underscore-dangle + }; + } + change.syncDataId = change.id; + return true; + }); + syncLastSeq = result.lastSeq; + return changes; + }, + onChangesApplied() { + store.dispatch('data/patchLocalSettings', { + syncLastSeq, + }); + }, + async saveWorkspaceItem({ item, syncData }) { + const syncToken = store.getters['workspace/syncToken']; + const { id, rev } = await couchdbHelper.uploadDocument({ + token: syncToken, + item, + documentId: syncData && syncData.id, + rev: syncData && syncData.rev, + }); + + // Build sync data to save + return { + syncData: { + id, + itemId: item.id, + type: item.type, + hash: item.hash, + rev, + }, + }; + }, + removeWorkspaceItem({ syncData }) { + const syncToken = store.getters['workspace/syncToken']; + return couchdbHelper.removeDocument(syncToken, syncData.id, syncData.rev); + }, + async downloadWorkspaceContent({ token, contentSyncData }) { + const body = await couchdbHelper.retrieveDocumentWithAttachments(token, contentSyncData.id); + const rev = body._rev; // eslint-disable-line no-underscore-dangle + const content = Provider.parseContent(body.attachments.data, body.item.id); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + rev, + }, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const body = await couchdbHelper.retrieveDocumentWithAttachments(token, syncData.id); + const item = utils.addItemHash(JSON.parse(body.attachments.data)); + const rev = body._rev; // eslint-disable-line no-underscore-dangle + return { + item, + syncData: { + ...syncData, + hash: item.hash, + rev, + }, + }; + }, + async uploadWorkspaceContent({ token, content, contentSyncData }) { + const res = await couchdbHelper.uploadDocument({ + token, + item: { + id: content.id, + type: content.type, + hash: content.hash, + }, + data: Provider.serializeContent(content), + dataType: 'text/plain', + documentId: contentSyncData && contentSyncData.id, + rev: contentSyncData && contentSyncData.rev, + }); + + // Return new sync data + return { + contentSyncData: { + id: res.id, + itemId: content.id, + type: content.type, + hash: content.hash, + rev: res.rev, + }, + }; + }, + async uploadWorkspaceData({ token, item, syncData }) { + const res = await couchdbHelper.uploadDocument({ + token, + item: { + id: item.id, + type: item.type, + hash: item.hash, + }, + data: JSON.stringify(item), + dataType: 'application/json', + documentId: syncData && syncData.id, + rev: syncData && syncData.rev, + }); + + // Return new sync data + return { + syncData: { + id: res.id, + itemId: item.id, + type: item.type, + hash: item.hash, + rev: res.rev, + }, + }; + }, + async listFileRevisions({ token, contentSyncDataId }) { + const body = await couchdbHelper.retrieveDocumentWithRevisions(token, contentSyncDataId); + const revisions = []; + body._revs_info.forEach((revInfo, idx) => { // eslint-disable-line no-underscore-dangle + if (revInfo.status === 'available') { + revisions.push({ + id: revInfo.rev, + sub: null, + created: idx, + loaded: false, + }); + } + }); + return revisions; + }, + async loadFileRevision({ token, contentSyncDataId, revision }) { + if (revision.loaded) { + return false; + } + const body = await couchdbHelper.retrieveDocument(token, contentSyncDataId, revision.id); + revision.sub = body.sub; + revision.created = body.time; + revision.loaded = true; + return true; + }, + async getFileRevisionContent({ token, contentSyncDataId, revisionId }) { + const body = await couchdbHelper + .retrieveDocumentWithAttachments(token, contentSyncDataId, revisionId); + return Provider.parseContent(body.attachments.data, body.item.id); + }, +}); diff --git a/src/services/providers/dropboxProvider.js b/src/services/providers/dropboxProvider.js new file mode 100644 index 0000000..9d3ac2b --- /dev/null +++ b/src/services/providers/dropboxProvider.js @@ -0,0 +1,153 @@ +import store from '../../store'; +import dropboxHelper from './helpers/dropboxHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; + +const makePathAbsolute = (token, path) => { + if (!token.fullAccess) { + return `/Applications/StackEdit (restricted)${path}`; + } + return path; +}; +const makePathRelative = (token, path) => { + if (!token.fullAccess) { + return path.replace(/^\/Applications\/StackEdit \(restricted\)/, ''); + } + return path; +}; + +export default new Provider({ + id: 'dropbox', + name: 'Dropbox', + getToken({ sub }) { + return store.getters['data/dropboxTokensBySub'][sub]; + }, + getLocationUrl({ path }) { + const pathComponents = path.split('/').map(encodeURIComponent); + const filename = pathComponents.pop(); + return `https://www.dropbox.com/home${pathComponents.join('/')}?preview=${filename}`; + }, + getLocationDescription({ path, dropboxFileId }) { + return dropboxFileId || path; + }, + checkPath(path) { + return path && path.match(/^\/[^\\<>:"|?*]+$/); + }, + async downloadContent(token, syncLocation) { + const { content } = await dropboxHelper.downloadFile({ + token, + path: makePathRelative(token, syncLocation.path), + fileId: syncLocation.dropboxFileId, + }); + return Provider.parseContent(content, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + const dropboxFile = await dropboxHelper.uploadFile({ + token, + path: makePathRelative(token, syncLocation.path), + content: Provider.serializeContent(content), + fileId: syncLocation.dropboxFileId, + }); + return { + ...syncLocation, + path: makePathAbsolute(token, dropboxFile.path_display), + dropboxFileId: dropboxFile.id, + }; + }, + async publish(token, html, metadata, publishLocation) { + const dropboxFile = await dropboxHelper.uploadFile({ + token, + path: publishLocation.path, + content: html, + fileId: publishLocation.dropboxFileId, + }); + return { + ...publishLocation, + path: makePathAbsolute(token, dropboxFile.path_display), + dropboxFileId: dropboxFile.id, + }; + }, + async openFiles(token, paths) { + await utils.awaitSequence(paths, async (path) => { + // Check if the file exists and open it + if (!Provider.openFileWithLocation({ + providerId: this.id, + path, + })) { + // Download content from Dropbox + const syncLocation = { + path, + providerId: this.id, + sub: token.sub, + }; + let content; + try { + content = await this.downloadContent(token, syncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${path}.`); + return; + } + + // Create the file + let name = path; + const slashPos = name.lastIndexOf('/'); + if (slashPos > -1 && slashPos < name.length - 1) { + name = name.slice(slashPos + 1); + } + const dotPos = name.lastIndexOf('.'); + if (dotPos > 0 && slashPos < name.length) { + name = name.slice(0, dotPos); + } + const item = await workspaceSvc.createFile({ + name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...syncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从Dropbox导入。`); + } + }); + }, + makeLocation(token, path) { + return { + providerId: this.id, + sub: token.sub, + path, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await dropboxHelper.listRevisions({ + token, + path: makePathRelative(token, syncLocation.path), + fileId: syncLocation.dropboxFileId, + }); + return entries.map(entry => ({ + id: entry.rev, + sub: `${dropboxHelper.subPrefix}:${(entry.sharing_info || {}).modified_by || token.sub}`, + created: new Date(entry.server_modified).getTime(), + })); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + revisionId, + }) { + const { content } = await dropboxHelper.downloadFile({ + token, + path: `rev:${revisionId}`, + }); + return Provider.parseContent(content, contentId); + }, +}); diff --git a/src/services/providers/gistProvider.js b/src/services/providers/gistProvider.js new file mode 100644 index 0000000..b4ac7f7 --- /dev/null +++ b/src/services/providers/gistProvider.js @@ -0,0 +1,95 @@ +import store from '../../store'; +import githubHelper from './helpers/githubHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; + +export default new Provider({ + id: 'gist', + name: 'Gist', + getToken({ sub }) { + return store.getters['data/githubTokensBySub'][sub]; + }, + getLocationUrl({ gistId }) { + return `https://gist.github.com/${gistId}`; + }, + getLocationDescription({ filename }) { + return filename; + }, + async downloadContent(token, syncLocation) { + const content = await githubHelper.downloadGist({ + ...syncLocation, + token, + }); + return Provider.parseContent(content, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + const file = store.state.file.itemsById[syncLocation.fileId]; + const description = utils.sanitizeName(file && file.name); + const gist = await githubHelper.uploadGist({ + ...syncLocation, + token, + description, + content: Provider.serializeContent(content), + }); + return { + ...syncLocation, + gistId: gist.id, + }; + }, + async publish(token, html, metadata, publishLocation) { + const gist = await githubHelper.uploadGist({ + ...publishLocation, + token, + description: metadata.title, + content: html, + }); + return { + ...publishLocation, + gistId: gist.id, + }; + }, + makeLocation(token, filename, isPublic, gistId) { + return { + providerId: this.id, + sub: token.sub, + filename, + isPublic, + gistId, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await githubHelper.getGistCommits({ + ...syncLocation, + token, + }); + + return entries.map((entry) => { + const sub = `${githubHelper.subPrefix}:${entry.user.id}`; + userSvc.addUserInfo({ id: sub, name: entry.user.login, imageUrl: entry.user.avatar_url }); + return { + sub, + id: entry.version, + message: entry.commit && entry.commit.message, + created: new Date(entry.committed_at).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const data = await githubHelper.downloadGistRevision({ + ...syncLocation, + token, + sha: revisionId, + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/giteaProvider.js b/src/services/providers/giteaProvider.js new file mode 100644 index 0000000..063eb90 --- /dev/null +++ b/src/services/providers/giteaProvider.js @@ -0,0 +1,180 @@ +import store from '../../store'; +import giteaHelper from './helpers/giteaHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; +import userSvc from '../userSvc'; + +const savedSha = {}; + +export default new Provider({ + id: 'gitea', + name: 'Gitea', + getToken({ sub }) { + return store.getters['data/giteaTokensBySub'][sub]; + }, + getLocationUrl({ + sub, + projectPath, + branch, + path, + }) { + const token = this.getToken({ sub }); + return `${token.serverUrl}/${projectPath}/src/branch/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getLocationDescription({ path }) { + return path; + }, + async downloadContent(token, syncLocation) { + const { sha, data } = await giteaHelper.downloadFile({ + ...syncLocation, + token, + }); + savedSha[syncLocation.id] = sha; + return Provider.parseContent(data, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + const updatedSyncLocation = { + ...syncLocation, + projectId: await giteaHelper.getProjectId(token, syncLocation), + }; + if (!savedSha[updatedSyncLocation.id]) { + try { + // Get the last sha + await this.downloadContent(token, updatedSyncLocation); + } catch (e) { + // Ignore error + } + } + const sha = savedSha[updatedSyncLocation.id]; + delete savedSha[updatedSyncLocation.id]; + await giteaHelper.uploadFile({ + ...updatedSyncLocation, + token, + content: Provider.serializeContent(content), + sha, + }); + return updatedSyncLocation; + }, + async publish(token, html, metadata, publishLocation, commitMessage) { + const updatedPublishLocation = { + ...publishLocation, + projectId: await giteaHelper.getProjectId(token, publishLocation), + }; + try { + // Get the last sha + await this.downloadContent(token, updatedPublishLocation); + } catch (e) { + // Ignore error + } + const sha = savedSha[updatedPublishLocation.id]; + delete savedSha[updatedPublishLocation.id]; + await giteaHelper.uploadFile({ + ...updatedPublishLocation, + token, + content: html, + sha, + commitMessage, + }); + return updatedPublishLocation; + }, + async openFile(token, syncLocation) { + const updatedSyncLocation = { + ...syncLocation, + projectId: await giteaHelper.getProjectId(token, syncLocation), + }; + + // Check if the file exists and open it + if (!Provider.openFileWithLocation(updatedSyncLocation)) { + // Download content from Gitea + let content; + try { + content = await this.downloadContent(token, updatedSyncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${updatedSyncLocation.path}.`); + return; + } + + // Create the file + let name = updatedSyncLocation.path; + const slashPos = name.lastIndexOf('/'); + if (slashPos > -1 && slashPos < name.length - 1) { + name = name.slice(slashPos + 1); + } + const dotPos = name.lastIndexOf('.'); + if (dotPos > 0 && slashPos < name.length) { + name = name.slice(0, dotPos); + } + const item = await workspaceSvc.createFile({ + name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...updatedSyncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从Gitea导入。`); + } + }, + makeLocation(token, projectPath, branch, path) { + return { + providerId: this.id, + sub: token.sub, + projectPath, + branch, + path, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await giteaHelper.getCommits({ + ...syncLocation, + token, + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteaHelper.subPrefix}:${user.login}`; + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date); + return { + id: sha, + sub, + message: commit.message, + created: date ? new Date(date).getTime() : 1, + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const { data } = await giteaHelper.downloadFile({ + ...syncLocation, + token, + branch: revisionId, + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/giteaWorkspaceProvider.js b/src/services/providers/giteaWorkspaceProvider.js new file mode 100644 index 0000000..e859067 --- /dev/null +++ b/src/services/providers/giteaWorkspaceProvider.js @@ -0,0 +1,331 @@ +import store from '../../store'; +import giteaHelper from './helpers/giteaHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import badgeSvc from '../badgeSvc'; + +const getAbsolutePath = ({ id }) => + `${store.getters['workspace/currentWorkspace'].path || ''}${id}`; + +export default new Provider({ + id: 'giteaWorkspace', + name: 'Gitea', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ + serverUrl, + projectPath, + branch, + path, + }) { + return { + providerId: this.id, + serverUrl, + projectPath, + branch, + path, + }; + }, + getWorkspaceLocationUrl({ + serverUrl, + projectPath, + branch, + path, + }) { + return `${serverUrl}/${projectPath}/src/branch/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getSyncDataUrl({ id }) { + const { projectPath, branch } = store.getters['workspace/currentWorkspace']; + const { serverUrl } = this.getToken(); + return `${serverUrl}/${projectPath}/src/branch/${encodeURIComponent(branch)}/${utils.encodeUrlPath(getAbsolutePath({ id }))}`; + }, + getSyncDataDescription({ id }) { + return getAbsolutePath({ id }); + }, + async initWorkspace() { + const { serverUrl, branch } = utils.queryParams; + const workspaceParams = this.getWorkspaceParams({ serverUrl, branch }); + if (!branch) { + workspaceParams.branch = 'master'; + } + + // Extract project path param + const projectPath = (utils.queryParams.projectPath || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, ''); // Remove trailing `/` + workspaceParams.projectPath = projectPath; + + // Extract path param + const path = (utils.queryParams.path || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, '/'); // Add trailing `/` + if (path !== '/') { + workspaceParams.path = path; + } + + const workspaceId = utils.makeWorkspaceId(workspaceParams); + const workspace = store.getters['workspace/workspacesById'][workspaceId]; + + // See if we already have a token + const sub = workspace ? workspace.sub : utils.queryParams.sub; + let token = store.getters['data/giteaTokensBySub'][sub]; + if (!token) { + const applicationInfo = await store.dispatch('modal/open', { + type: 'giteaAccount', + forceServerUrl: serverUrl, + }); + token = await giteaHelper.addAccount(applicationInfo, sub); + } + + if (!workspace) { + const projectId = await giteaHelper.getProjectId(token, workspaceParams); + const pathEntries = (path || '').split('/'); + const projectPathEntries = (projectPath || '').split('/'); + const name = pathEntries[pathEntries.length - 2] // path ends with `/` + || projectPathEntries[projectPathEntries.length - 1]; + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + ...workspaceParams, + projectId, + id: workspaceId, + sub: token.sub, + name, + }, + }); + } + + badgeSvc.addBadge('addGiteaWorkspace'); + return store.getters['workspace/workspacesById'][workspaceId]; + }, + getChanges() { + return giteaHelper.getTree({ + ...store.getters['workspace/currentWorkspace'], + token: this.getToken(), + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree.tree.map(entry => ({ + ...entry, + id: entry.sha, + }))); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await giteaHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await giteaHelper.removeFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await giteaHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(fileSyncData), + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await giteaHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const { sha, data } = await giteaHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + }); + gitWorkspaceSvc.shaByPath[syncData.id] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = store.getters.gitPathsByItemId[file.id] || ''; + const absolutePath = !isImg ? `${store.getters['workspace/currentWorkspace'].path || ''}${store.getters.gitPathsByItemId[file.id]}` : file.path; + const sha = gitWorkspaceSvc.shaByPath[!isImg ? path : file.path]; + const res = await giteaHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: absolutePath, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha, + isImg, + commitMessage, + }); + + if (isImg) { + return { + sha: res.content.sha, + }; + } + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha: res.content.sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ token, item }) { + const path = store.getters.gitPathsByItemId[item.id]; + const syncData = { + id: path, + type: item.type, + hash: item.hash, + }; + const res = await giteaHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { projectId, branch } = store.getters['workspace/currentWorkspace']; + const entries = await giteaHelper.getCommits({ + token, + projectId, + sha: branch, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteaHelper.subPrefix}:${user.login}`; + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; + return { + id: sha, + sub, + message: commit.message, + created: new Date(date).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await giteaHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + branch: revisionId, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + return Provider.parseContent(data, contentId); + }, + getFilePathUrl(path) { + const token = this.getToken(); + if (!token) { + return null; + } + const workspace = store.getters['workspace/currentWorkspace']; + return `${token.serverUrl}/${workspace.owner}/${workspace.repo}/src/branch/${workspace.branch}${path}`; + }, +}); diff --git a/src/services/providers/giteeAppDataProvider.js b/src/services/providers/giteeAppDataProvider.js new file mode 100644 index 0000000..0e9c815 --- /dev/null +++ b/src/services/providers/giteeAppDataProvider.js @@ -0,0 +1,292 @@ +import store from '../../store'; +import giteeHelper from './helpers/giteeHelper'; +import Provider from './common/Provider'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import userSvc from '../userSvc'; + +const appDataRepo = 'stackedit-app-data'; +const appDataBranch = 'master'; + +export default new Provider({ + id: 'giteeAppData', + name: 'Gitee应用数据', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams() { + // No param as it's the main workspace + return {}; + }, + getWorkspaceLocationUrl() { + // No direct link to app data + return null; + }, + getSyncDataUrl() { + // No direct link to app data + return null; + }, + getSyncDataDescription({ id }) { + return id; + }, + async initWorkspace() { + // Nothing much to do since the main workspace isn't necessarily synchronized + // Return the main workspace + return store.getters['workspace/workspacesById'].main; + }, + getChanges() { + const token = this.getToken(); + return giteeHelper.getTree({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await giteeHelper.uploadFile({ + owner: syncToken.name, + repo: appDataRepo, + branch: appDataBranch, + token: syncToken, + path: syncData.id, + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await giteeHelper.removeFile({ + owner: syncToken.name, + repo: appDataRepo, + branch: appDataBranch, + token: syncToken, + path: syncData.id, + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await giteeHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path: fileSyncData.id, + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await giteeHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + const path = `.stackedit-data/${syncData.id}.json`; + // const path = store.getters.gitPathsByItemId[syncData.id]; + // const path = syncData.id; + const { sha, data } = await giteeHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + }); + if (!sha) { + return {}; + } + gitWorkspaceSvc.shaByPath[path] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + type: 'data', + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = !isImg ? store.getters.gitPathsByItemId[file.id] : file.path; + const res = await giteeHelper.uploadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha: gitWorkspaceSvc.shaByPath[!isImg ? path : file.path], + isImg, + commitMessage, + }); + + if (isImg) { + return { + sha: res.content.sha, + }; + } + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha: res.content.sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ + token, + item, + syncData, + }) { + const path = `.stackedit-data/${item.id}.json`; + // const path = store.getters.gitPathsByItemId[item.id]; + // const path = syncData.id; + const res = await giteeHelper.uploadFile({ + token, + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + path, + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + type: item.type, + hash: item.hash, + data: item.data, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { owner, repo, branch } = { + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + }; + const entries = await giteeHelper.getCommits({ + token, + owner, + repo, + sha: branch, + path: fileSyncDataId, + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteeHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; + return { + id: sha, + sub, + message: commit.message, + created: new Date(date).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await giteeHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: revisionId, + token, + path: fileSyncDataId, + }); + return Provider.parseContent(data, contentId); + }, + getFilePathUrl(path) { + const token = this.getToken(); + if (!token) { + return null; + } + return `https://gitee.com/${token.name}/${appDataRepo}/blob/${appDataBranch}${path}`; + }, +}); diff --git a/src/services/providers/giteeGistProvider.js b/src/services/providers/giteeGistProvider.js new file mode 100644 index 0000000..eb05b96 --- /dev/null +++ b/src/services/providers/giteeGistProvider.js @@ -0,0 +1,95 @@ +import store from '../../store'; +import giteeHelper from './helpers/giteeHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; + +export default new Provider({ + id: 'giteegist', + name: 'GiteeGist', + getToken({ sub }) { + return store.getters['data/giteeTokensBySub'][sub]; + }, + getLocationUrl({ gistId }) { + return `https://gitee.com/mafgwo/codes/${gistId}`; + }, + getLocationDescription({ filename }) { + return filename; + }, + async downloadContent(token, syncLocation) { + const content = await giteeHelper.downloadGist({ + ...syncLocation, + token, + }); + return Provider.parseContent(content, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + const file = store.state.file.itemsById[syncLocation.fileId]; + const description = utils.sanitizeName(file && file.name); + const gist = await giteeHelper.uploadGist({ + ...syncLocation, + token, + description, + content: Provider.serializeContent(content), + }); + return { + ...syncLocation, + gistId: gist.id, + }; + }, + async publish(token, html, metadata, publishLocation) { + const gist = await giteeHelper.uploadGist({ + ...publishLocation, + token, + description: metadata.title, + content: html, + }); + return { + ...publishLocation, + gistId: gist.id, + }; + }, + makeLocation(token, filename, isPublic, gistId) { + return { + providerId: this.id, + sub: token.sub, + filename, + isPublic, + gistId, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await giteeHelper.getGistCommits({ + ...syncLocation, + token, + }); + + return entries.map((entry) => { + const sub = `${giteeHelper.subPrefix}:${entry.user.id}`; + userSvc.addUserInfo({ id: sub, name: entry.user.login, imageUrl: entry.user.avatar_url }); + return { + sub, + id: entry.version, + message: entry.commit && entry.commit.message, + created: new Date(entry.committed_at).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + // async getFileRevisionContent({ + // token, + // contentId, + // syncLocation, + // revisionId, + // }) { + // const data = await giteeHelper.downloadGistRevision({ + // ...syncLocation, + // token, + // sha: revisionId, + // }); + // return Provider.parseContent(data, contentId); + // }, +}); diff --git a/src/services/providers/giteeProvider.js b/src/services/providers/giteeProvider.js new file mode 100644 index 0000000..abcaa09 --- /dev/null +++ b/src/services/providers/giteeProvider.js @@ -0,0 +1,170 @@ +import store from '../../store'; +import giteeHelper from './helpers/giteeHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; +import userSvc from '../userSvc'; + +const savedSha = {}; + +export default new Provider({ + id: 'gitee', + name: 'Gitee', + getToken({ sub }) { + return store.getters['data/giteeTokensBySub'][sub]; + }, + getLocationUrl({ + owner, + repo, + branch, + path, + }) { + return `https://gitee.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getLocationDescription({ path }) { + return path; + }, + async downloadContent(token, syncLocation) { + const { sha, data } = await giteeHelper.downloadFile({ + ...syncLocation, + token, + }); + savedSha[syncLocation.id] = sha; + return Provider.parseContent(data, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + if (!savedSha[syncLocation.id]) { + try { + // Get the last sha + await this.downloadContent(token, syncLocation); + } catch (e) { + // Ignore error + } + } + const sha = savedSha[syncLocation.id]; + delete savedSha[syncLocation.id]; + await giteeHelper.uploadFile({ + ...syncLocation, + token, + content: Provider.serializeContent(content), + sha, + }); + return syncLocation; + }, + async publish(token, html, metadata, publishLocation, commitMessage) { + try { + // Get the last sha + await this.downloadContent(token, publishLocation); + } catch (e) { + // Ignore error + } + const sha = savedSha[publishLocation.id]; + delete savedSha[publishLocation.id]; + await giteeHelper.uploadFile({ + ...publishLocation, + token, + content: html, + sha, + commitMessage, + }); + return publishLocation; + }, + async openFile(token, syncLocation) { + // Check if the file exists and open it + if (!Provider.openFileWithLocation(syncLocation)) { + // Download content from Gitee + let content; + try { + content = await this.downloadContent(token, syncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${syncLocation.path}.`); + return; + } + + // Create the file + let name = syncLocation.path; + const slashPos = name.lastIndexOf('/'); + if (slashPos > -1 && slashPos < name.length - 1) { + name = name.slice(slashPos + 1); + } + const dotPos = name.lastIndexOf('.'); + if (dotPos > 0 && slashPos < name.length) { + name = name.slice(0, dotPos); + } + const item = await workspaceSvc.createFile({ + name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...syncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从Gitee导入。`); + } + }, + makeLocation(token, owner, repo, branch, path) { + return { + providerId: this.id, + sub: token.sub, + owner, + repo, + branch, + path, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await giteeHelper.getCommits({ + ...syncLocation, + token, + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteeHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date); + return { + id: sha, + sub, + message: commit.message, + created: date ? new Date(date).getTime() : 1, + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const { data } = await giteeHelper.downloadFile({ + ...syncLocation, + token, + branch: revisionId, + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/giteeWorkspaceProvider.js b/src/services/providers/giteeWorkspaceProvider.js new file mode 100644 index 0000000..86dc680 --- /dev/null +++ b/src/services/providers/giteeWorkspaceProvider.js @@ -0,0 +1,315 @@ +import store from '../../store'; +import giteeHelper from './helpers/giteeHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import badgeSvc from '../badgeSvc'; + +const getAbsolutePath = ({ id }) => + `${store.getters['workspace/currentWorkspace'].path || ''}${id}`; + +export default new Provider({ + id: 'giteeWorkspace', + name: 'Gitee', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ + owner, + repo, + branch, + path, + }) { + return { + providerId: this.id, + owner, + repo, + branch, + path, + }; + }, + getWorkspaceLocationUrl({ + owner, + repo, + branch, + path, + }) { + return `https://gitee.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getSyncDataUrl({ id }) { + const { owner, repo, branch } = store.getters['workspace/currentWorkspace']; + return `https://gitee.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(getAbsolutePath({ id }))}`; + }, + getSyncDataDescription({ id }) { + return getAbsolutePath({ id }); + }, + async initWorkspace() { + const { owner, repo, branch } = utils.queryParams; + const workspaceParams = this.getWorkspaceParams({ owner, repo, branch }); + if (!branch) { + workspaceParams.branch = 'master'; + } + + // Extract path param + const path = (utils.queryParams.path || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, '/'); // Add trailing `/` + if (path !== '/') { + workspaceParams.path = path; + } + + const workspaceId = utils.makeWorkspaceId(workspaceParams); + const workspace = store.getters['workspace/workspacesById'][workspaceId]; + + // See if we already have a token + let token; + if (workspace) { + // Token sub is in the workspace + token = store.getters['data/giteeTokensBySub'][workspace.sub]; + } + if (!token) { + await store.dispatch('modal/open', { type: 'giteeAccount' }); + token = await giteeHelper.addAccount(); + } + + if (!workspace) { + const pathEntries = (path || '').split('/'); + const name = pathEntries[pathEntries.length - 2] || repo; // path ends with `/` + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + ...workspaceParams, + id: workspaceId, + sub: token.sub, + name, + }, + }); + } + + badgeSvc.addBadge('addGiteeWorkspace'); + return store.getters['workspace/workspacesById'][workspaceId]; + }, + getChanges() { + return giteeHelper.getTree({ + ...store.getters['workspace/currentWorkspace'], + token: this.getToken(), + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await giteeHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await giteeHelper.removeFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await giteeHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(fileSyncData), + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await giteeHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const { sha, data } = await giteeHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + }); + gitWorkspaceSvc.shaByPath[syncData.id] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = store.getters.gitPathsByItemId[file.id] || ''; + const absolutePath = !isImg ? `${store.getters['workspace/currentWorkspace'].path || ''}${path}` : file.path; + const res = await giteeHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: absolutePath, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha: gitWorkspaceSvc.shaByPath[!isImg ? path : file.path], + isImg, + commitMessage, + }); + + if (isImg) { + return { + sha: res.content.sha, + }; + } + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha: res.content.sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ token, item }) { + const path = store.getters.gitPathsByItemId[item.id]; + const syncData = { + id: path, + type: item.type, + hash: item.hash, + }; + const res = await giteeHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { owner, repo, branch } = store.getters['workspace/currentWorkspace']; + const entries = await giteeHelper.getCommits({ + token, + owner, + repo, + sha: branch, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteeHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; + return { + id: sha, + sub, + message: commit.message, + created: new Date(date).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await giteeHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + branch: revisionId, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + return Provider.parseContent(data, contentId); + }, + getFilePathUrl(path) { + const workspace = store.getters['workspace/currentWorkspace']; + return `https://gitee.com/${workspace.owner}/${workspace.repo}/blob/${workspace.branch}${path}`; + }, +}); diff --git a/src/services/providers/githubAppDataProvider.js b/src/services/providers/githubAppDataProvider.js new file mode 100644 index 0000000..f774b20 --- /dev/null +++ b/src/services/providers/githubAppDataProvider.js @@ -0,0 +1,292 @@ +import store from '../../store'; +import githubHelper from './helpers/githubHelper'; +import Provider from './common/Provider'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import userSvc from '../userSvc'; + +const appDataRepo = 'stackedit-app-data'; +const appDataBranch = 'master'; + +export default new Provider({ + id: 'githubAppData', + name: 'Gitee应用数据', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams() { + // No param as it's the main workspace + return {}; + }, + getWorkspaceLocationUrl() { + // No direct link to app data + return null; + }, + getSyncDataUrl() { + // No direct link to app data + return null; + }, + getSyncDataDescription({ id }) { + return id; + }, + async initWorkspace() { + // Nothing much to do since the main workspace isn't necessarily synchronized + // Return the main workspace + return store.getters['workspace/workspacesById'].main; + }, + getChanges() { + const token = this.getToken(); + return githubHelper.getTree({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await githubHelper.uploadFile({ + owner: syncToken.name, + repo: appDataRepo, + branch: appDataBranch, + token: syncToken, + path: syncData.id, + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await githubHelper.removeFile({ + owner: syncToken.name, + repo: appDataRepo, + branch: appDataBranch, + token: syncToken, + path: syncData.id, + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await githubHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path: fileSyncData.id, + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await githubHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + const path = `.stackedit-data/${syncData.id}.json`; + // const path = store.getters.gitPathsByItemId[syncData.id]; + // const path = syncData.id; + const { sha, data } = await githubHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + }); + if (!sha) { + return {}; + } + gitWorkspaceSvc.shaByPath[path] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + type: 'data', + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = !isImg ? store.getters.gitPathsByItemId[file.id] : file.path; + const res = await githubHelper.uploadFile({ + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + token, + path, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha: gitWorkspaceSvc.shaByPath[!isImg ? path : file.path], + isImg, + commitMessage, + }); + + if (isImg) { + return { + sha: res.content.sha, + }; + } + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha: res.content.sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ + token, + item, + syncData, + }) { + const path = `.stackedit-data/${item.id}.json`; + // const path = store.getters.gitPathsByItemId[item.id]; + // const path = syncData.id; + const res = await githubHelper.uploadFile({ + token, + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + path, + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + type: item.type, + hash: item.hash, + data: item.data, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { owner, repo, branch } = { + owner: token.name, + repo: appDataRepo, + branch: appDataBranch, + }; + const entries = await githubHelper.getCommits({ + token, + owner, + repo, + sha: branch, + path: fileSyncDataId, + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${githubHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; + return { + id: sha, + sub, + message: commit.message, + created: new Date(date).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await githubHelper.downloadFile({ + owner: token.name, + repo: appDataRepo, + branch: revisionId, + token, + path: fileSyncDataId, + }); + return Provider.parseContent(data, contentId); + }, + getFilePathUrl(path) { + const token = this.getToken(); + if (!token) { + return null; + } + return `https://github.com/${token.name}/${appDataRepo}/blob/${appDataBranch}${path}`; + }, +}); diff --git a/src/services/providers/githubProvider.js b/src/services/providers/githubProvider.js new file mode 100644 index 0000000..d0f32bc --- /dev/null +++ b/src/services/providers/githubProvider.js @@ -0,0 +1,169 @@ +import store from '../../store'; +import githubHelper from './helpers/githubHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; +import userSvc from '../userSvc'; + +const savedSha = {}; + +export default new Provider({ + id: 'github', + name: 'GitHub', + getToken({ sub }) { + return store.getters['data/githubTokensBySub'][sub]; + }, + getLocationUrl({ + owner, + repo, + branch, + path, + }) { + return `https://github.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getLocationDescription({ path }) { + return path; + }, + async downloadContent(token, syncLocation) { + const { sha, data } = await githubHelper.downloadFile({ + ...syncLocation, + token, + }); + savedSha[syncLocation.id] = sha; + return Provider.parseContent(data, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + if (!savedSha[syncLocation.id]) { + try { + // Get the last sha + await this.downloadContent(token, syncLocation); + } catch (e) { + // Ignore error + } + } + const sha = savedSha[syncLocation.id]; + delete savedSha[syncLocation.id]; + await githubHelper.uploadFile({ + ...syncLocation, + token, + content: Provider.serializeContent(content), + sha, + }); + return syncLocation; + }, + async publish(token, html, metadata, publishLocation, commitMessage) { + try { + // Get the last sha + await this.downloadContent(token, publishLocation); + } catch (e) { + // Ignore error + } + const sha = savedSha[publishLocation.id]; + delete savedSha[publishLocation.id]; + await githubHelper.uploadFile({ + ...publishLocation, + token, + content: html, + sha, + commitMessage, + }); + return publishLocation; + }, + async openFile(token, syncLocation) { + // Check if the file exists and open it + if (!Provider.openFileWithLocation(syncLocation)) { + // Download content from GitHub + let content; + try { + content = await this.downloadContent(token, syncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${syncLocation.path}.`); + return; + } + + // Create the file + let name = syncLocation.path; + const slashPos = name.lastIndexOf('/'); + if (slashPos > -1 && slashPos < name.length - 1) { + name = name.slice(slashPos + 1); + } + const dotPos = name.lastIndexOf('.'); + if (dotPos > 0 && slashPos < name.length) { + name = name.slice(0, dotPos); + } + const item = await workspaceSvc.createFile({ + name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...syncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从GitHub导入。`); + } + }, + makeLocation(token, owner, repo, branch, path) { + return { + providerId: this.id, + sub: token.sub, + owner, + repo, + branch, + path, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await githubHelper.getCommits({ + ...syncLocation, + token, + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } else if (commit && commit.author) { + user = commit.author; + } + const sub = `${githubHelper.subPrefix}:${user.id || user.name}`; + userSvc.addUserInfo({ id: sub, name: user.login || user.name, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date); + return { + id: sha, + sub, + message: commit.message, + created: date ? new Date(date).getTime() : 1, + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const { data } = await githubHelper.downloadFile({ + ...syncLocation, + token, + branch: revisionId, + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/githubWorkspaceProvider.js b/src/services/providers/githubWorkspaceProvider.js new file mode 100644 index 0000000..84e465f --- /dev/null +++ b/src/services/providers/githubWorkspaceProvider.js @@ -0,0 +1,313 @@ +import store from '../../store'; +import githubHelper from './helpers/githubHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import badgeSvc from '../badgeSvc'; + +const getAbsolutePath = ({ id }) => + `${store.getters['workspace/currentWorkspace'].path || ''}${id}`; + +export default new Provider({ + id: 'githubWorkspace', + name: 'GitHub', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ + owner, + repo, + branch, + path, + }) { + return { + providerId: this.id, + owner, + repo, + branch, + path, + }; + }, + getWorkspaceLocationUrl({ + owner, + repo, + branch, + path, + }) { + return `https://github.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getSyncDataUrl({ id }) { + const { owner, repo, branch } = store.getters['workspace/currentWorkspace']; + return `https://github.com/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(branch)}/${utils.encodeUrlPath(getAbsolutePath({ id }))}`; + }, + getSyncDataDescription({ id }) { + return getAbsolutePath({ id }); + }, + async initWorkspace() { + const { owner, repo, branch } = utils.queryParams; + const workspaceParams = this.getWorkspaceParams({ owner, repo, branch }); + if (!branch) { + workspaceParams.branch = 'master'; + } + + // Extract path param + const path = (utils.queryParams.path || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, '/'); // Add trailing `/` + if (path !== '/') { + workspaceParams.path = path; + } + + const workspaceId = utils.makeWorkspaceId(workspaceParams); + const workspace = store.getters['workspace/workspacesById'][workspaceId]; + + // See if we already have a token + let token; + if (workspace) { + // Token sub is in the workspace + token = store.getters['data/githubTokensBySub'][workspace.sub]; + } + if (!token) { + await store.dispatch('modal/open', { type: 'githubAccount' }); + token = await githubHelper.addAccount(store.getters['data/localSettings'].githubRepoFullAccess); + } + + if (!workspace) { + const pathEntries = (path || '').split('/'); + const name = pathEntries[pathEntries.length - 2] || repo; // path ends with `/` + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + ...workspaceParams, + id: workspaceId, + sub: token.sub, + name, + }, + }); + } + + badgeSvc.addBadge('addGithubWorkspace'); + return store.getters['workspace/workspacesById'][workspaceId]; + }, + getChanges() { + return githubHelper.getTree({ + ...store.getters['workspace/currentWorkspace'], + token: this.getToken(), + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await githubHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await githubHelper.removeFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await githubHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(fileSyncData), + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await githubHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const { sha, data } = await githubHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + }); + gitWorkspaceSvc.shaByPath[syncData.id] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = store.getters.gitPathsByItemId[file.id] || ''; + const absolutePath = !isImg ? `${store.getters['workspace/currentWorkspace'].path || ''}${path}` : file.path; + const res = await githubHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: absolutePath, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha: gitWorkspaceSvc.shaByPath[!isImg ? path : file.path], + isImg, + commitMessage, + }); + if (isImg) { + return { + sha: res.content.sha, + }; + } + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha: res.content.sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ token, item }) { + const path = store.getters.gitPathsByItemId[item.id]; + const syncData = { + id: path, + type: item.type, + hash: item.hash, + }; + const res = await githubHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { owner, repo, branch } = store.getters['workspace/currentWorkspace']; + const entries = await githubHelper.getCommits({ + token, + owner, + repo, + sha: branch, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } else if (commit && commit.author) { + user = commit.author; + } + const sub = `${githubHelper.subPrefix}:${user.id || user.name}`; + userSvc.addUserInfo({ id: sub, name: user.login || user.name, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; + return { + id: sha, + sub, + message: commit.message, + created: new Date(date).getTime(), + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await githubHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + branch: revisionId, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + return Provider.parseContent(data, contentId); + }, + getFilePathUrl(path) { + const workspace = store.getters['workspace/currentWorkspace']; + return `https://github.com/${workspace.owner}/${workspace.repo}/blob/${workspace.branch}${path}`; + }, +}); diff --git a/src/services/providers/gitlabProvider.js b/src/services/providers/gitlabProvider.js new file mode 100644 index 0000000..f19e723 --- /dev/null +++ b/src/services/providers/gitlabProvider.js @@ -0,0 +1,173 @@ +import store from '../../store'; +import gitlabHelper from './helpers/gitlabHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; +import userSvc from '../userSvc'; + +const savedSha = {}; + +export default new Provider({ + id: 'gitlab', + name: 'GitLab', + getToken({ sub }) { + return store.getters['data/gitlabTokensBySub'][sub]; + }, + getLocationUrl({ + sub, + projectPath, + branch, + path, + }) { + const token = this.getToken({ sub }); + return `${token.serverUrl}/${projectPath}/blob/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getLocationDescription({ path }) { + return path; + }, + async downloadContent(token, syncLocation) { + const { sha, data } = await gitlabHelper.downloadFile({ + ...syncLocation, + token, + }); + savedSha[syncLocation.id] = sha; + return Provider.parseContent(data, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation) { + const updatedSyncLocation = { + ...syncLocation, + projectId: await gitlabHelper.getProjectId(token, syncLocation), + }; + if (!savedSha[updatedSyncLocation.id]) { + try { + // Get the last sha + await this.downloadContent(token, updatedSyncLocation); + } catch (e) { + // Ignore error + } + } + const sha = savedSha[updatedSyncLocation.id]; + delete savedSha[updatedSyncLocation.id]; + await gitlabHelper.uploadFile({ + ...updatedSyncLocation, + token, + content: Provider.serializeContent(content), + sha, + }); + return updatedSyncLocation; + }, + async publish(token, html, metadata, publishLocation, commitMessage) { + const updatedPublishLocation = { + ...publishLocation, + projectId: await gitlabHelper.getProjectId(token, publishLocation), + }; + try { + // Get the last sha + await this.downloadContent(token, updatedPublishLocation); + } catch (e) { + // Ignore error + } + const sha = savedSha[updatedPublishLocation.id]; + delete savedSha[updatedPublishLocation.id]; + await gitlabHelper.uploadFile({ + ...updatedPublishLocation, + token, + content: html, + sha, + commitMessage, + }); + return updatedPublishLocation; + }, + async openFile(token, syncLocation) { + const updatedSyncLocation = { + ...syncLocation, + projectId: await gitlabHelper.getProjectId(token, syncLocation), + }; + + // Check if the file exists and open it + if (!Provider.openFileWithLocation(updatedSyncLocation)) { + // Download content from GitLab + let content; + try { + content = await this.downloadContent(token, updatedSyncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${updatedSyncLocation.path}.`); + return; + } + + // Create the file + let name = updatedSyncLocation.path; + const slashPos = name.lastIndexOf('/'); + if (slashPos > -1 && slashPos < name.length - 1) { + name = name.slice(slashPos + 1); + } + const dotPos = name.lastIndexOf('.'); + if (dotPos > 0 && slashPos < name.length) { + name = name.slice(0, dotPos); + } + const item = await workspaceSvc.createFile({ + name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...updatedSyncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从GitLab导入。`); + } + }, + makeLocation(token, projectPath, branch, path) { + return { + providerId: this.id, + sub: token.sub, + projectPath, + branch, + path, + }; + }, + async listFileRevisions({ token, syncLocation }) { + const entries = await gitlabHelper.getCommits({ + ...syncLocation, + token, + }); + + return entries.map((entry) => { + const email = entry.author_email || entry.committer_email; + const sub = `${gitlabHelper.subPrefix}:${token.serverUrl}/${email}`; + userSvc.addUserInfo({ + id: sub, + name: entry.author_name || entry.committer_name, + imageUrl: '', + }); + const date = entry.authored_date || entry.committed_date || 1; + return { + id: entry.id, + sub, + message: entry.commit && entry.commit.message, + created: date ? new Date(date).getTime() : 1, + }; + }); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const { data } = await gitlabHelper.downloadFile({ + ...syncLocation, + token, + branch: revisionId, + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/gitlabWorkspaceProvider.js b/src/services/providers/gitlabWorkspaceProvider.js new file mode 100644 index 0000000..afb138a --- /dev/null +++ b/src/services/providers/gitlabWorkspaceProvider.js @@ -0,0 +1,317 @@ +import store from '../../store'; +import gitlabHelper from './helpers/gitlabHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import userSvc from '../userSvc'; +import gitWorkspaceSvc from '../gitWorkspaceSvc'; +import badgeSvc from '../badgeSvc'; + +const getAbsolutePath = ({ id }) => + `${store.getters['workspace/currentWorkspace'].path || ''}${id}`; + +export default new Provider({ + id: 'gitlabWorkspace', + name: 'GitLab', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ + serverUrl, + projectPath, + branch, + path, + }) { + return { + providerId: this.id, + serverUrl, + projectPath, + branch, + path, + }; + }, + getWorkspaceLocationUrl({ + serverUrl, + projectPath, + branch, + path, + }) { + return `${serverUrl}/${projectPath}/blob/${encodeURIComponent(branch)}/${utils.encodeUrlPath(path)}`; + }, + getSyncDataUrl({ id }) { + const { projectPath, branch } = store.getters['workspace/currentWorkspace']; + const { serverUrl } = this.getToken(); + return `${serverUrl}/${projectPath}/blob/${encodeURIComponent(branch)}/${utils.encodeUrlPath(getAbsolutePath({ id }))}`; + }, + getSyncDataDescription({ id }) { + return getAbsolutePath({ id }); + }, + async initWorkspace() { + const { serverUrl, branch } = utils.queryParams; + const workspaceParams = this.getWorkspaceParams({ serverUrl, branch }); + if (!branch) { + workspaceParams.branch = 'master'; + } + + // Extract project path param + const projectPath = (utils.queryParams.projectPath || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, ''); // Remove trailing `/` + workspaceParams.projectPath = projectPath; + + // Extract path param + const path = (utils.queryParams.path || '') + .trim() + .replace(/^\/*/, '') // Remove leading `/` + .replace(/\/*$/, '/'); // Add trailing `/` + if (path !== '/') { + workspaceParams.path = path; + } + + const workspaceId = utils.makeWorkspaceId(workspaceParams); + const workspace = store.getters['workspace/workspacesById'][workspaceId]; + + // See if we already have a token + const sub = workspace ? workspace.sub : utils.queryParams.sub; + let token = store.getters['data/gitlabTokensBySub'][sub]; + if (!token) { + const { applicationId, applicationSecret } = await store.dispatch('modal/open', { + type: 'gitlabAccount', + forceServerUrl: serverUrl, + }); + token = await gitlabHelper.addAccount(serverUrl, applicationId, applicationSecret, sub); + } + + if (!workspace) { + const projectId = await gitlabHelper.getProjectId(token, workspaceParams); + const pathEntries = (path || '').split('/'); + const projectPathEntries = (projectPath || '').split('/'); + const name = pathEntries[pathEntries.length - 2] // path ends with `/` + || projectPathEntries[projectPathEntries.length - 1]; + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + ...workspaceParams, + projectId, + id: workspaceId, + sub: token.sub, + name, + }, + }); + } + + badgeSvc.addBadge('addGitlabWorkspace'); + return store.getters['workspace/workspacesById'][workspaceId]; + }, + getChanges() { + return gitlabHelper.getTree({ + ...store.getters['workspace/currentWorkspace'], + token: this.getToken(), + }); + }, + prepareChanges(tree) { + return gitWorkspaceSvc.makeChanges(tree.map(entry => ({ + ...entry, + sha: entry.id, + }))); + }, + async saveWorkspaceItem({ item }) { + const syncData = { + id: store.getters.gitPathsByItemId[item.id], + type: item.type, + hash: item.hash, + }; + + // Files and folders are not in git, only contents + if (item.type === 'file' || item.type === 'folder') { + return { syncData }; + } + + // locations are stored as paths, so we upload an empty file + const syncToken = store.getters['workspace/syncToken']; + await gitlabHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + content: '', + sha: gitWorkspaceSvc.shaByPath[syncData.id], + commitMessage: item.commitMessage, + }); + + // Return sync data to save + return { syncData }; + }, + async removeWorkspaceItem({ syncData }) { + if (gitWorkspaceSvc.shaByPath[syncData.id]) { + const syncToken = store.getters['workspace/syncToken']; + await gitlabHelper.removeFile({ + ...store.getters['workspace/currentWorkspace'], + token: syncToken, + path: getAbsolutePath(syncData), + sha: gitWorkspaceSvc.shaByPath[syncData.id], + }); + } + }, + async downloadWorkspaceContent({ + token, + contentId, + contentSyncData, + fileSyncData, + }) { + const { sha, data } = await gitlabHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(fileSyncData), + }); + gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha; + const content = Provider.parseContent(data, contentId); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + sha, + }, + }; + }, + async downloadFile({ token, path }) { + const { sha, data } = await gitlabHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path, + isImg: true, + }); + return { + content: data, + sha, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const { sha, data } = await gitlabHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + }); + gitWorkspaceSvc.shaByPath[syncData.id] = sha; + const item = JSON.parse(data); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + sha, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + commitMessage, + }) { + const isImg = file.type === 'img'; + const path = store.getters.gitPathsByItemId[file.id]; + const absolutePath = !isImg ? `${store.getters['workspace/currentWorkspace'].path || ''}${path}` : file.path; + const sha = gitWorkspaceSvc.shaByPath[!isImg ? path : file.path]; + await gitlabHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: absolutePath, + content: !isImg ? Provider.serializeContent(content) : file.content, + sha, + isImg, + commitMessage, + }); + + if (isImg) { + const res2 = await this.downloadFile({ token, path: absolutePath }); + return { + sha: res2.sha, + }; + } + + // Return new sync data + return { + contentSyncData: { + id: store.getters.gitPathsByItemId[content.id], + type: content.type, + hash: content.hash, + sha, + }, + fileSyncData: { + id: path, + type: 'file', + hash: file.hash, + }, + }; + }, + async uploadWorkspaceData({ token, item }) { + const path = store.getters.gitPathsByItemId[item.id]; + const syncData = { + id: path, + type: item.type, + hash: item.hash, + }; + const res = await gitlabHelper.uploadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + path: getAbsolutePath(syncData), + content: JSON.stringify(item), + sha: gitWorkspaceSvc.shaByPath[path], + }); + + return { + syncData: { + ...syncData, + sha: res.content.sha, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const { projectId, branch } = store.getters['workspace/currentWorkspace']; + const entries = await gitlabHelper.getCommits({ + token, + projectId, + sha: branch, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + + return entries.map((entry) => { + const email = entry.author_email || entry.committer_email; + const sub = `${gitlabHelper.subPrefix}:${token.serverUrl}/${email}`; + userSvc.addUserInfo({ + id: sub, + name: entry.author_name || entry.committer_name, + imageUrl: '', // No way to get user's avatar url... + }); + const date = entry.authored_date || entry.committed_date || 1; + return { + id: entry.id, + sub, + message: entry.commit && entry.commit.message, + created: date ? new Date(date).getTime() : 1, + }; + }); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const { data } = await gitlabHelper.downloadFile({ + ...store.getters['workspace/currentWorkspace'], + token, + branch: revisionId, + path: getAbsolutePath({ id: fileSyncDataId }), + }); + return Provider.parseContent(data, contentId); + }, +}); diff --git a/src/services/providers/googleDriveAppDataProvider.js b/src/services/providers/googleDriveAppDataProvider.js new file mode 100644 index 0000000..196f635 --- /dev/null +++ b/src/services/providers/googleDriveAppDataProvider.js @@ -0,0 +1,187 @@ +import store from '../../store'; +import googleHelper from './helpers/googleHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; + +let syncStartPageToken; + +export default new Provider({ + id: 'googleDriveAppData', + name: 'Google Drive app data', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams() { + // No param as it's the main workspace + return {}; + }, + getWorkspaceLocationUrl() { + // No direct link to app data + return null; + }, + getSyncDataUrl() { + // No direct link to app data + return null; + }, + getSyncDataDescription({ id }) { + return id; + }, + async initWorkspace() { + // Nothing much to do since the main workspace isn't necessarily synchronized + // Return the main workspace + return store.getters['workspace/workspacesById'].main; + }, + async getChanges() { + const syncToken = store.getters['workspace/syncToken']; + const startPageToken = store.getters['data/localSettings'].syncStartPageToken; + const result = await googleHelper.getChanges(syncToken, startPageToken, true); + const changes = result.changes.filter((change) => { + if (change.file) { + // Parse item from file name + try { + change.item = JSON.parse(change.file.name); + } catch (e) { + return false; + } + // Build sync data + change.syncData = { + id: change.fileId, + itemId: change.item.id, + type: change.item.type, + hash: change.item.hash, + }; + } + change.syncDataId = change.fileId; + return true; + }); + syncStartPageToken = result.startPageToken; + return changes; + }, + onChangesApplied() { + store.dispatch('data/patchLocalSettings', { + syncStartPageToken, + }); + }, + async saveWorkspaceItem({ item, syncData, ifNotTooLate }) { + const syncToken = store.getters['workspace/syncToken']; + const file = await googleHelper.uploadAppDataFile({ + token: syncToken, + name: JSON.stringify(item), + fileId: syncData && syncData.id, + ifNotTooLate, + }); + + // Build sync data to save + return { + syncData: { + id: file.id, + itemId: item.id, + type: item.type, + hash: item.hash, + }, + }; + }, + removeWorkspaceItem({ syncData, ifNotTooLate }) { + const syncToken = store.getters['workspace/syncToken']; + return googleHelper.removeAppDataFile(syncToken, syncData.id, ifNotTooLate); + }, + async downloadWorkspaceContent({ token, contentSyncData }) { + const data = await googleHelper.downloadAppDataFile(token, contentSyncData.id); + const content = utils.addItemHash(JSON.parse(data)); + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + }, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const data = await googleHelper.downloadAppDataFile(token, syncData.id); + const item = utils.addItemHash(JSON.parse(data)); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + contentSyncData, + ifNotTooLate, + }) { + const gdriveFile = await googleHelper.uploadAppDataFile({ + token, + name: JSON.stringify({ + id: content.id, + type: content.type, + hash: content.hash, + }), + media: JSON.stringify(content), + fileId: contentSyncData && contentSyncData.id, + ifNotTooLate, + }); + + // Return new sync data + return { + contentSyncData: { + id: gdriveFile.id, + itemId: content.id, + type: content.type, + hash: content.hash, + }, + }; + }, + async uploadWorkspaceData({ + token, + item, + syncData, + ifNotTooLate, + }) { + const file = await googleHelper.uploadAppDataFile({ + token, + name: JSON.stringify({ + id: item.id, + type: item.type, + hash: item.hash, + }), + media: JSON.stringify(item), + fileId: syncData && syncData.id, + ifNotTooLate, + }); + + // Return new sync data + return { + syncData: { + id: file.id, + itemId: item.id, + type: item.type, + hash: item.hash, + }, + }; + }, + async listFileRevisions({ token, contentSyncDataId }) { + const revisions = await googleHelper.getAppDataFileRevisions(token, contentSyncDataId); + return revisions.map(revision => ({ + id: revision.id, + sub: `${googleHelper.subPrefix}:${revision.lastModifyingUser.permissionId}`, + created: new Date(revision.modifiedTime).getTime(), + })); + }, + async loadFileRevision() { + // Revisions are already loaded + return false; + }, + async getFileRevisionContent({ token, contentSyncDataId, revisionId }) { + const content = await googleHelper + .downloadAppDataFileRevision(token, contentSyncDataId, revisionId); + return JSON.parse(content); + }, +}); diff --git a/src/services/providers/googleDriveProvider.js b/src/services/providers/googleDriveProvider.js new file mode 100644 index 0000000..0dcb774 --- /dev/null +++ b/src/services/providers/googleDriveProvider.js @@ -0,0 +1,216 @@ +import store from '../../store'; +import googleHelper from './helpers/googleHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; + +export default new Provider({ + id: 'googleDrive', + name: 'Google Drive', + getToken({ sub }) { + const token = store.getters['data/googleTokensBySub'][sub]; + return token && token.isDrive ? token : null; + }, + getLocationUrl({ driveFileId }) { + return `https://docs.google.com/file/d/${driveFileId}/edit`; + }, + getLocationDescription({ driveFileId }) { + return driveFileId; + }, + async initAction() { + const state = googleHelper.driveState || {}; + if (state.userId) { + // Try to find the token corresponding to the user ID + let token = store.getters['data/googleTokensBySub'][state.userId]; + // If not found or not enough permission, popup an OAuth2 window + if (!token || !token.isDrive) { + await store.dispatch('modal/open', { type: 'googleDriveAccount' }); + token = await googleHelper.addDriveAccount( + !store.getters['data/localSettings'].googleDriveRestrictedAccess, + state.userId, + ); + } + + const openWorkspaceIfExists = (file) => { + const folderId = file + && file.appProperties + && file.appProperties.folderId; + if (folderId) { + // See if we have the corresponding workspace + const workspaceParams = { + providerId: 'googleDriveWorkspace', + folderId, + }; + const workspaceId = utils.makeWorkspaceId(workspaceParams); + const workspace = store.getters['workspace/workspacesById'][workspaceId]; + // If we have the workspace, open it by changing the current URL + if (workspace) { + utils.setQueryParams(workspaceParams); + } + } + }; + + switch (state.action) { + case 'create': + default: + // See if folder is part of a workspace we can open + try { + const folder = await googleHelper.getFile(token, state.folderId); + folder.appProperties = folder.appProperties || {}; + googleHelper.driveActionFolder = folder; + openWorkspaceIfExists(folder); + } catch (err) { + if (!err || err.status !== 404) { + throw err; + } + // We received an HTTP 404 meaning we have no permission to read the folder + googleHelper.driveActionFolder = { id: state.folderId }; + } + break; + + case 'open': { + await utils.awaitSequence(state.ids || [], async (id) => { + const file = await googleHelper.getFile(token, id); + file.appProperties = file.appProperties || {}; + googleHelper.driveActionFiles.push(file); + }); + + // Check if first file is part of a workspace + openWorkspaceIfExists(googleHelper.driveActionFiles[0]); + } + } + } + }, + async performAction() { + const state = googleHelper.driveState || {}; + const token = store.getters['data/googleTokensBySub'][state.userId]; + switch (token && state.action) { + case 'create': { + const file = await workspaceSvc.createFile({}, true); + store.commit('file/setCurrentId', file.id); + // Return a new syncLocation + return this.makeLocation(token, null, googleHelper.driveActionFolder.id); + } + case 'open': + store.dispatch( + 'queue/enqueue', + () => this.openFiles(token, googleHelper.driveActionFiles), + ); + return null; + default: + return null; + } + }, + async downloadContent(token, syncLocation) { + const content = await googleHelper.downloadFile(token, syncLocation.driveFileId); + return Provider.parseContent(content, `${syncLocation.fileId}/content`); + }, + async uploadContent(token, content, syncLocation, ifNotTooLate) { + const file = store.state.file.itemsById[syncLocation.fileId]; + const name = utils.sanitizeName(file && file.name); + const parents = []; + if (syncLocation.driveParentId) { + parents.push(syncLocation.driveParentId); + } + const driveFile = await googleHelper.uploadFile({ + token, + name, + parents, + media: Provider.serializeContent(content), + fileId: syncLocation.driveFileId, + ifNotTooLate, + }); + return { + ...syncLocation, + driveFileId: driveFile.id, + }; + }, + async publish(token, html, metadata, publishLocation) { + const driveFile = await googleHelper.uploadFile({ + token, + name: metadata.title, + parents: [], + media: html, + mediaType: publishLocation.templateId ? 'text/html' : undefined, + fileId: publishLocation.driveFileId, + }); + return { + ...publishLocation, + driveFileId: driveFile.id, + }; + }, + async openFiles(token, driveFiles) { + return utils.awaitSequence(driveFiles, async (driveFile) => { + // Check if the file exists and open it + if (!Provider.openFileWithLocation({ + providerId: this.id, + driveFileId: driveFile.id, + })) { + // Download content from Google Drive + const syncLocation = { + driveFileId: driveFile.id, + providerId: this.id, + sub: token.sub, + }; + let content; + try { + content = await this.downloadContent(token, syncLocation); + } catch (e) { + store.dispatch('notification/error', `Could not open file ${driveFile.id}.`); + return; + } + + // Create the file + const item = await workspaceSvc.createFile({ + name: driveFile.name, + parentId: store.getters['file/current'].parentId, + text: content.text, + properties: content.properties, + discussions: content.discussions, + comments: content.comments, + }, true); + store.commit('file/setCurrentId', item.id); + workspaceSvc.addSyncLocation({ + ...syncLocation, + fileId: item.id, + }); + store.dispatch('notification/info', `${store.getters['file/current'].name}已从Google Drive导入。`); + } + }); + }, + makeLocation(token, fileId, folderId) { + const location = { + providerId: this.id, + sub: token.sub, + }; + if (fileId) { + location.driveFileId = fileId; + } + if (folderId) { + location.driveParentId = folderId; + } + return location; + }, + async listFileRevisions({ token, syncLocation }) { + const revisions = await googleHelper.getFileRevisions(token, syncLocation.driveFileId); + return revisions.map(revision => ({ + id: revision.id, + sub: `${googleHelper.subPrefix}:${revision.lastModifyingUser.permissionId}`, + created: new Date(revision.modifiedTime).getTime(), + })); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + syncLocation, + revisionId, + }) { + const content = await googleHelper + .downloadFileRevision(token, syncLocation.driveFileId, revisionId); + return Provider.parseContent(content, contentId); + }, +}); diff --git a/src/services/providers/googleDriveWorkspaceProvider.js b/src/services/providers/googleDriveWorkspaceProvider.js new file mode 100644 index 0000000..0f9429b --- /dev/null +++ b/src/services/providers/googleDriveWorkspaceProvider.js @@ -0,0 +1,534 @@ +import store from '../../store'; +import googleHelper from './helpers/googleHelper'; +import Provider from './common/Provider'; +import utils from '../utils'; +import workspaceSvc from '../workspaceSvc'; +import badgeSvc from '../badgeSvc'; + +let fileIdToOpen; +let syncStartPageToken; + +export default new Provider({ + id: 'googleDriveWorkspace', + name: 'Google Drive', + getToken() { + return store.getters['workspace/syncToken']; + }, + getWorkspaceParams({ folderId }) { + return { + providerId: this.id, + folderId, + }; + }, + getWorkspaceLocationUrl({ folderId }) { + return `https://docs.google.com/folder/d/${folderId}`; + }, + getSyncDataUrl({ id }) { + return `https://docs.google.com/file/d/${id}/edit`; + }, + getSyncDataDescription({ id }) { + return id; + }, + async initWorkspace() { + const makeWorkspaceId = folderId => folderId + && utils.makeWorkspaceId(this.getWorkspaceParams({ folderId })); + + const getWorkspace = folderId => + store.getters['workspace/workspacesById'][makeWorkspaceId(folderId)]; + + const initFolder = async (token, folder) => { + const appProperties = { + folderId: folder.id, + dataFolderId: folder.appProperties.dataFolderId, + trashFolderId: folder.appProperties.trashFolderId, + }; + + // Make sure data folder exists + if (!appProperties.dataFolderId) { + const dataFolder = await googleHelper.uploadFile({ + token, + name: '.stackedit-data', + parents: [folder.id], + appProperties: { folderId: folder.id }, + mediaType: googleHelper.folderMimeType, + }); + appProperties.dataFolderId = dataFolder.id; + } + + // Make sure trash folder exists + if (!appProperties.trashFolderId) { + const trashFolder = await googleHelper.uploadFile({ + token, + name: '.stackedit-trash', + parents: [folder.id], + appProperties: { folderId: folder.id }, + mediaType: googleHelper.folderMimeType, + }); + appProperties.trashFolderId = trashFolder.id; + } + + // Update workspace if some properties are missing + if (appProperties.folderId !== folder.appProperties.folderId + || appProperties.dataFolderId !== folder.appProperties.dataFolderId + || appProperties.trashFolderId !== folder.appProperties.trashFolderId + ) { + await googleHelper.uploadFile({ + token, + appProperties, + mediaType: googleHelper.folderMimeType, + fileId: folder.id, + }); + } + + // Update workspace in the store + const workspaceId = makeWorkspaceId(folder.id); + store.dispatch('workspace/patchWorkspacesById', { + [workspaceId]: { + id: workspaceId, + sub: token.sub, + name: folder.name, + providerId: this.id, + folderId: folder.id, + teamDriveId: folder.teamDriveId, + dataFolderId: appProperties.dataFolderId, + trashFolderId: appProperties.trashFolderId, + }, + }); + }; + + // Token sub is in the workspace or in the url if workspace is about to be created + const { sub } = getWorkspace(utils.queryParams.folderId) || utils.queryParams; + // See if we already have a token + let token = store.getters['data/googleTokensBySub'][sub]; + // If no token has been found, popup an authorize window and get one + if (!token || !token.isDrive || !token.driveFullAccess) { + await store.dispatch('modal/open', 'workspaceGoogleRedirection'); + token = await googleHelper.addDriveAccount(true, utils.queryParams.sub); + } + + let { folderId } = utils.queryParams; + // If no folderId is provided, create one + if (!folderId) { + const folder = await googleHelper.uploadFile({ + token, + name: 'StackEdit workspace', + parents: [], + mediaType: googleHelper.folderMimeType, + }); + await initFolder(token, { + ...folder, + appProperties: {}, + }); + folderId = folder.id; + } + + // Init workspace + if (!getWorkspace(folderId)) { + let folder; + try { + folder = await googleHelper.getFile(token, folderId); + } catch (err) { + throw new Error(`Folder ${folderId} is not accessible. Make sure you have the right permissions.`); + } + folder.appProperties = folder.appProperties || {}; + const folderIdProperty = folder.appProperties.folderId; + if (folderIdProperty && folderIdProperty !== folderId) { + throw new Error(`Folder ${folderId} is part of another workspace.`); + } + await initFolder(token, folder); + } + + badgeSvc.addBadge('addGoogleDriveWorkspace'); + return getWorkspace(folderId); + }, + async performAction() { + const state = googleHelper.driveState || {}; + const token = this.getToken(); + switch (token && state.action) { + case 'create': { + const driveFolder = googleHelper.driveActionFolder; + let syncData = store.getters['data/syncDataById'][driveFolder.id]; + if (!syncData && driveFolder.appProperties.id) { + // Create folder if not already synced + store.commit('folder/setItem', { + id: driveFolder.appProperties.id, + name: driveFolder.name, + }); + const item = store.state.folder.itemsById[driveFolder.appProperties.id]; + syncData = { + id: driveFolder.id, + itemId: item.id, + type: item.type, + hash: item.hash, + }; + store.dispatch('data/patchSyncDataById', { + [syncData.id]: syncData, + }); + } + const file = await workspaceSvc.createFile({ + parentId: syncData && syncData.itemId, + }, true); + store.commit('file/setCurrentId', file.id); + // File will be created on next workspace sync + break; + } + case 'open': { + // open first file only + const firstFile = googleHelper.driveActionFiles[0]; + const syncData = store.getters['data/syncDataById'][firstFile.id]; + if (!syncData) { + fileIdToOpen = firstFile.id; + } else { + store.commit('file/setCurrentId', syncData.itemId); + } + break; + } + default: + } + }, + async getChanges() { + const workspace = store.getters['workspace/currentWorkspace']; + const syncToken = store.getters['workspace/syncToken']; + const lastStartPageToken = store.getters['data/localSettings'].syncStartPageToken; + const { changes, startPageToken } = await googleHelper + .getChanges(syncToken, lastStartPageToken, false, workspace.teamDriveId); + + syncStartPageToken = startPageToken; + return changes; + }, + prepareChanges(changes) { + // Collect possible parent IDs + const parentIds = {}; + Object.entries(store.getters['data/syncDataByItemId']).forEach(([id, syncData]) => { + parentIds[syncData.id] = id; + }); + changes.forEach((change) => { + const { id } = (change.file || {}).appProperties || {}; + if (id) { + parentIds[change.fileId] = id; + } + }); + + // Collect changes + const workspace = store.getters['workspace/currentWorkspace']; + const result = []; + changes.forEach((change) => { + // Ignore changes on StackEdit own folders + if (change.fileId === workspace.folderId + || change.fileId === workspace.dataFolderId + || change.fileId === workspace.trashFolderId + ) { + return; + } + + let contentChange; + if (change.file) { + // Ignore changes in files that are not in the workspace + const { appProperties } = change.file; + if (!appProperties || appProperties.folderId !== workspace.folderId + ) { + return; + } + + // If change is on a data item + if (change.file.parents[0] === workspace.dataFolderId) { + // Data item has a JSON filename + try { + change.item = JSON.parse(change.file.name); + } catch (e) { + return; + } + } else { + // Change on a file or folder + const type = change.file.mimeType === googleHelper.folderMimeType + ? 'folder' + : 'file'; + const item = { + id: appProperties.id, + type, + name: change.file.name, + parentId: null, + }; + + // Fill parentId + if (change.file.parents.some(parentId => parentId === workspace.trashFolderId)) { + item.parentId = 'trash'; + } else { + change.file.parents.some((parentId) => { + if (!parentIds[parentId]) { + return false; + } + item.parentId = parentIds[parentId]; + return true; + }); + } + change.item = utils.addItemHash(item); + + if (type === 'file') { + // create a fake change as a file content change + const id = `${appProperties.id}/content`; + const syncDataId = `${change.fileId}/content`; + contentChange = { + item: { + id, + type: 'content', + // Need a truthy value to force saving sync data + hash: 1, + }, + syncData: { + id: syncDataId, + itemId: id, + type: 'content', + // Need a truthy value to force downloading the content + hash: 1, + }, + syncDataId, + }; + } + } + + // Build sync data + change.syncData = { + id: change.fileId, + parentIds: change.file.parents, + itemId: change.item.id, + type: change.item.type, + hash: change.item.hash, + }; + } else { + // Item was removed + const syncData = store.getters['data/syncDataById'][change.fileId]; + if (syncData && syncData.type === 'file') { + // create a fake change as a file content change + contentChange = { + syncDataId: `${change.fileId}/content`, + }; + } + } + + // Push change + change.syncDataId = change.fileId; + result.push(change); + if (contentChange) { + result.push(contentChange); + } + }); + + return result; + }, + onChangesApplied() { + store.dispatch('data/patchLocalSettings', { + syncStartPageToken, + }); + }, + async saveWorkspaceItem({ item, syncData, ifNotTooLate }) { + const workspace = store.getters['workspace/currentWorkspace']; + const syncToken = store.getters['workspace/syncToken']; + let file; + if (item.type !== 'file' && item.type !== 'folder') { + // For sync/publish locations, store item as filename + file = await googleHelper.uploadFile({ + token: syncToken, + name: JSON.stringify(item), + parents: [workspace.dataFolderId], + appProperties: { + folderId: workspace.folderId, + }, + fileId: syncData && syncData.id, + oldParents: syncData && syncData.parentIds, + ifNotTooLate, + }); + } else { + // For type `file` or `folder` + const parentSyncData = store.getters['data/syncDataByItemId'][item.parentId]; + let parentId; + if (item.parentId === 'trash') { + parentId = workspace.trashFolderId; + } else if (parentSyncData) { + parentId = parentSyncData.id; + } else { + parentId = workspace.folderId; + } + + file = await googleHelper.uploadFile({ + token: syncToken, + name: item.name, + parents: [parentId], + appProperties: { + id: item.id, + folderId: workspace.folderId, + }, + mediaType: item.type === 'folder' ? googleHelper.folderMimeType : undefined, + fileId: syncData && syncData.id, + oldParents: syncData && syncData.parentIds, + ifNotTooLate, + }); + } + + // Build sync data to save + return { + syncData: { + id: file.id, + parentIds: file.parents, + itemId: item.id, + type: item.type, + hash: item.hash, + }, + }; + }, + async removeWorkspaceItem({ syncData, ifNotTooLate }) { + // Ignore content deletion + if (syncData.type !== 'content') { + const syncToken = store.getters['workspace/syncToken']; + await googleHelper.removeFile(syncToken, syncData.id, ifNotTooLate); + } + }, + async downloadWorkspaceContent({ token, contentSyncData, fileSyncData }) { + const data = await googleHelper.downloadFile(token, fileSyncData.id); + const content = Provider.parseContent(data, contentSyncData.itemId); + + // Open the file requested by action if it wasn't synced yet + if (fileIdToOpen && fileIdToOpen === fileSyncData.id) { + fileIdToOpen = null; + // Open the file once downloaded content has been stored + setTimeout(() => { + store.commit('file/setCurrentId', fileSyncData.itemId); + }, 10); + } + + return { + content, + contentSyncData: { + ...contentSyncData, + hash: content.hash, + }, + }; + }, + async downloadWorkspaceData({ token, syncData }) { + if (!syncData) { + return {}; + } + + const content = await googleHelper.downloadFile(token, syncData.id); + const item = JSON.parse(content); + return { + item, + syncData: { + ...syncData, + hash: item.hash, + }, + }; + }, + async uploadWorkspaceContent({ + token, + content, + file, + fileSyncData, + ifNotTooLate, + }) { + let gdriveFile; + let newFileSyncData; + + if (fileSyncData) { + // Only update file media + gdriveFile = await googleHelper.uploadFile({ + token, + media: Provider.serializeContent(content), + fileId: fileSyncData.id, + ifNotTooLate, + }); + } else { + // Create file with media + const workspace = store.getters['workspace/currentWorkspace']; + const parentSyncData = store.getters['data/syncDataByItemId'][file.parentId]; + gdriveFile = await googleHelper.uploadFile({ + token, + name: file.name, + parents: [parentSyncData ? parentSyncData.id : workspace.folderId], + appProperties: { + id: file.id, + folderId: workspace.folderId, + }, + media: Provider.serializeContent(content), + ifNotTooLate, + }); + + // Create file sync data + newFileSyncData = { + id: gdriveFile.id, + parentIds: gdriveFile.parents, + itemId: file.id, + type: file.type, + hash: file.hash, + }; + } + + // Return new sync data + return { + contentSyncData: { + id: `${gdriveFile.id}/content`, + itemId: content.id, + type: content.type, + hash: content.hash, + }, + fileSyncData: newFileSyncData, + }; + }, + async uploadWorkspaceData({ + token, + item, + syncData, + ifNotTooLate, + }) { + const workspace = store.getters['workspace/currentWorkspace']; + const file = await googleHelper.uploadFile({ + token, + name: JSON.stringify({ + id: item.id, + type: item.type, + hash: item.hash, + }), + parents: [workspace.dataFolderId], + appProperties: { + folderId: workspace.folderId, + }, + media: JSON.stringify(item), + mediaType: 'application/json', + fileId: syncData && syncData.id, + oldParents: syncData && syncData.parentIds, + ifNotTooLate, + }); + + // Return new sync data + return { + syncData: { + id: file.id, + parentIds: file.parents, + itemId: item.id, + type: item.type, + hash: item.hash, + }, + }; + }, + async listFileRevisions({ token, fileSyncDataId }) { + const revisions = await googleHelper.getFileRevisions(token, fileSyncDataId); + return revisions.map(revision => ({ + id: revision.id, + sub: `${googleHelper.subPrefix}:${revision.lastModifyingUser.permissionId}`, + created: new Date(revision.modifiedTime).getTime(), + })); + }, + async loadFileRevision() { + // Revision are already loaded + return false; + }, + async getFileRevisionContent({ + token, + contentId, + fileSyncDataId, + revisionId, + }) { + const content = await googleHelper.downloadFileRevision(token, fileSyncDataId, revisionId); + return Provider.parseContent(content, contentId); + }, +}); diff --git a/src/services/providers/helpers/couchdbHelper.js b/src/services/providers/helpers/couchdbHelper.js new file mode 100644 index 0000000..84eca0e --- /dev/null +++ b/src/services/providers/helpers/couchdbHelper.js @@ -0,0 +1,194 @@ +import networkSvc from '../../networkSvc'; +import utils from '../../utils'; +import store from '../../../store'; +import userSvc from '../../userSvc'; + +const request = async (token, options = {}) => { + const baseUrl = `${token.dbUrl}/`; + const getLastToken = () => store.getters['data/couchdbTokensBySub'][token.sub]; + + const assertUnauthorized = (err) => { + if (err.status !== 401) { + throw err; + } + }; + + const onUnauthorized = async () => { + try { + const { name, password } = getLastToken(); + await networkSvc.request({ + method: 'POST', + url: utils.resolveUrl(baseUrl, '../_session'), + withCredentials: true, + body: { + name, + password, + }, + }); + } catch (err) { + assertUnauthorized(err); + await store.dispatch('modal/open', { + type: 'couchdbCredentials', + token: getLastToken(), + }); + await onUnauthorized(); + } + }; + + const config = { + ...options, + headers: { + Accept: 'application/json', + ...options.headers || {}, + }, + url: utils.resolveUrl(baseUrl, options.path || '.'), + withCredentials: true, + }; + + try { + let res; + try { + res = await networkSvc.request(config); + } catch (err) { + assertUnauthorized(err); + await onUnauthorized(); + res = await networkSvc.request(config); + } + return res.body; + } catch (err) { + if (err.status === 409) { + throw new Error('TOO_LATE'); + } + throw err; + } +}; + +export default { + + /** + * http://docs.couchdb.org/en/2.1.1/api/database/common.html#db + */ + getDb(token) { + return request(token); + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/database/changes.html#db-changes + */ + async getChanges(token, lastSeq) { + const result = { + changes: [], + lastSeq, + }; + + const getPage = async () => { + const body = await request(token, { + method: 'GET', + path: '_changes', + params: { + since: result.lastSeq || 0, + include_docs: true, + limit: 1000, + }, + }); + result.changes = [...result.changes, ...body.results]; + result.lastSeq = body.last_seq; + if (body.pending) { + return getPage(); + } + return result; + }; + + return getPage(); + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/database/common.html#post--db + * http://docs.couchdb.org/en/2.1.1/api/document/common.html#put--db-docid + */ + async uploadDocument({ + token, + item, + data = null, + dataType = null, + documentId = null, + rev = null, + }) { + const options = { + method: 'POST', + body: { item, time: Date.now() }, + }; + const userId = userSvc.getCurrentUserId(); + if (userId) { + options.body.sub = userId; + } + if (documentId) { + options.method = 'PUT'; + options.path = documentId; + options.body._rev = rev; // eslint-disable-line no-underscore-dangle + } + if (data) { + options.body._attachments = { // eslint-disable-line no-underscore-dangle + data: { + content_type: dataType, + data: utils.encodeBase64(data), + }, + }; + } + return request(token, options); + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/document/common.html#delete--db-docid + */ + async removeDocument(token, documentId, rev) { + if (!documentId) { + // Prevent from deleting the whole database + throw new Error('Missing document ID'); + } + + return request(token, { + method: 'DELETE', + path: documentId, + params: { rev }, + }); + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/document/common.html#get--db-docid + */ + async retrieveDocument(token, documentId, rev) { + return request(token, { + path: documentId, + params: { rev }, + }); + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/document/common.html#get--db-docid + */ + async retrieveDocumentWithAttachments(token, documentId, rev) { + const body = await request(token, { + path: documentId, + params: { attachments: true, rev }, + }); + body.attachments = {}; + // eslint-disable-next-line no-underscore-dangle + Object.entries(body._attachments).forEach(([name, attachment]) => { + body.attachments[name] = utils.decodeBase64(attachment.data); + }); + return body; + }, + + /** + * http://docs.couchdb.org/en/2.1.1/api/document/common.html#get--db-docid + */ + async retrieveDocumentWithRevisions(token, documentId) { + return request(token, { + path: documentId, + params: { + revs_info: true, + }, + }); + }, +}; diff --git a/src/services/providers/helpers/customHelper.js b/src/services/providers/helpers/customHelper.js new file mode 100644 index 0000000..272b4fc --- /dev/null +++ b/src/services/providers/helpers/customHelper.js @@ -0,0 +1,69 @@ +import md5 from 'js-md5'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; +import utils from '../../utils'; + +/** + * 自定义账号前缀 + */ +const subPrefix = 'cs'; +export default { + subPrefix, + async addAccount({ + name, + uploadUrl, + fileParamName, + customHeaders, + customParams, + resultUrlParam, + }) { + userSvc.addUserInfo({ + id: `${subPrefix}:${utils.encodeBase64(name)}`, + name, + imageUrl: '', + }); + // Build token object including sub + const token = { + uploadUrl, + fileParamName, + customHeaders, + customParams, + resultUrlParam, + name, + sub: utils.encodeBase64(name), + }; + // Add token to smms tokens + store.dispatch('data/addCustomToken', token); + badgeSvc.addBadge('addCustomAccount'); + return token; + }, + async uploadFile({ + token, + file, + }) { + const newFileName = `${md5(await utils.encodeFiletoBase64(file))}.${file.type.split('/')[1]}`; + const newfile = new File([file], newFileName, { type: file.type }); + const headers = token.customHeaders || {}; + const formData = token.customParams || {}; + formData[token.fileParamName] = newfile; + const { body } = await networkSvc.request({ + method: 'POST', + url: token.uploadUrl, + headers, + formData, + }); + const paramArray = token.resultUrlParam.split('.'); + let result = body; + paramArray.forEach((paramName) => { + result = result[paramName]; + if (!result) { + store.dispatch('notification/error', `自定义图床上传图片失败,响应Body为:${JSON.stringify(body)}`); + throw new Error(`自定义图床上传图片失败,响应Body为:${JSON.stringify(body)}`); + } + }); + return result; + }, + +}; diff --git a/src/services/providers/helpers/dropboxHelper.js b/src/services/providers/helpers/dropboxHelper.js new file mode 100644 index 0000000..f9082c2 --- /dev/null +++ b/src/services/providers/helpers/dropboxHelper.js @@ -0,0 +1,190 @@ +import networkSvc from '../../networkSvc'; +import userSvc from '../../userSvc'; +import store from '../../../store'; +import badgeSvc from '../../badgeSvc'; + +const getAppKey = (fullAccess) => { + if (fullAccess) { + return store.getters['data/serverConf'].dropboxAppKeyFull; + } + return store.getters['data/serverConf'].dropboxAppKey; +}; + +const httpHeaderSafeJson = args => args && JSON.stringify(args) + .replace(/[\u007f-\uffff]/g, c => `\\u${`000${c.charCodeAt(0).toString(16)}`.slice(-4)}`); + +const request = ({ accessToken }, options, args) => networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + 'Content-Type': options.body && (typeof options.body === 'string' + ? 'application/octet-stream' : 'application/json; charset=utf-8'), + 'Dropbox-API-Arg': httpHeaderSafeJson(args), + Authorization: `Bearer ${accessToken}`, + }, +}); + +/** + * https://www.dropbox.com/developers/documentation/http/documentation#users-get_account + */ +const subPrefix = 'db'; +userSvc.setInfoResolver('dropbox', subPrefix, async (sub) => { + const dropboxToken = Object.values(store.getters['data/dropboxTokensBySub'])[0]; + try { + const { body } = await request(dropboxToken, { + method: 'POST', + url: 'https://api.dropboxapi.com/2/users/get_account', + body: { + account_id: sub, + }, + }); + + return { + id: `${subPrefix}:${body.account_id}`, + name: body.name.display_name, + imageUrl: body.profile_photo_url || '', + }; + } catch (err) { + if (!dropboxToken || err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + + /** + * https://www.dropbox.com/developers/documentation/http/documentation#oauth2-authorize + * https://www.dropbox.com/developers/documentation/http/documentation#users-get_current_account + */ + async startOauth2(fullAccess, sub = null, silent = false) { + // Get an OAuth2 code + const { accessToken } = await networkSvc.startOauth2( + 'https://www.dropbox.com/oauth2/authorize', + { + client_id: getAppKey(fullAccess), + response_type: 'token', + }, + silent, + ); + + // Call the user info endpoint + const { body } = await request({ accessToken }, { + method: 'POST', + url: 'https://api.dropboxapi.com/2/users/get_current_account', + }); + userSvc.addUserInfo({ + id: `${subPrefix}:${body.account_id}`, + name: body.name.display_name, + imageUrl: body.profile_photo_url || '', + }); + + // Check the returned sub consistency + if (sub && `${body.account_id}` !== sub) { + throw new Error('Dropbox account ID not expected.'); + } + + // Build token object including scopes and sub + const token = { + accessToken, + name: body.name.display_name, + sub: `${body.account_id}`, + fullAccess, + }; + + // Add token to dropbox tokens + store.dispatch('data/addDropboxToken', token); + return token; + }, + async addAccount(fullAccess = false) { + const token = await this.startOauth2(fullAccess); + badgeSvc.addBadge('addDropboxAccount'); + return token; + }, + + /** + * https://www.dropbox.com/developers/documentation/http/documentation#files-upload + */ + async uploadFile({ + token, + path, + content, + fileId, + }) { + return (await request(token, { + method: 'POST', + url: 'https://content.dropboxapi.com/2/files/upload', + body: content, + }, { + path: fileId || path, + mode: 'overwrite', + })).body; + }, + + /** + * https://www.dropbox.com/developers/documentation/http/documentation#files-download + */ + async downloadFile({ + token, + path, + fileId, + }) { + const res = await request(token, { + method: 'POST', + url: 'https://content.dropboxapi.com/2/files/download', + raw: true, + }, { + path: fileId || path, + }); + return { + id: JSON.parse(res.headers['dropbox-api-result']).id, + content: res.body, + }; + }, + + /** + * https://www.dropbox.com/developers/documentation/http/documentation#list-revisions + */ + async listRevisions({ + token, + path, + fileId, + }) { + const res = await request(token, { + method: 'POST', + url: 'https://api.dropboxapi.com/2/files/list_revisions', + body: fileId ? { + path: fileId, + mode: 'id', + limit: 100, + } : { + path, + limit: 100, + }, + }); + return res.body.entries; + }, + + /** + * https://www.dropbox.com/developers/chooser + */ + async openChooser(token) { + if (!window.Dropbox) { + await networkSvc.loadScript('https://www.dropbox.com/static/api/2/dropins.js'); + } + return new Promise((resolve) => { + window.Dropbox.appKey = getAppKey(token.fullAccess); + window.Dropbox.choose({ + multiselect: true, + linkType: 'direct', + success: files => resolve(files.map((file) => { + const path = file.link.replace(/.*\/view\/[^/]*/, ''); + return decodeURI(path); + })), + cancel: () => resolve([]), + }); + }); + }, +}; diff --git a/src/services/providers/helpers/giteaHelper.js b/src/services/providers/helpers/giteaHelper.js new file mode 100644 index 0000000..c6188b2 --- /dev/null +++ b/src/services/providers/helpers/giteaHelper.js @@ -0,0 +1,385 @@ +import utils from '../../utils'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; +import constants from '../../../data/constants'; + +const tokenExpirationMargin = 5 * 60 * 1000; + +const request = ({ accessToken, serverUrl }, options) => networkSvc.request({ + ...options, + url: `${serverUrl}/api/v1/${options.url}`, + headers: { + ...options.headers || {}, + Authorization: `Bearer ${accessToken}`, + }, +}) + .then(res => res.body); + +const getCommitMessage = (name, path) => { + const message = store.getters['data/computedSettings'].git[name]; + return message.replace(/{{path}}/g, path); +}; + +/** + * https://try.gitea.io/api/swagger#/user/userGet + */ +const subPrefix = 'gt'; +userSvc.setInfoResolver('gitea', subPrefix, async (sub) => { + try { + const [, serverUrl, username] = sub.match(/^(.+)\/([^/]+)$/); + const user = (await networkSvc.request({ + url: `${serverUrl}/api/v1/users/${username}`, + })).body; + const uniqueSub = `${serverUrl}/${user.username}`; + + return { + id: `${subPrefix}:${uniqueSub}`, + name: user.username, + imageUrl: user.avatar_url || '', + }; + } catch (err) { + if (err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + + /** + * https://docs.gitea.io/en-us/oauth2-provider/ + */ + async startOauth2( + serverUrl, applicationId, applicationSecret, + sub = null, silent = false, refreshToken, + ) { + let apiUrl = serverUrl; + let clientId = applicationId; + let useServerConf = false; + // 获取gitea配置的参数 + await networkSvc.getServerConf(); + const confClientId = store.getters['data/serverConf'].giteaClientId; + const confServerUrl = store.getters['data/serverConf'].giteaUrl; + // 存在gitea配置则使用后端配置 + if (confClientId && confServerUrl) { + apiUrl = confServerUrl; + clientId = confClientId; + useServerConf = true; + } + let tokenBody; + if (!silent) { + // Get an OAuth2 code + const { code } = await networkSvc.startOauth2( + `${apiUrl}/login/oauth/authorize`, + { + client_id: clientId, + response_type: 'code', + redirect_uri: constants.oauth2RedirectUri, + }, + silent, + ); + if (useServerConf) { + tokenBody = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/giteaToken', + params: { + code, + grant_type: 'authorization_code', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // Exchange code with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${apiUrl}/login/oauth/access_token`, + body: { + client_id: clientId, + client_secret: applicationSecret, + code, + grant_type: 'authorization_code', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } + } else if (useServerConf) { + tokenBody = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/giteaToken', + params: { + refresh_token: refreshToken, + grant_type: 'refresh_token', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // Exchange refreshToken with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${apiUrl}/login/oauth/access_token`, + body: { + client_id: clientId, + client_secret: applicationSecret, + refresh_token: refreshToken, + grant_type: 'refresh_token', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } + + const accessToken = tokenBody.access_token; + + // Call the user info endpoint + const user = await request({ accessToken, serverUrl: apiUrl }, { + url: 'user', + }); + const uniqueSub = `${apiUrl}/${user.username}`; + userSvc.addUserInfo({ + id: `${subPrefix}:${uniqueSub}`, + name: user.username, + imageUrl: user.avatar_url || '', + }); + + // Check the returned sub consistency + if (sub && uniqueSub !== sub) { + throw new Error('Gitea account ID not expected.'); + } + + const oldToken = store.getters['data/giteaTokensBySub'][uniqueSub]; + // Build token object including scopes and sub + const token = { + accessToken, + name: user.username, + applicationId: clientId, + applicationSecret, + imgStorages: oldToken && oldToken.imgStorages, + refreshToken: tokenBody.refresh_token, + expiresOn: Date.now() + (tokenBody.expires_in * 1000), + serverUrl: apiUrl, + sub: uniqueSub, + }; + + // Add token to gitea tokens + store.dispatch('data/addGiteaToken', token); + return token; + }, + // 刷新token + async refreshToken(token) { + const { + serverUrl, + applicationId, + applicationSecret, + sub, + } = token; + const lastToken = store.getters['data/giteaTokensBySub'][sub]; + // 兼容旧的没有过期时间 + if (!lastToken.expiresOn) { + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitea', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + // lastToken is not expired + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { + return lastToken; + } + + // existing token is about to expire. + // Try to get a new token in background + try { + return await this.startOauth2( + serverUrl, applicationId, applicationSecret, + sub, true, lastToken.refreshToken, + ); + } catch (err) { + // If it fails try to popup a window + if (store.state.offline) { + throw err; + } + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitea', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + }, + async addAccount({ + serverUrl, + applicationId, + applicationSecret, + }, sub = null) { + const token = await this.startOauth2( + serverUrl, + applicationId, + applicationSecret, + sub, + ); + badgeSvc.addBadge('addGiteaAccount'); + return token; + }, + async updateToken(token, imgStorageInfo) { + const imgStorages = token.imgStorages || []; + // 存储仓库唯一标识 + const sid = utils.hash(`${imgStorageInfo.repoUri}${imgStorageInfo.path}${imgStorageInfo.branch}`); + // 查询是否存在 存在则更新 + const filterStorages = imgStorages.filter(it => it.sid === sid); + if (filterStorages && filterStorages.length > 0) { + filterStorages.repoUri = imgStorageInfo.repoUri; + filterStorages.path = imgStorageInfo.path; + filterStorages.branch = imgStorageInfo.branch; + } else { + imgStorages.push({ + sid, + repoUri: imgStorageInfo.repoUri, + path: imgStorageInfo.path, + branch: imgStorageInfo.branch, + }); + token.imgStorages = imgStorages; + } + store.dispatch('data/addGiteaToken', token); + }, + async removeTokenImgStorage(token, sid) { + if (!token.imgStorages || token.imgStorages.length === 0) { + return; + } + token.imgStorages = token.imgStorages.filter(it => it.sid !== sid); + store.dispatch('data/addGiteaToken', token); + }, + async getProjectId(token, { projectPath, projectId }) { + if (projectId) { + return projectId; + } + const repoInfo = await this.getRepoInfo(token, projectPath); + return repoInfo.full_name; + }, + /** + * https://try.gitea.io/api/swagger#/repository/repoGet + */ + async getRepoInfo(token, projectPath) { + const [, repoFullName] = projectPath.match(/([^/]+\/[^/]+)$/); + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { url: `repos/${repoFullName}` }); + }, + + /** + * https://try.gitea.io/api/swagger#/repository/GetTree + */ + async getTree({ + token, + projectId, + branch, + }) { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { + url: `repos/${projectId}/git/trees/${branch}`, + params: { + recursive: true, + per_page: 9999, + }, + }); + }, + + /** + * https://try.gitea.io/api/swagger#/repository/repoGetAllCommits + */ + async getCommits({ + token, + projectId, + branch, + path, + }) { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { + url: `repos/${projectId}/commits`, + params: { + sha: branch, + path, + }, + }); + }, + + /** + * https://try.gitea.io/api/swagger#/repository/repoCreateFile + * https://try.gitea.io/api/swagger#/repository/repoUpdateFile + */ + async uploadFile({ + token, + projectId, + branch, + path, + content, + sha, + isImg, + commitMessage, + }) { + // 非法的文件名 不让提交 + if (!path || path.endsWith('undefined')) { + return new Promise((resolve) => { + resolve({ res: { content: { sha: null } } }); + }); + } + let uploadContent = content; + if (isImg && typeof content !== 'string') { + uploadContent = await utils.encodeFiletoBase64(content); + } + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { + method: sha ? 'PUT' : 'POST', + url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, + body: { + message: commitMessage || getCommitMessage(sha ? 'updateFileMessage' : 'createFileMessage', path), + content: isImg ? uploadContent : utils.encodeBase64(content), + sha, + branch, + }, + }); + }, + + /** + * https://try.gitea.io/api/swagger#/repository/repoDeleteFile + */ + async removeFile({ + token, + projectId, + branch, + path, + sha, + }) { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { + method: 'DELETE', + url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, + body: { + message: getCommitMessage('deleteFileMessage', path), + sha, + branch, + }, + }); + }, + + /** + * https://try.gitea.io/api/swagger#/repository/repoGetContents + */ + async downloadFile({ + token, + projectId, + branch, + path, + isImg, + }) { + const refreshedToken = await this.refreshToken(token); + const { sha, content } = await request(refreshedToken, { + url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, + params: { ref: branch }, + }); + return { + sha, + data: !isImg ? utils.decodeBase64(content) : content, + }; + }, +}; diff --git a/src/services/providers/helpers/giteeHelper.js b/src/services/providers/helpers/giteeHelper.js new file mode 100644 index 0000000..101050c --- /dev/null +++ b/src/services/providers/helpers/giteeHelper.js @@ -0,0 +1,423 @@ +import utils from '../../utils'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; +import constants from '../../../data/constants'; + +const tokenExpirationMargin = 5 * 60 * 1000; + +const appDataRepo = 'stackedit-app-data'; + +const request = (token, options) => networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + }, + params: { + ...options.params || {}, + t: Date.now(), // Prevent from caching + access_token: token.accessToken, + }, +}); + +const repoRequest = (token, owner, repo, options) => request(token, { + ...options, + url: `https://gitee.com/api/v5/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${options.url}`, +}) + .then(res => res.body); + +const getCommitMessage = (name, path) => { + const message = store.getters['data/computedSettings'].git[name]; + return message.replace(/{{path}}/g, path); +}; + +/** + * Getting a user from its userId is not feasible with API v3. + * Using an undocumented endpoint... + */ +const subPrefix = 'ge'; +userSvc.setInfoResolver('gitee', subPrefix, async (sub) => { + try { + const user = (await networkSvc.request({ + url: `https://gitee.com/api/v5/users/${sub}`, + params: { + t: Date.now(), // Prevent from caching + }, + })).body; + + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + return { + id: `${subPrefix}:${user.login}`, + name: user.login, + imageUrl: user.avatar_url || '', + }; + } catch (err) { + if (err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + + /** + * https://developer.gitee.com/apps/building-oauth-apps/authorization-options-for-oauth-apps/ + */ + async startOauth2(lastToken, silent = false, isMain, randomClientId) { + let tokenBody; + if (!silent) { + const clientId = (await networkSvc.request({ + method: 'GET', + url: 'giteeClientId', + params: { random: randomClientId }, + })).body; + // Get an OAuth2 code + const { code } = await networkSvc.startOauth2( + 'https://gitee.com/oauth/authorize', + { + client_id: clientId, + scope: 'projects pull_requests', + response_type: 'code', + }, + silent, + ); + // Exchange code with token + tokenBody = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/giteeToken', + params: { + clientId, + code, + oauth2RedirectUri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // grant_type=refresh_token&refresh_token={refresh_token} + tokenBody = (await networkSvc.request({ + method: 'POST', + url: 'https://gitee.com/oauth/token', + params: { + grant_type: 'refresh_token', + refresh_token: lastToken.refreshToken, + }, + })).body; + } + const accessToken = tokenBody.access_token; + // Call the user info endpoint + let user = null; + try { + user = (await networkSvc.request({ + method: 'GET', + url: 'https://gitee.com/api/v5/user', + params: { + access_token: accessToken, + }, + })).body; + } catch (err) { + if (err.status === 401) { + this.startOauth2(null, false, isMain, 1); + } + throw err; + } + if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } + userSvc.addUserInfo({ + id: `${subPrefix}:${user.login}`, + name: user.login, + imageUrl: user.avatar_url || '', + }); + + // 获取同一个用户的登录token + const existingToken = store.getters['data/giteeTokensBySub'][user.login]; + + // Build token object including sub 在token失效后刷新token 如果刷新失败则触发重新授权 + const token = { + accessToken, + // 主文档空间的登录 标识登录 + isLogin: !!isMain || (existingToken && !!existingToken.isLogin), + refreshToken: tokenBody.refresh_token, + expiresOn: Date.now() + (tokenBody.expires_in * 1000), + name: user.login, + sub: `${user.login}`, + }; + if (isMain) { + token.providerId = 'giteeAppData'; + // 检查 stackedit-app-data 仓库是否已经存在 如果不存在则创建该仓库 + await this.checkAndCreateRepo(token); + } + // Add token to gitee tokens + store.dispatch('data/addGiteeToken', token); + return token; + }, + // 刷新token + async refreshToken(token) { + const { sub } = token; + const lastToken = store.getters['data/giteeTokensBySub'][sub]; + // 兼容旧的没有过期时间 + if (!lastToken.expiresOn) { + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitee', + }); + return this.startOauth2(); + } + // lastToken is not expired + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { + return lastToken; + } + + // existing token is about to expire. + // Try to get a new token in background + try { + return await this.startOauth2(lastToken, true); + } catch (err) { + // If it fails try to popup a window + if (store.state.offline) { + throw err; + } + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitee', + }); + return this.startOauth2(); + } + }, + signin() { + return this.startOauth2(null, false, true); + }, + async addAccount() { + const token = await this.startOauth2(); + badgeSvc.addBadge('addGiteeAccount'); + return token; + }, + + /** + * https://developer.gitee.com/v3/repos/commits/#get-a-single-commit + * https://developer.gitee.com/v3/git/trees/#get-a-tree + */ + async getTree({ + token, + owner, + repo, + branch, + }) { + try { + const refreshedToken = await this.refreshToken(token); + const { commit } = await repoRequest(refreshedToken, owner, repo, { + url: `commits/${encodeURIComponent(branch)}`, + }); + const { tree, truncated } = await repoRequest(refreshedToken, owner, repo, { + url: `git/trees/${encodeURIComponent(commit.tree.sha)}?recursive=1`, + }); + if (truncated) { + throw new Error('Git tree too big. Please remove some files in the repository.'); + } + return tree; + } catch (err) { + if (err.status === 401) { + this.startOauth2(null, false, null, 1); + } + throw err; + } + }, + + async checkAndCreateRepo(token) { + const url = `https://gitee.com/api/v5/repos/${encodeURIComponent(token.name)}/${encodeURIComponent(appDataRepo)}`; + try { + await request(token, { url }); + } catch (err) { + // 不存在则创建 + if (err.status === 404) { + await request(token, { + method: 'POST', + url: 'https://gitee.com/api/v5/user/repos', + params: { + name: appDataRepo, + auto_init: true, + }, + }); + } else { + throw err; + } + } + }, + + /** + * https://developer.gitee.com/v3/repos/commits/#list-commits-on-a-repository + */ + async getCommits({ + token, + owner, + repo, + sha, + path, + }) { + const refreshedToken = await this.refreshToken(token); + return repoRequest(refreshedToken, owner, repo, { + url: 'commits', + params: { sha, path }, + }); + }, + + /** + * https://developer.gitee.com/v3/repos/contents/#create-a-file + * https://developer.gitee.com/v3/repos/contents/#update-a-file + */ + async uploadFile({ + token, + owner, + repo, + branch, + path, + content, + sha, + isImg, + commitMessage, + }) { + // 非法的文件名 不让提交 + if (!path || path.endsWith('undefined')) { + return new Promise((resolve) => { + resolve({ res: { content: { sha: null } } }); + }); + } + let uploadContent = content; + if (isImg && typeof content !== 'string') { + uploadContent = await utils.encodeFiletoBase64(content); + } + const refreshedToken = await this.refreshToken(token); + return repoRequest(refreshedToken, owner, repo, { + method: sha ? 'PUT' : 'POST', + url: `contents/${encodeURIComponent(path)}`, + body: { + message: commitMessage || getCommitMessage(sha ? 'updateFileMessage' : 'createFileMessage', path), + content: isImg ? uploadContent : utils.encodeBase64(content || ' '), + sha, + branch, + }, + }); + }, + + /** + * https://developer.gitee.com/v3/repos/contents/#delete-a-file + */ + async removeFile({ + token, + owner, + repo, + branch, + path, + sha, + }) { + const refreshedToken = await this.refreshToken(token); + return repoRequest(refreshedToken, owner, repo, { + method: 'DELETE', + url: `contents/${encodeURIComponent(path)}`, + body: { + message: getCommitMessage('deleteFileMessage', path), + sha, + branch, + }, + }); + }, + + /** + * https://developer.gitee.com/v3/repos/contents/#get-contents + */ + async downloadFile({ + token, + owner, + repo, + branch, + path, + isImg, + }) { + const refreshedToken = await this.refreshToken(token); + const { sha, content } = await repoRequest(refreshedToken, owner, repo, { + url: `contents/${encodeURIComponent(path)}`, + params: { ref: branch }, + }); + if (sha) { + const data = !isImg ? utils.decodeBase64(content) : content; + return { + sha, + data: data === ' ' ? '' : data, + }; + } + return {}; + }, + + /** + * https://gitee.com/api/v5/swagger#/postV5Gists + * https://gitee.com/api/v5/swagger#/patchV5GistsId + */ + async uploadGist({ + token, + description, + filename, + content, + isPublic, + gistId, + }) { + const { body } = await request(token, gistId ? { + method: 'PATCH', + url: `https://gitee.com/api/v5/gists/${gistId}`, + body: { + description, + files: { + [filename]: { + content, + }, + }, + }, + } : { + method: 'POST', + url: 'https://gitee.com/api/v5/gists', + body: { + description, + files: { + [filename]: { + content, + }, + }, + public: isPublic, + }, + }); + return body; + }, + + /** + * https://gitee.com/api/v5/swagger#/getV5Gists + */ + async downloadGist({ + token, + gistId, + filename, + }) { + const result = (await request(token, { + url: `https://api.github.com/gists/${gistId}`, + })).body.files[filename]; + if (!result) { + throw new Error('Gist file not found.'); + } + return result.content; + }, + + /** + * https://gitee.com/api/v5/swagger#/getV5GistsIdCommits + */ + async getGistCommits({ + token, + gistId, + }) { + const { body } = await request(token, { + url: `https://gitee.com/api/v5/gists/${gistId}/commits`, + }); + return body; + }, +}; diff --git a/src/services/providers/helpers/githubHelper.js b/src/services/providers/helpers/githubHelper.js new file mode 100644 index 0000000..f186870 --- /dev/null +++ b/src/services/providers/helpers/githubHelper.js @@ -0,0 +1,441 @@ +import utils from '../../utils'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; + +const getScopes = token => [token.repoFullAccess ? 'repo' : 'public_repo', 'gist']; + +const appDataRepo = 'stackedit-app-data'; + +const request = (token, options) => networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + Authorization: `token ${token.accessToken}`, + }, + params: { + ...options.params || {}, + t: Date.now(), // Prevent from caching + }, +}); + +const repoRequest = (token, owner, repo, options) => request(token, { + ...options, + url: `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${options.url}`, +}) + .then(res => res.body); + +const getCommitMessage = (name, path) => { + const message = store.getters['data/computedSettings'].git[name]; + return message.replace(/{{path}}/g, path); +}; + +/** + * Getting a user from its userId is not feasible with API v3. + * Using an undocumented endpoint... + */ +const subPrefix = 'gh'; +userSvc.setInfoResolver('github', subPrefix, async (sub) => { + try { + const user = (await networkSvc.request({ + url: `https://api.github.com/user/${sub}`, + params: { + t: Date.now(), // Prevent from caching + }, + })).body; + + return { + id: `${subPrefix}:${user.id}`, + name: user.login, + imageUrl: user.avatar_url || '', + }; + } catch (err) { + if (err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + + /** + * https://developer.github.com/apps/building-oauth-apps/authorization-options-for-oauth-apps/ + */ + async startOauth2(scopes, sub = null, silent = false, isMain) { + await networkSvc.getServerConf(); + const clientId = store.getters['data/serverConf'].githubClientId; + + // Get an OAuth2 code + const { code } = await networkSvc.startOauth2( + 'https://github.com/login/oauth/authorize', + { + client_id: clientId, + scope: scopes.join(' '), + }, + silent, + ); + + // Exchange code with token + const accessToken = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/githubToken', + params: { + clientId, + code, + }, + })).body; + + // Call the user info endpoint + const user = (await networkSvc.request({ + method: 'GET', + url: 'https://api.github.com/user', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + })).body; + userSvc.addUserInfo({ + id: `${subPrefix}:${user.id}`, + name: user.login, + imageUrl: user.avatar_url || '', + }); + + // Check the returned sub consistency + if (sub && `${user.id}` !== sub) { + throw new Error('GitHub account ID not expected.'); + } + + const oldToken = store.getters['data/githubTokensBySub'][user.id]; + // Build token object including scopes and sub + const token = { + scopes, + accessToken, + // 主文档空间的登录 标识登录 + isLogin: !!isMain || (oldToken && !!oldToken.isLogin), + name: user.login, + sub: `${user.id}`, + imgStorages: oldToken && oldToken.imgStorages, + repoFullAccess: scopes.includes('repo'), + }; + + if (isMain) { + token.providerId = 'githubAppData'; + // check stackedit-app-data repo exist? + await this.checkAndCreateRepo(token); + } + // Add token to github tokens + store.dispatch('data/addGithubToken', token); + return token; + }, + signin() { + return this.startOauth2(['repo', 'gist'], null, false, true); + }, + async addAccount(repoFullAccess = false) { + const token = await this.startOauth2(getScopes({ repoFullAccess })); + badgeSvc.addBadge('addGitHubAccount'); + return token; + }, + + /** + * https://developer.github.com/v3/repos/commits/#get-a-single-commit + * https://developer.github.com/v3/git/trees/#get-a-tree + */ + async getTree({ + token, + owner, + repo, + branch, + }) { + const { commit } = await repoRequest(token, owner, repo, { + url: `commits/${encodeURIComponent(branch)}`, + }); + const { tree, truncated } = await repoRequest(token, owner, repo, { + url: `git/trees/${encodeURIComponent(commit.tree.sha)}?recursive=1`, + }); + if (truncated) { + throw new Error('Git tree too big. Please remove some files in the repository.'); + } + return tree; + }, + + async checkAndCreateRepo(token) { + const url = `https://api.github.com/repos/${encodeURIComponent(token.name)}/${encodeURIComponent(appDataRepo)}`; + try { + await request(token, { url }); + } catch (err) { + // create + if (err.status === 404) { + await request(token, { + method: 'POST', + url: 'https://api.github.com/repos/mafgwo/stackedit-appdata-template/generate', + body: { + owner: token.name, + name: appDataRepo, + description: 'StackEdit中文版默认空间.', + include_all_branches: false, + private: true, + }, + }); + } else { + throw err; + } + } + }, + + /** + * https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + */ + async getCommits({ + token, + owner, + repo, + sha, + path, + tryTimes, + }) { + let tryCount = tryTimes || 1; + try { + return repoRequest(token, owner, repo, { + url: 'commits', + params: { sha, path }, + }); + } catch (err) { + // 主文档 并且 409 则重试3次 + if (tryCount <= 3 && err.status === 409 && repo === appDataRepo) { + tryCount += 1; + return this.getCommits({ + token, + owner, + repo, + sha, + path, + tryTimes: tryCount, + }); + } + throw err; + } + }, + + /** + * https://developer.github.com/v3/repos/contents/#create-a-file + * https://developer.github.com/v3/repos/contents/#update-a-file + */ + async uploadFile({ + token, + owner, + repo, + branch, + path, + content, + sha, + isImg, + commitMessage, + }) { + // 非法的文件名 不让提交 + if (!path || path.endsWith('undefined')) { + return new Promise((resolve) => { + resolve({ res: { content: { sha: null } } }); + }); + } + let uploadContent = content; + if (isImg && typeof content !== 'string') { + uploadContent = await utils.encodeFiletoBase64(content); + } + return repoRequest(token, owner, repo, { + method: 'PUT', + url: `contents/${encodeURIComponent(path)}`, + body: { + message: commitMessage || getCommitMessage(sha ? 'updateFileMessage' : 'createFileMessage', path), + content: isImg ? uploadContent : utils.encodeBase64(content), + sha, + branch, + }, + }); + }, + + /** + * https://developer.github.com/v3/repos/contents/#delete-a-file + */ + async removeFile({ + token, + owner, + repo, + branch, + path, + sha, + }) { + return repoRequest(token, owner, repo, { + method: 'DELETE', + url: `contents/${encodeURIComponent(path)}`, + body: { + message: getCommitMessage('deleteFileMessage', path), + sha, + branch, + }, + }); + }, + + /** + * https://developer.github.com/v3/repos/contents/#get-contents + */ + async downloadFile({ + token, + owner, + repo, + branch, + path, + isImg, + }) { + try { + const { sha, content, encoding } = await repoRequest(token, owner, repo, { + url: `contents/${encodeURIComponent(path)}`, + params: { ref: branch }, + }); + let tempContent = content; + // 如果是图片且 encoding 为 none 则 需要获取 blob + if (isImg && encoding === 'none') { + const blobInfo = await repoRequest(token, owner, repo, { + url: `git/blobs/${sha}`, + }); + tempContent = blobInfo.content; + } + return { + sha, + data: !isImg ? utils.decodeBase64(tempContent) : tempContent, + }; + } catch (err) { + // not .stackedit-data throw err + if (err.status === 404 && path.indexOf('.stackedit-data') >= 0) { + return {}; + } + throw err; + } + }, + /** + * 获取仓库信息 + */ + async getRepoInfo(token, owner, repo) { + return request(token, { + url: `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`, + }).then(res => res.body); + }, + async updateToken(token, imgStorageInfo) { + const imgStorages = token.imgStorages || []; + // 存储仓库唯一标识 + const sid = utils.hash(`${imgStorageInfo.owner}${imgStorageInfo.repo}${imgStorageInfo.path}${imgStorageInfo.branch}`); + // 查询是否存在 存在则更新 + const filterStorages = imgStorages.filter(it => it.sid === sid); + if (filterStorages && filterStorages.length > 0) { + filterStorages.owner = imgStorageInfo.owner; + filterStorages.repo = imgStorageInfo.repo; + filterStorages.path = imgStorageInfo.path; + filterStorages.branch = imgStorageInfo.branch; + } else { + imgStorages.push({ + sid, + owner: imgStorageInfo.owner, + repo: imgStorageInfo.repo, + path: imgStorageInfo.path, + branch: imgStorageInfo.branch, + }); + token.imgStorages = imgStorages; + } + store.dispatch('data/addGithubToken', token); + }, + async removeTokenImgStorage(token, sid) { + if (!token.imgStorages || token.imgStorages.length === 0) { + return; + } + token.imgStorages = token.imgStorages.filter(it => it.sid !== sid); + store.dispatch('data/addGithubToken', token); + }, + + /** + * https://developer.github.com/v3/gists/#create-a-gist + * https://developer.github.com/v3/gists/#edit-a-gist + */ + async uploadGist({ + token, + description, + filename, + content, + isPublic, + gistId, + }) { + const { body } = await request(token, gistId ? { + method: 'PATCH', + url: `https://api.github.com/gists/${gistId}`, + body: { + description, + files: { + [filename]: { + content, + }, + }, + }, + } : { + method: 'POST', + url: 'https://api.github.com/gists', + body: { + description, + files: { + [filename]: { + content, + }, + }, + public: isPublic, + }, + }); + return body; + }, + + /** + * https://developer.github.com/v3/gists/#get-a-single-gist + */ + async downloadGist({ + token, + gistId, + filename, + }) { + const result = (await request(token, { + url: `https://api.github.com/gists/${gistId}`, + })).body.files[filename]; + if (!result) { + throw new Error('Gist file not found.'); + } + return result.content; + }, + + /** + * https://developer.github.com/v3/gists/#list-gist-commits + */ + async getGistCommits({ + token, + gistId, + }) { + const { body } = await request(token, { + url: `https://api.github.com/gists/${gistId}/commits`, + }); + return body; + }, + + /** + * https://developer.github.com/v3/gists/#get-a-specific-revision-of-a-gist + */ + async downloadGistRevision({ + token, + gistId, + filename, + sha, + }) { + const result = (await request(token, { + url: `https://api.github.com/gists/${gistId}/${sha}`, + })).body.files[filename]; + if (!result) { + throw new Error('Gist file not found.'); + } + return result.content; + }, +}; diff --git a/src/services/providers/helpers/gitlabHelper.js b/src/services/providers/helpers/gitlabHelper.js new file mode 100644 index 0000000..c8725d3 --- /dev/null +++ b/src/services/providers/helpers/gitlabHelper.js @@ -0,0 +1,347 @@ +import utils from '../../utils'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; +import constants from '../../../data/constants'; + +const tokenExpirationMargin = 5 * 60 * 1000; + +const request = ({ accessToken, serverUrl }, options) => networkSvc.request({ + ...options, + url: `${serverUrl}/api/v4/${options.url}`, + headers: { + ...options.headers || {}, + Authorization: `Bearer ${accessToken}`, + }, +}) + .then(res => res.body); + +const getCommitMessage = (name, path) => { + const message = store.getters['data/computedSettings'].git[name]; + return message.replace(/{{path}}/g, path); +}; + +/** + * https://docs.gitlab.com/ee/api/users.html#for-user + */ +const subPrefix = 'gl'; +userSvc.setInfoResolver('gitlab', subPrefix, async (sub) => { + try { + const [, serverUrl, id] = sub.match(/^(.+)\/([^/]+)$/); + const user = (await networkSvc.request({ + url: `${serverUrl}/api/v4/users/${id}`, + })).body; + const uniqueSub = `${serverUrl}/${user.id}`; + + return { + id: `${subPrefix}:${uniqueSub}`, + name: user.username, + imageUrl: user.avatar_url || '', + }; + } catch (err) { + if (err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + + /** + * https://docs.gitlab.com/ee/api/oauth2.html + */ + async startOauth2( + serverUrl, applicationId, applicationSecret, + sub = null, silent = false, refreshToken, + ) { + let apiUrl = serverUrl; + let clientId = applicationId; + let useServerConf = false; + // 获取gitlab配置的参数 + await networkSvc.getServerConf(); + const confClientId = store.getters['data/serverConf'].gitlabClientId; + const confServerUrl = store.getters['data/serverConf'].gitlabUrl; + // 存在gitlab配置则使用后端配置 + if (confClientId && confServerUrl) { + apiUrl = confServerUrl; + clientId = confClientId; + useServerConf = true; + } + let tokenBody; + if (!silent) { + // Get an OAuth2 code + const { code } = await networkSvc.startOauth2( + `${apiUrl}/oauth/authorize`, + { + client_id: clientId, + response_type: 'code', + redirect_uri: constants.oauth2RedirectUri, + }, + silent, + ); + if (useServerConf) { + tokenBody = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/gitlabToken', + params: { + code, + grant_type: 'authorization_code', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // Exchange code with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${apiUrl}/oauth/token`, + params: { + client_id: clientId, + client_secret: applicationSecret, + code, + grant_type: 'authorization_code', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } + } else if (useServerConf) { + tokenBody = (await networkSvc.request({ + method: 'GET', + url: 'oauth2/gitlabToken', + params: { + refresh_token: refreshToken, + grant_type: 'refresh_token', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // Exchange refreshToken with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${apiUrl}/oauth/token`, + body: { + client_id: clientId, + client_secret: applicationSecret, + refresh_token: refreshToken, + grant_type: 'refresh_token', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } + + const accessToken = tokenBody.access_token; + // Call the user info endpoint + const user = await request({ accessToken, serverUrl: apiUrl }, { + url: 'user', + }); + const uniqueSub = `${apiUrl}/${user.id}`; + userSvc.addUserInfo({ + id: `${subPrefix}:${uniqueSub}`, + name: user.username, + imageUrl: user.avatar_url || '', + }); + + // Check the returned sub consistency + if (sub && uniqueSub !== sub) { + throw new Error('GitLab account ID not expected.'); + } + + const oldToken = store.getters['data/gitlabTokensBySub'][uniqueSub]; + // Build token object including scopes and sub + const token = { + accessToken, + name: user.username, + applicationId: clientId, + applicationSecret, + imgStorages: oldToken && oldToken.imgStorages, + refreshToken: tokenBody.refresh_token, + expiresOn: Date.now() + ((tokenBody.expires_in || 7200) * 1000), + serverUrl: apiUrl, + sub: uniqueSub, + }; + + // Add token to gitlab tokens + store.dispatch('data/addGitlabToken', token); + return token; + }, + async addAccount(serverUrl, applicationId, applicationSecret, sub = null) { + const token = await this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + badgeSvc.addBadge('addGitLabAccount'); + return token; + }, + // 刷新token + async refreshToken(token) { + const { + serverUrl, + applicationId, + applicationSecret, + sub, + } = token; + const lastToken = store.getters['data/gitlabTokensBySub'][sub]; + // 兼容旧的没有过期时间 + if (!lastToken.expiresOn || !lastToken.refreshToken) { + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitlab', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + // lastToken is not expired + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { + return lastToken; + } + + // existing token is about to expire. + // Try to get a new token in background + try { + return await this.startOauth2( + serverUrl, applicationId, applicationSecret, + sub, true, lastToken.refreshToken, + ); + } catch (err) { + // If it fails try to popup a window + if (store.state.offline) { + throw err; + } + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitlab', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + }, + // 带刷新token + async requestWithRefreshToken(token, options) { + const refreshedToken = await this.refreshToken(token); + const result = await request(refreshedToken, options); + return result; + }, + /** + * https://docs.gitlab.com/ee/api/projects.html#get-single-project + */ + async getProjectId(token, { projectPath, projectId }) { + if (projectId) { + return projectId; + } + const project = await this.requestWithRefreshToken(token, { + url: `projects/${encodeURIComponent(projectPath)}`, + }); + return project.id; + }, + + /** + * https://docs.gitlab.com/ee/api/repositories.html#list-repository-tree + */ + async getTree({ + token, + projectId, + branch, + }) { + return this.requestWithRefreshToken(token, { + url: `projects/${encodeURIComponent(projectId)}/repository/tree`, + params: { + ref: branch, + recursive: true, + per_page: 9999, + }, + }); + }, + + /** + * https://docs.gitlab.com/ee/api/commits.html#list-repository-commits + */ + async getCommits({ + token, + projectId, + branch, + path, + }) { + return this.requestWithRefreshToken(token, { + url: `projects/${encodeURIComponent(projectId)}/repository/commits`, + params: { + ref_name: branch, + path, + }, + }); + }, + + /** + * https://docs.gitlab.com/ee/api/repository_files.html#create-new-file-in-repository + * https://docs.gitlab.com/ee/api/repository_files.html#update-existing-file-in-repository + */ + async uploadFile({ + token, + projectId, + branch, + path, + content, + sha, + isImg, + commitMessage, + }) { + // 非法的文件名 不让提交 + if (!path || path.endsWith('undefined')) { + return new Promise((resolve) => { + resolve({ res: { content: { sha: null } } }); + }); + } + let uploadContent = content; + if (isImg && typeof content !== 'string') { + uploadContent = await utils.encodeFiletoBase64(content); + } + return this.requestWithRefreshToken(token, { + method: sha ? 'PUT' : 'POST', + url: `projects/${encodeURIComponent(projectId)}/repository/files/${encodeURIComponent(path)}`, + body: { + commit_message: commitMessage || getCommitMessage(sha ? 'updateFileMessage' : 'createFileMessage', path), + encoding: 'base64', + content: isImg ? uploadContent : utils.encodeBase64(content), + last_commit_id: sha, + branch, + }, + }); + }, + + /** + * https://docs.gitlab.com/ee/api/repository_files.html#delete-existing-file-in-repository + */ + async removeFile({ + token, + projectId, + branch, + path, + sha, + }) { + return this.requestWithRefreshToken(token, { + method: 'DELETE', + url: `projects/${encodeURIComponent(projectId)}/repository/files/${encodeURIComponent(path)}`, + body: { + commit_message: getCommitMessage('deleteFileMessage', path), + last_commit_id: sha, + branch, + }, + }); + }, + + /** + * https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository + */ + async downloadFile({ + token, + projectId, + branch, + path, + isImg, + }) { + const res = await this.requestWithRefreshToken(token, { + url: `projects/${encodeURIComponent(projectId)}/repository/files/${encodeURIComponent(path)}`, + params: { ref: branch }, + }); + return { + sha: res.last_commit_id, + data: !isImg ? utils.decodeBase64(res.content) : res.content, + }; + }, +}; diff --git a/src/services/providers/helpers/googleHelper.js b/src/services/providers/helpers/googleHelper.js new file mode 100644 index 0000000..f9a8037 --- /dev/null +++ b/src/services/providers/helpers/googleHelper.js @@ -0,0 +1,701 @@ +import utils from '../../utils'; +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; + +const appsDomain = null; +const tokenExpirationMargin = 5 * 60 * 1000; // 5 min (tokens expire after 1h) + +const driveAppDataScopes = ['https://www.googleapis.com/auth/drive.appdata']; +const getDriveScopes = token => [token.driveFullAccess + ? 'https://www.googleapis.com/auth/drive' + : 'https://www.googleapis.com/auth/drive.file']; +const bloggerScopes = ['https://www.googleapis.com/auth/blogger']; +const photosScopes = ['https://www.googleapis.com/auth/photos']; + +const checkIdToken = (idToken) => { + try { + const token = idToken.split('.'); + const payload = JSON.parse(utils.decodeBase64(token[1])); + const clientId = store.getters['data/serverConf'].googleClientId; + return payload.aud === clientId && Date.now() + tokenExpirationMargin < payload.exp * 1000; + } catch (e) { + return false; + } +}; + +let driveState; +if (utils.queryParams.providerId === 'googleDrive') { + try { + driveState = JSON.parse(utils.queryParams.state); + } catch (e) { + // Ignore + } +} + +/** + * https://developers.google.com/people/api/rest/v1/people/get + */ +const getUser = async (sub, token) => { + const apiKey = store.getters['data/serverConf'].googleApiKey; + const url = `https://people.googleapis.com/v1/people/${sub}?personFields=names,photos&key=${apiKey}`; + const { body } = await networkSvc.request(sub === 'me' && token + ? { + method: 'GET', + url, + headers: { + Authorization: `Bearer ${token.accessToken}`, + }, + } + : { + method: 'GET', + url, + }, true); + return body; +}; + +const subPrefix = 'go'; +userSvc.setInfoResolver('google', subPrefix, async (sub) => { + try { + const googleToken = Object.values(store.getters['data/googleTokensBySub'])[0]; + const body = await getUser(sub, googleToken); + const name = (body.names && body.names[0]) || {}; + const photo = (body.photos && body.photos[0]) || {}; + return { + id: `${subPrefix}:${sub}`, + name: name.displayName, + imageUrl: (photo.url || '').replace(/\bsz?=\d+$/, 'sz=40'), + }; + } catch (err) { + if (err.status !== 404) { + throw new Error('RETRY'); + } + throw err; + } +}); + +export default { + subPrefix, + folderMimeType: 'application/vnd.google-apps.folder', + driveState, + driveActionFolder: null, + driveActionFiles: [], + async $request(token, options) { + try { + return (await networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + Authorization: `Bearer ${token.accessToken}`, + }, + }, true)).body; + } catch (err) { + const { reason } = (((err.body || {}).error || {}).errors || [])[0] || {}; + if (reason === 'authError') { + // Mark the token as revoked and get a new one + store.dispatch('data/addGoogleToken', { + ...token, + expiresOn: 0, + }); + // Refresh token and retry + const refreshedToken = await this.refreshToken(token, token.scopes); + return this.$request(refreshedToken, options); + } + throw err; + } + }, + + /** + * https://developers.google.com/identity/protocols/OpenIDConnect + */ + async startOauth2(scopes, sub = null, silent = false) { + await networkSvc.getServerConf(); + const clientId = store.getters['data/serverConf'].googleClientId; + + // Get an OAuth2 code + const { accessToken, expiresIn, idToken } = await networkSvc.startOauth2( + 'https://accounts.google.com/o/oauth2/v2/auth', + { + client_id: clientId, + response_type: 'token id_token', + scope: ['openid', 'profile', ...scopes].join(' '), + hd: appsDomain, + login_hint: sub, + prompt: silent ? 'none' : null, + nonce: utils.uid(), + }, + silent, + ); + + // Call the token info endpoint + const { body } = await networkSvc.request({ + method: 'POST', + url: 'https://www.googleapis.com/oauth2/v3/tokeninfo', + params: { + access_token: accessToken, + }, + }, true); + + // Check the returned client ID consistency + if (body.aud !== clientId) { + throw new Error('Client ID inconsistent.'); + } + // Check the returned sub consistency + if (sub && `${body.sub}` !== sub) { + throw new Error('Google account ID not expected.'); + } + + // Build token object including scopes and sub + const existingToken = store.getters['data/googleTokensBySub'][body.sub]; + const token = { + scopes, + accessToken, + expiresOn: Date.now() + (expiresIn * 1000), + idToken, + sub: body.sub, + name: (existingToken || {}).name || 'Someone', + isLogin: !store.getters['workspace/mainWorkspaceToken'] && + scopes.includes('https://www.googleapis.com/auth/drive.appdata'), + isSponsor: false, + isDrive: scopes.includes('https://www.googleapis.com/auth/drive') || + scopes.includes('https://www.googleapis.com/auth/drive.file'), + isBlogger: scopes.includes('https://www.googleapis.com/auth/blogger'), + isPhotos: scopes.includes('https://www.googleapis.com/auth/photos'), + driveFullAccess: scopes.includes('https://www.googleapis.com/auth/drive'), + }; + + // Call the user info endpoint + const user = await getUser('me', token); + const userId = user.resourceName.split('/')[1]; + const name = user.names[0] || {}; + const photo = user.photos[0] || {}; + if (name.displayName) { + token.name = name.displayName; + } + userSvc.addUserInfo({ + id: `${subPrefix}:${userId}`, + name: name.displayName, + imageUrl: (photo.url || '').replace(/\bsz?=\d+$/, 'sz=40'), + }); + + if (existingToken) { + // We probably retrieved a new token with restricted scopes. + // That's no problem, token will be refreshed later with merged scopes. + // Restore flags + Object.assign(token, { + isLogin: existingToken.isLogin || token.isLogin, + isSponsor: existingToken.isSponsor, + isDrive: existingToken.isDrive || token.isDrive, + isBlogger: existingToken.isBlogger || token.isBlogger, + isPhotos: existingToken.isPhotos || token.isPhotos, + driveFullAccess: existingToken.driveFullAccess || token.driveFullAccess, + }); + } + + if (token.isLogin) { + try { + const res = await networkSvc.request({ + method: 'GET', + url: 'userInfo', + params: { + idToken: token.idToken, + }, + }); + token.isSponsor = res.body.sponsorUntil > Date.now(); + if (token.isSponsor) { + badgeSvc.addBadge('sponsor'); + } + } catch (err) { + // Ignore + } + } + + // Add token to google tokens + await store.dispatch('data/addGoogleToken', token); + return token; + }, + async refreshToken(token, scopes = []) { + const { sub } = token; + const lastToken = store.getters['data/googleTokensBySub'][sub]; + const mergedScopes = [...new Set([ + ...scopes, + ...lastToken.scopes, + ])]; + + if ( + // If we already have permissions for the requested scopes + mergedScopes.length === lastToken.scopes.length && + // And lastToken is not expired + lastToken.expiresOn > Date.now() + tokenExpirationMargin && + // And in case of a login token, ID token is still valid + (!lastToken.isLogin || checkIdToken(lastToken.idToken)) + ) { + return lastToken; + } + + // New scopes are requested or existing token is about to expire. + // Try to get a new token in background + try { + return await this.startOauth2(mergedScopes, sub, true); + } catch (err) { + // If it fails try to popup a window + if (store.state.offline) { + throw err; + } + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Google', + }); + return this.startOauth2(mergedScopes, sub); + } + }, + signin() { + return this.startOauth2(driveAppDataScopes); + }, + async addDriveAccount(fullAccess = false, sub = null) { + const token = await this.startOauth2(getDriveScopes({ driveFullAccess: fullAccess }), sub); + badgeSvc.addBadge('addGoogleDriveAccount'); + return token; + }, + async addBloggerAccount() { + const token = await this.startOauth2(bloggerScopes); + badgeSvc.addBadge('addBloggerAccount'); + return token; + }, + async addPhotosAccount() { + const token = await this.startOauth2(photosScopes); + badgeSvc.addBadge('addGooglePhotosAccount'); + return token; + }, + + /** + * https://developers.google.com/drive/v3/reference/files/create + * https://developers.google.com/drive/v3/reference/files/update + * https://developers.google.com/drive/v3/web/simple-upload + */ + async $uploadFile({ + refreshedToken, + name, + parents, + appProperties, + media = null, + mediaType = null, + fileId = null, + oldParents = null, + ifNotTooLate = cb => cb(), + }) { + // Refreshing a token can take a while if an oauth window pops up, make sure it's not too late + return ifNotTooLate(() => { + const options = { + method: 'POST', + url: 'https://www.googleapis.com/drive/v3/files', + }; + const params = { + supportsTeamDrives: true, + }; + const metadata = { name, appProperties }; + if (fileId) { + options.method = 'PATCH'; + options.url = `https://www.googleapis.com/drive/v3/files/${fileId}`; + if (parents && oldParents) { + params.addParents = parents + .filter(parent => !oldParents.includes(parent)) + .join(','); + params.removeParents = oldParents + .filter(parent => !parents.includes(parent)) + .join(','); + } + } else if (parents) { + metadata.parents = parents; + } + if (media) { + const boundary = `-------${utils.uid()}`; + const delimiter = `\r\n--${boundary}\r\n`; + const closeDelimiter = `\r\n--${boundary}--`; + let multipartRequestBody = ''; + multipartRequestBody += delimiter; + multipartRequestBody += 'Content-Type: application/json; charset=UTF-8\r\n\r\n'; + multipartRequestBody += JSON.stringify(metadata); + multipartRequestBody += delimiter; + multipartRequestBody += `Content-Type: ${mediaType || 'text/plain'}; charset=UTF-8\r\n\r\n`; + multipartRequestBody += media; + multipartRequestBody += closeDelimiter; + options.url = options.url.replace( + 'https://www.googleapis.com/', + 'https://www.googleapis.com/upload/', + ); + return this.$request(refreshedToken, { + ...options, + params: { + ...params, + uploadType: 'multipart', + }, + headers: { + 'Content-Type': `multipart/mixed; boundary="${boundary}"`, + }, + body: multipartRequestBody, + }); + } + if (mediaType) { + metadata.mimeType = mediaType; + } + return this.$request(refreshedToken, { + ...options, + body: metadata, + params, + }); + }); + }, + async uploadFile({ + token, + name, + parents, + appProperties, + media, + mediaType, + fileId, + oldParents, + ifNotTooLate, + }) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$uploadFile({ + refreshedToken, + name, + parents, + appProperties, + media, + mediaType, + fileId, + oldParents, + ifNotTooLate, + }); + }, + async uploadAppDataFile({ + token, + name, + media, + fileId, + ifNotTooLate, + }) { + const refreshedToken = await this.refreshToken(token, driveAppDataScopes); + return this.$uploadFile({ + refreshedToken, + name, + parents: ['appDataFolder'], + media, + fileId, + ifNotTooLate, + }); + }, + + /** + * https://developers.google.com/drive/v3/reference/files/get + */ + async getFile(token, id) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$request(refreshedToken, { + method: 'GET', + url: `https://www.googleapis.com/drive/v3/files/${id}`, + params: { + fields: 'id,name,mimeType,appProperties,teamDriveId', + supportsTeamDrives: true, + }, + }); + }, + + /** + * https://developers.google.com/drive/v3/web/manage-downloads + */ + async $downloadFile(refreshedToken, id) { + return this.$request(refreshedToken, { + method: 'GET', + url: `https://www.googleapis.com/drive/v3/files/${id}?alt=media`, + raw: true, + }); + }, + async downloadFile(token, id) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$downloadFile(refreshedToken, id); + }, + async downloadAppDataFile(token, id) { + const refreshedToken = await this.refreshToken(token, driveAppDataScopes); + return this.$downloadFile(refreshedToken, id); + }, + + /** + * https://developers.google.com/drive/v3/reference/files/delete + */ + async $removeFile(refreshedToken, id, ifNotTooLate = cb => cb()) { + // Refreshing a token can take a while if an oauth window pops up, so check if it's too late + return ifNotTooLate(() => this.$request(refreshedToken, { + method: 'DELETE', + url: `https://www.googleapis.com/drive/v3/files/${id}`, + params: { + supportsTeamDrives: true, + }, + })); + }, + async removeFile(token, id, ifNotTooLate) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$removeFile(refreshedToken, id, ifNotTooLate); + }, + async removeAppDataFile(token, id, ifNotTooLate = cb => cb()) { + const refreshedToken = await this.refreshToken(token, driveAppDataScopes); + return this.$removeFile(refreshedToken, id, ifNotTooLate); + }, + + /** + * https://developers.google.com/drive/v3/reference/revisions/list + */ + async $getFileRevisions(refreshedToken, id) { + const allRevisions = []; + const getPage = async (pageToken) => { + const { revisions, nextPageToken } = await this.$request(refreshedToken, { + method: 'GET', + url: `https://www.googleapis.com/drive/v3/files/${id}/revisions`, + params: { + pageToken, + pageSize: 1000, + fields: 'nextPageToken,revisions(id,modifiedTime,lastModifyingUser/permissionId,lastModifyingUser/displayName,lastModifyingUser/photoLink)', + }, + }); + revisions.forEach((revision) => { + userSvc.addUserInfo({ + id: `${subPrefix}:${revision.lastModifyingUser.permissionId}`, + name: revision.lastModifyingUser.displayName, + imageUrl: revision.lastModifyingUser.photoLink || '', + }); + allRevisions.push(revision); + }); + if (nextPageToken) { + return getPage(nextPageToken); + } + return allRevisions; + }; + return getPage(); + }, + async getFileRevisions(token, id) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$getFileRevisions(refreshedToken, id); + }, + async getAppDataFileRevisions(token, id) { + const refreshedToken = await this.refreshToken(token, driveAppDataScopes); + return this.$getFileRevisions(refreshedToken, id); + }, + + /** + * https://developers.google.com/drive/v3/reference/revisions/get + */ + async $downloadFileRevision(refreshedToken, id, revisionId) { + return this.$request(refreshedToken, { + method: 'GET', + url: `https://www.googleapis.com/drive/v3/files/${id}/revisions/${revisionId}?alt=media`, + raw: true, + }); + }, + async downloadFileRevision(token, fileId, revisionId) { + const refreshedToken = await this.refreshToken(token, getDriveScopes(token)); + return this.$downloadFileRevision(refreshedToken, fileId, revisionId); + }, + async downloadAppDataFileRevision(token, fileId, revisionId) { + const refreshedToken = await this.refreshToken(token, driveAppDataScopes); + return this.$downloadFileRevision(refreshedToken, fileId, revisionId); + }, + + /** + * https://developers.google.com/drive/v3/reference/changes/list + */ + async getChanges(token, startPageToken, isAppData, teamDriveId = null) { + const result = { + changes: [], + }; + let fileFields = 'file/name'; + if (!isAppData) { + fileFields += ',file/parents,file/mimeType,file/appProperties'; + } + const refreshedToken = await this.refreshToken( + token, + isAppData ? driveAppDataScopes : getDriveScopes(token), + ); + + const getPage = async (pageToken = '1') => { + const { changes, nextPageToken, newStartPageToken } = await this.$request(refreshedToken, { + method: 'GET', + url: 'https://www.googleapis.com/drive/v3/changes', + params: { + pageToken, + spaces: isAppData ? 'appDataFolder' : 'drive', + pageSize: 1000, + fields: `nextPageToken,newStartPageToken,changes(fileId,${fileFields})`, + supportsTeamDrives: true, + includeTeamDriveItems: !!teamDriveId, + teamDriveId, + }, + }); + result.changes = [...result.changes, ...changes.filter(item => item.fileId)]; + if (nextPageToken) { + return getPage(nextPageToken); + } + result.startPageToken = newStartPageToken; + return result; + }; + return getPage(startPageToken); + }, + + /** + * https://developers.google.com/blogger/docs/3.0/reference/blogs/getByUrl + * https://developers.google.com/blogger/docs/3.0/reference/posts/insert + * https://developers.google.com/blogger/docs/3.0/reference/posts/update + */ + async uploadBlogger({ + token, + blogUrl, + blogId, + postId, + title, + content, + labels, + isDraft, + published, + isPage, + }) { + const refreshedToken = await this.refreshToken(token, bloggerScopes); + + // Get the blog ID + const blog = { id: blogId }; + if (!blog.id) { + blog.id = (await this.$request(refreshedToken, { + url: 'https://www.googleapis.com/blogger/v3/blogs/byurl', + params: { + url: blogUrl, + }, + })).id; + } + + // Create/update the post/page + const path = isPage ? 'pages' : 'posts'; + let options = { + method: 'POST', + url: `https://www.googleapis.com/blogger/v3/blogs/${blog.id}/${path}/`, + body: { + kind: isPage ? 'blogger#page' : 'blogger#post', + blog, + title, + content, + }, + }; + if (labels) { + options.body.labels = labels; + } + if (published) { + options.body.published = published.toISOString(); + } + // If it's an update + if (postId) { + options.method = 'PUT'; + options.url += postId; + options.body.id = postId; + } + const post = await this.$request(refreshedToken, options); + if (isPage) { + return post; + } + + // Revert/publish post + options = { + method: 'POST', + url: `https://www.googleapis.com/blogger/v3/blogs/${post.blog.id}/posts/${post.id}/`, + params: {}, + }; + if (isDraft) { + options.url += 'revert'; + } else { + options.url += 'publish'; + if (published) { + options.params.publishDate = published.toISOString(); + } + } + return this.$request(refreshedToken, options); + }, + + /** + * https://developers.google.com/picker/docs/ + */ + async openPicker(token, type = 'doc') { + const scopes = type === 'img' ? photosScopes : getDriveScopes(token); + if (!window.google) { + await networkSvc.loadScript('https://apis.google.com/js/api.js'); + await new Promise((resolve, reject) => window.gapi.load('picker', { + callback: resolve, + onerror: reject, + timeout: 30000, + ontimeout: reject, + })); + } + const refreshedToken = await this.refreshToken(token, scopes); + const { google } = window; + return new Promise((resolve) => { + let picker; + const pickerBuilder = new google.picker.PickerBuilder() + .setOAuthToken(refreshedToken.accessToken) + .enableFeature(google.picker.Feature.SUPPORT_TEAM_DRIVES) + .hideTitleBar() + .setCallback((data) => { + switch (data[google.picker.Response.ACTION]) { + case google.picker.Action.PICKED: + case google.picker.Action.CANCEL: + resolve(data.docs || []); + picker.dispose(); + break; + default: + } + }); + switch (type) { + default: + case 'doc': { + const mimeTypes = [ + 'text/plain', + 'text/x-markdown', + 'application/octet-stream', + ].join(','); + + const view = new google.picker.DocsView(google.picker.ViewId.DOCS); + view.setMimeTypes(mimeTypes); + pickerBuilder.addView(view); + + const teamDriveView = new google.picker.DocsView(google.picker.ViewId.DOCS); + teamDriveView.setMimeTypes(mimeTypes); + teamDriveView.setEnableTeamDrives(true); + pickerBuilder.addView(teamDriveView); + + pickerBuilder.enableFeature(google.picker.Feature.MULTISELECT_ENABLED); + pickerBuilder.enableFeature(google.picker.Feature.SUPPORT_TEAM_DRIVES); + break; + } + case 'folder': { + const folderView = new google.picker.DocsView(google.picker.ViewId.FOLDERS); + folderView.setSelectFolderEnabled(true); + folderView.setMimeTypes(this.folderMimeType); + pickerBuilder.addView(folderView); + + const teamDriveView = new google.picker.DocsView(google.picker.ViewId.FOLDERS); + teamDriveView.setSelectFolderEnabled(true); + teamDriveView.setEnableTeamDrives(true); + teamDriveView.setMimeTypes(this.folderMimeType); + pickerBuilder.addView(teamDriveView); + break; + } + case 'img': { + const view = new google.picker.PhotosView(); + view.setType('highlights'); + pickerBuilder.addView(view); + pickerBuilder.addView(google.picker.ViewId.PHOTO_UPLOAD); + break; + } + } + picker = pickerBuilder.build(); + picker.setVisible(true); + }); + }, +}; diff --git a/src/services/providers/helpers/smmsHelper.js b/src/services/providers/helpers/smmsHelper.js new file mode 100644 index 0000000..7de6bc8 --- /dev/null +++ b/src/services/providers/helpers/smmsHelper.js @@ -0,0 +1,76 @@ +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import userSvc from '../../userSvc'; +import badgeSvc from '../../badgeSvc'; + +/** + * https://doc.sm.ms/#api-User-Get_Profile + */ +const subPrefix = 'sm'; +export default { + subPrefix, + async getTokenObj(proxyUrl, apiSecretToken) { + // Call the user info endpoint + try { + const { body } = await networkSvc.request({ + method: 'POST', + url: `${proxyUrl}https://sm.ms/api/v2/profile`, + headers: { + Authorization: apiSecretToken, + }, + }); + // Check user result + if (!body.success) { + throw new Error(`SM.MS个人信息获取失败,失败信息:${body.message}`); + } + userSvc.addUserInfo({ + id: `${subPrefix}:${body.data.username}`, + name: body.data.username, + imageUrl: 'https://gravatar.loli.net/avatar/ccc459536d65637c192c00f639569864', + }); + // Build token object including sub + const token = { + proxyUrl, + accessToken: apiSecretToken, + name: body.data.username, + sub: body.data.username, + }; + // Add token to smms tokens + store.dispatch('data/addSmmsToken', token); + return token; + } catch (err) { + console.error(err); // eslint-disable-line no-console + store.dispatch('notification/error', err); + throw new Error(`SM.MS个人信息获取异常,异常信息:${err.message}`); + } + }, + async addAccount(proxyUrl, apiSecretToken) { + const token = await this.getTokenObj(proxyUrl, apiSecretToken); + badgeSvc.addBadge('addSmmsAccount'); + return token; + }, + async uploadFile({ + token, + file, + }) { + const { body } = await networkSvc.request({ + method: 'POST', + url: `${token.proxyUrl}https://sm.ms/api/v2/upload`, + headers: { + Authorization: token.accessToken, + }, + formData: { + smfile: file, + }, + }); + if (!body.success) { + if (body.code === 'image_repeated') { + return body.images; + } + store.dispatch('notification/error', `SM.MS上传图片失败,失败信息:${body.message}`); + throw new Error(`SM.MS上传图片失败,失败信息:${body.message}`); + } + return body.data.url; + }, + +}; diff --git a/src/services/providers/helpers/wordpressHelper.js b/src/services/providers/helpers/wordpressHelper.js new file mode 100644 index 0000000..c109bfd --- /dev/null +++ b/src/services/providers/helpers/wordpressHelper.js @@ -0,0 +1,112 @@ +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import badgeSvc from '../../badgeSvc'; + +const tokenExpirationMargin = 5 * 60 * 1000; // 5 min (WordPress tokens expire after 2 weeks) + +const request = (token, options) => networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + Authorization: `Bearer ${token.accessToken}`, + }, +}) + .then(res => res.body); + +export default { + /** + * https://developer.wordpress.com/docs/oauth2/ + */ + async startOauth2(sub = null, silent = false) { + await networkSvc.getServerConf(); + const clientId = store.getters['data/serverConf'].wordpressClientId; + + // Get an OAuth2 code + const { accessToken, expiresIn } = await networkSvc.startOauth2( + 'https://public-api.wordpress.com/oauth2/authorize', + { + client_id: clientId, + response_type: 'token', + scope: 'global', + }, + silent, + ); + + // Call the user info endpoint + const body = await request({ accessToken }, { + url: 'https://public-api.wordpress.com/rest/v1.1/me', + }); + + // Check the returned sub consistency + if (sub && `${body.ID}` !== sub) { + throw new Error('WordPress account ID not expected.'); + } + // Build token object including scopes and sub + const token = { + accessToken, + expiresOn: Date.now() + (expiresIn * 1000), + name: body.display_name, + sub: `${body.ID}`, + }; + // Add token to wordpress tokens + store.dispatch('data/addWordpressToken', token); + return token; + }, + async refreshToken(token) { + const { sub } = token; + const lastToken = store.getters['data/wordpressTokensBySub'][sub]; + + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { + return lastToken; + } + // Existing token is going to expire. + // Try to get a new token in background + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'WordPress', + }); + return this.startOauth2(sub); + }, + async addAccount(fullAccess = false) { + const token = await this.startOauth2(fullAccess); + badgeSvc.addBadge('addWordpressAccount'); + return token; + }, + + /** + * https://developer.wordpress.com/docs/api/1.2/post/sites/%24site/posts/new/ + * https://developer.wordpress.com/docs/api/1.2/post/sites/%24site/posts/%24post_ID/ + */ + async uploadPost({ + token, + domain, + siteId, + postId, + title, + content, + tags, + categories, + excerpt, + author, + featuredImage, + status, + date, + }) { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { + method: 'POST', + url: `https://public-api.wordpress.com/rest/v1.2/sites/${siteId || domain}/posts/${postId || 'new'}`, + body: { + content, + title, + tags, + categories, + excerpt, + author, + featured_image: featuredImage || '', + status, + date: date && date.toISOString(), + }, + }); + }, +}; diff --git a/src/services/providers/helpers/zendeskHelper.js b/src/services/providers/helpers/zendeskHelper.js new file mode 100644 index 0000000..2d50d08 --- /dev/null +++ b/src/services/providers/helpers/zendeskHelper.js @@ -0,0 +1,114 @@ +import networkSvc from '../../networkSvc'; +import store from '../../../store'; +import badgeSvc from '../../badgeSvc'; + +const request = (token, options) => networkSvc.request({ + ...options, + headers: { + ...options.headers || {}, + Authorization: `Bearer ${token.accessToken}`, + }, +}) + .then(res => res.body); + + +export default { + /** + * https://support.zendesk.com/hc/en-us/articles/203663836-Using-OAuth-authentication-with-your-application + */ + async startOauth2(subdomain, clientId, sub = null, silent = false) { + // Get an OAuth2 code + const { accessToken } = await networkSvc.startOauth2( + `https://${subdomain}.zendesk.com/oauth/authorizations/new`, + { + client_id: clientId, + response_type: 'token', + scope: 'read hc:write', + }, + silent, + ); + + // Call the user info endpoint + const { user } = await request({ accessToken }, { + url: `https://${subdomain}.zendesk.com/api/v2/users/me.json`, + }); + const uniqueSub = `${subdomain}/${user.id}`; + + // Check the returned sub consistency + if (sub && uniqueSub !== sub) { + throw new Error('Zendesk account ID not expected.'); + } + + // Build token object including scopes and sub + const token = { + accessToken, + name: user.name, + subdomain, + sub: uniqueSub, + }; + + // Add token to zendesk tokens + store.dispatch('data/addZendeskToken', token); + return token; + }, + async addAccount(subdomain, clientId) { + const token = await this.startOauth2(subdomain, clientId); + badgeSvc.addBadge('addZendeskAccount'); + return token; + }, + + /** + * https://developer.zendesk.com/rest_api/docs/help_center/articles + */ + async uploadArticle({ + token, + sectionId, + articleId, + title, + content, + labels, + locale, + isDraft, + }) { + const article = { + title, + body: content, + locale, + draft: isDraft, + }; + + if (articleId) { + // Update article + await request(token, { + method: 'PUT', + url: `https://${token.subdomain}.zendesk.com/api/v2/help_center/articles/${articleId}/translations/${locale}.json`, + body: { translation: article }, + }); + + // Add labels + if (labels) { + await request(token, { + method: 'PUT', + url: `https://${token.subdomain}.zendesk.com/api/v2/help_center/articles/${articleId}.json`, + body: { + article: { + label_names: labels, + }, + }, + }); + } + return articleId; + } + + // Create new article + if (labels) { + article.label_names = labels; + } + const body = await request(token, { + method: 'POST', + url: `https://${token.subdomain}.zendesk.com/api/v2/help_center/sections/${sectionId}/articles.json`, + body: { article }, + }); + return `${body.article.id}`; + }, +}; diff --git a/src/services/providers/wordpressProvider.js b/src/services/providers/wordpressProvider.js new file mode 100644 index 0000000..a244e85 --- /dev/null +++ b/src/services/providers/wordpressProvider.js @@ -0,0 +1,41 @@ +import store from '../../store'; +import wordpressHelper from './helpers/wordpressHelper'; +import Provider from './common/Provider'; + +export default new Provider({ + id: 'wordpress', + name: 'WordPress', + getToken({ sub }) { + return store.getters['data/wordpressTokensBySub'][sub]; + }, + getLocationUrl({ siteId, postId }) { + return `https://wordpress.com/post/${siteId}/${postId}`; + }, + getLocationDescription({ postId }) { + return postId; + }, + async publish(token, html, metadata, publishLocation) { + const post = await wordpressHelper.uploadPost({ + ...publishLocation, + ...metadata, + token, + content: html, + }); + return { + ...publishLocation, + siteId: `${post.site_ID}`, + postId: `${post.ID}`, + }; + }, + makeLocation(token, domain, postId) { + const location = { + providerId: this.id, + sub: token.sub, + domain, + }; + if (postId) { + location.postId = postId; + } + return location; + }, +}); diff --git a/src/services/providers/zendeskProvider.js b/src/services/providers/zendeskProvider.js new file mode 100644 index 0000000..27b6066 --- /dev/null +++ b/src/services/providers/zendeskProvider.js @@ -0,0 +1,44 @@ +import store from '../../store'; +import zendeskHelper from './helpers/zendeskHelper'; +import Provider from './common/Provider'; + +export default new Provider({ + id: 'zendesk', + name: 'Zendesk', + getToken({ sub }) { + return store.getters['data/zendeskTokensBySub'][sub]; + }, + getLocationUrl({ sub, locale, articleId }) { + const token = this.getToken({ sub }); + return `https://${token.subdomain}.zendesk.com/hc/${locale}/articles/${articleId}`; + }, + getLocationDescription({ articleId }) { + return articleId; + }, + async publish(token, html, metadata, publishLocation) { + const articleId = await zendeskHelper.uploadArticle({ + ...publishLocation, + token, + title: metadata.title, + content: html, + labels: metadata.tags, + isDraft: metadata.status === 'draft', + }); + return { + ...publishLocation, + articleId, + }; + }, + makeLocation(token, sectionId, locale, articleId) { + const location = { + providerId: this.id, + sub: token.sub, + sectionId, + locale, + }; + if (articleId) { + location.articleId = articleId; + } + return location; + }, +}); diff --git a/src/services/publishSvc.js b/src/services/publishSvc.js new file mode 100644 index 0000000..ab6a542 --- /dev/null +++ b/src/services/publishSvc.js @@ -0,0 +1,179 @@ +import localDbSvc from './localDbSvc'; +import store from '../store'; +import utils from './utils'; +import networkSvc from './networkSvc'; +import exportSvc from './exportSvc'; +import providerRegistry from './providers/common/providerRegistry'; +import workspaceSvc from './workspaceSvc'; +import badgeSvc from './badgeSvc'; + +const hasCurrentFilePublishLocations = () => !!store.getters['publishLocation/current'].length; + +const loader = type => fileId => localDbSvc.loadItem(`${fileId}/${type}`) + // Item does not exist, create it + .catch(() => store.commit(`${type}/setItem`, { + id: `${fileId}/${type}`, + })); +const loadContent = loader('content'); + +const ensureArray = (value) => { + if (!value) { + return []; + } + if (!Array.isArray(value)) { + return `${value}`.trim().split(/\s*,\s*/); + } + return value; +}; + +const ensureString = (value, defaultValue) => { + if (!value) { + return defaultValue; + } + return `${value}`; +}; + +const ensureDate = (value, defaultValue) => { + if (!value) { + return defaultValue; + } + return new Date(`${value}`); +}; + +// git 相关的 providerId +const gitProviderIds = ['gitea', 'gitee', 'github', 'gitlab']; + +const publish = async (publishLocation, commitMessage) => { + const { fileId } = publishLocation; + const template = store.getters['data/allTemplatesById'][publishLocation.templateId]; + const html = await exportSvc.applyTemplate(fileId, template); + const content = await localDbSvc.loadItem(`${fileId}/content`); + const file = store.state.file.itemsById[fileId]; + const properties = utils.computeProperties(content.properties); + const provider = providerRegistry.providersById[publishLocation.providerId]; + const token = provider.getToken(publishLocation); + const metadata = { + title: ensureString(properties.title, file.name), + author: ensureString(properties.author), + tags: ensureArray(properties.tags), + categories: ensureArray(properties.categories), + excerpt: ensureString(properties.excerpt), + featuredImage: ensureString(properties.featuredImage), + status: ensureString(properties.status), + date: ensureDate(properties.date, new Date()), + }; + return provider.publish(token, html, metadata, publishLocation, commitMessage); +}; + +const publishFile = async (fileId) => { + let counter = 0; + await loadContent(fileId); + const publishLocations = [ + ...store.getters['publishLocation/filteredGroupedByFileId'][fileId] || [], + ]; + try { + // 查询是否包含git provider 包含则需要填入提交信息 + const gitLocations = publishLocations.filter(it => gitProviderIds.indexOf(it.providerId) > -1); + let commitMsg = ''; + if (gitLocations.length) { + try { + const { commitMessage } = await store.dispatch('modal/open', { type: 'commitMessage' }); + commitMsg = commitMessage; + } catch (e) { + return; + } + } + await utils.awaitSequence(publishLocations, async (publishLocation) => { + await store.dispatch('queue/doWithLocation', { + location: publishLocation, + action: async () => { + const publishLocationToStore = await publish(publishLocation, commitMsg); + try { + // Replace publish location if modified + if (utils.serializeObject(publishLocation) !== + utils.serializeObject(publishLocationToStore) + ) { + store.commit('publishLocation/patchItem', publishLocationToStore); + workspaceSvc.ensureUniqueLocations(); + } + counter += 1; + } catch (err) { + if (store.state.offline) { + throw err; + } + console.error(err); // eslint-disable-line no-console + store.dispatch('notification/error', err); + } + }, + }); + }); + const file = store.state.file.itemsById[fileId]; + store.dispatch('notification/info', `"${file.name}"已发布到${counter}个位置。`); + } finally { + await localDbSvc.unloadContents(); + } +}; + +const requestPublish = () => { + // No publish in light mode + if (store.state.light) { + return; + } + + store.dispatch('queue/enqueuePublishRequest', async () => { + let intervalId; + const attempt = async () => { + // Only start publishing when these conditions are met + if (networkSvc.isUserActive()) { + clearInterval(intervalId); + if (!hasCurrentFilePublishLocations()) { + // Cancel publish + throw new Error('Publish not possible.'); + } + await publishFile(store.getters['file/current'].id); + badgeSvc.addBadge('triggerPublish'); + } + }; + intervalId = utils.setInterval(() => attempt(), 1000); + return attempt(); + }); +}; + +const publishLocationAndStore = async (publishLocation, commitMsg) => { + const publishLocationToStore = await publish(publishLocation, commitMsg); + workspaceSvc.addPublishLocation(publishLocationToStore); + return publishLocationToStore; +}; + +const createPublishLocation = (publishLocation, featureId) => { + const currentFile = store.getters['file/current']; + publishLocation.fileId = currentFile.id; + store.dispatch( + 'queue/enqueue', + async () => { + let commitMsg = ''; + if (gitProviderIds.indexOf(publishLocation.providerId) > -1) { + try { + const { commitMessage } = await store.dispatch('modal/open', { + type: 'commitMessage', + name: currentFile.name, + }); + commitMsg = commitMessage; + } catch (e) { + return; + } + } + await publishLocationAndStore(publishLocation, commitMsg); + store.dispatch('notification/info', `添加了一个新的发布位置 "${currentFile.name}".`); + if (featureId) { + badgeSvc.addBadge(featureId); + } + }, + ); +}; + +export default { + requestPublish, + publishLocationAndStore, + createPublishLocation, +}; diff --git a/src/services/syncSvc.js b/src/services/syncSvc.js new file mode 100644 index 0000000..8f69df7 --- /dev/null +++ b/src/services/syncSvc.js @@ -0,0 +1,1060 @@ +import md5 from 'js-md5'; +import localDbSvc from './localDbSvc'; +import store from '../store'; +import utils from './utils'; +import diffUtils from './diffUtils'; +import networkSvc from './networkSvc'; +import providerRegistry from './providers/common/providerRegistry'; +import giteeAppDataProvider from './providers/giteeAppDataProvider'; +import githubAppDataProvider from './providers/githubAppDataProvider'; +import './providers/couchdbWorkspaceProvider'; +import './providers/githubWorkspaceProvider'; +import './providers/giteeWorkspaceProvider'; +import './providers/gitlabWorkspaceProvider'; +import './providers/giteaWorkspaceProvider'; +import './providers/googleDriveWorkspaceProvider'; +import tempFileSvc from './tempFileSvc'; +import workspaceSvc from './workspaceSvc'; +import constants from '../data/constants'; +import badgeSvc from './badgeSvc'; + +const minAutoSyncEvery = 60 * 1000; // 60 sec +const inactivityThreshold = 3 * 1000; // 3 sec +const restartSyncAfter = 30 * 1000; // 30 sec +const restartContentSyncAfter = 1000; // Enough to detect an authorize pop up +const checkSponsorshipAfter = (5 * 60 * 1000) + (30 * 1000); // tokenExpirationMargin + 30 sec +const maxContentHistory = 20; + +const LAST_SEEN = 0; +const LAST_MERGED = 1; +const LAST_SENT = 2; + +let actionProvider; +let workspaceProvider; + +/** + * Use a lock in the local storage to prevent multiple windows concurrency. + */ +let lastSyncActivity; +const getLastStoredSyncActivity = () => + parseInt(localStorage.getItem(store.getters['workspace/lastSyncActivityKey']), 10) || 0; + +/** + * Return true if workspace sync is possible. + */ +const isWorkspaceSyncPossible = () => !!store.getters['workspace/syncToken']; + +/** + * Return true if file has at least one explicit sync location. + */ +const hasCurrentFileSyncLocations = () => !!store.getters['syncLocation/current'].length; + +/** + * Return true if we are online and we have something to sync. + */ +const isSyncPossible = () => !store.state.offline && + (isWorkspaceSyncPossible() || hasCurrentFileSyncLocations()); + +/** + * Return true if we are the many window, ie we have the lastSyncActivity lock. + */ +const isSyncWindow = () => { + const storedLastSyncActivity = getLastStoredSyncActivity(); + return lastSyncActivity === storedLastSyncActivity || + Date.now() > inactivityThreshold + storedLastSyncActivity; +}; + +/** + * Return true if auto sync can start, ie if lastSyncActivity is old enough. + */ +const isAutoSyncReady = () => { + let { autoSyncEvery } = store.getters['data/computedSettings']; + if (autoSyncEvery < minAutoSyncEvery) { + autoSyncEvery = minAutoSyncEvery; + } + return Date.now() > autoSyncEvery + getLastStoredSyncActivity(); +}; + +/** + * 是否已启用工作空间的自动同步 没有配置 默认是启用了的 + */ +const isEnableAutoSyncWorkspace = () => { + const workspace = store.getters['workspace/currentWorkspace']; + return workspace.autoSync === undefined || workspace.autoSync; +}; + +/** + * Update the lastSyncActivity, assuming we have the lock. + */ +const setLastSyncActivity = () => { + const currentDate = Date.now(); + lastSyncActivity = currentDate; + localStorage.setItem(store.getters['workspace/lastSyncActivityKey'], currentDate); +}; + +/** + * Upgrade hashes if syncedContent is from an old version + */ +const upgradeSyncedContent = (syncedContent) => { + if (syncedContent.v) { + return syncedContent; + } + const hashUpgrades = {}; + const historyData = {}; + const syncHistory = {}; + Object.entries(syncedContent.historyData).forEach(([hash, content]) => { + const newContent = utils.addItemHash(content); + historyData[newContent.hash] = newContent; + hashUpgrades[hash] = newContent.hash; + }); + Object.entries(syncedContent.syncHistory).forEach(([id, hashEntries]) => { + syncHistory[id] = hashEntries.map(hash => hashUpgrades[hash]); + }); + return { + ...syncedContent, + historyData, + syncHistory, + v: 1, + }; +}; + +/** + * Clean a syncedContent. + */ +const cleanSyncedContent = (syncedContent) => { + // Clean syncHistory from removed syncLocations + Object.keys(syncedContent.syncHistory).forEach((syncLocationId) => { + if (syncLocationId !== 'main' && !store.state.syncLocation.itemsById[syncLocationId]) { + delete syncedContent.syncHistory[syncLocationId]; + } + }); + + const allSyncLocationHashSet = new Set([] + .concat(...Object.keys(syncedContent.syncHistory) + .map(id => syncedContent.syncHistory[id]))); + + // Clean historyData from unused contents + Object.keys(syncedContent.historyData) + .map(hash => parseInt(hash, 10)) + .forEach((hash) => { + if (!allSyncLocationHashSet.has(hash)) { + delete syncedContent.historyData[hash]; + } + }); +}; + +/** + * Apply changes retrieved from the workspace provider. Update sync data accordingly. + */ +const applyChanges = (changes) => { + const allItemsById = { ...store.getters.allItemsById }; + const syncDataById = { ...store.getters['data/syncDataById'] }; + const idsToKeep = {}; + let saveSyncData = false; + let getExistingItem; + if (store.getters['workspace/currentWorkspaceIsGit']) { + const itemsByGitPath = { ...store.getters.itemsByGitPath }; + getExistingItem = existingSyncData => existingSyncData && itemsByGitPath[existingSyncData.id]; + } else { + getExistingItem = existingSyncData => existingSyncData && allItemsById[existingSyncData.itemId]; + } + + // Process each change + changes.forEach((change) => { + const existingSyncData = syncDataById[change.syncDataId]; + const existingItem = getExistingItem(existingSyncData); + // If item was removed + if (!change.item && existingSyncData) { + if (syncDataById[change.syncDataId]) { + delete syncDataById[change.syncDataId]; + saveSyncData = true; + } + if (existingItem) { + // Remove object from the store + store.commit(`${existingItem.type}/deleteItem`, existingItem.id); + delete allItemsById[existingItem.id]; + } + // If item was modified + } else if (change.item && change.item.hash) { + idsToKeep[change.item.id] = true; + + if ((existingSyncData || {}).hash !== change.syncData.hash) { + syncDataById[change.syncDataId] = change.syncData; + saveSyncData = true; + } + if ( + // If no sync data or existing one is different + (existingSyncData || {}).hash !== change.item.hash + // And no existing item or existing item is different + && (existingItem || {}).hash !== change.item.hash + // And item is not content nor data, which will be merged later + && change.item.type !== 'content' && change.item.type !== 'data' + ) { + store.commit(`${change.item.type}/setItem`, change.item); + allItemsById[change.item.id] = change.item; + } + } + }); + + if (saveSyncData) { + store.dispatch('data/setSyncDataById', syncDataById); + + // Sanitize the workspace + workspaceSvc.sanitizeWorkspace(idsToKeep); + } +}; + +/** + * Create a sync location by uploading the current file content. + */ +const createSyncLocation = (syncLocation) => { + const currentFile = store.getters['file/current']; + const fileId = currentFile.id; + syncLocation.fileId = fileId; + // Use deepCopy to freeze the item + const content = utils.deepCopy(store.getters['content/current']); + store.dispatch( + 'queue/enqueue', + async () => { + const provider = providerRegistry.providersById[syncLocation.providerId]; + const token = provider.getToken(syncLocation); + const updatedSyncLocation = await provider.uploadContent(token, { + ...content, + history: [content.hash], + }, syncLocation); + await localDbSvc.loadSyncedContent(fileId); + const newSyncedContent = utils.deepCopy(upgradeSyncedContent(store.state.syncedContent.itemsById[`${fileId}/syncedContent`])); + const newSyncHistoryItem = []; + newSyncedContent.syncHistory[syncLocation.id] = newSyncHistoryItem; + newSyncHistoryItem[LAST_SEEN] = content.hash; + newSyncHistoryItem[LAST_SENT] = content.hash; + newSyncedContent.historyData[content.hash] = content; + + store.commit('syncedContent/patchItem', newSyncedContent); + workspaceSvc.addSyncLocation(updatedSyncLocation); + store.dispatch('notification/info', `将新的同步位置添加到"${currentFile.name}"中。`); + }, + ); +}; + +/** + * Prevent from sending new data too long after old data has been fetched. + */ +const tooLateChecker = (timeout) => { + const tooLateAfter = Date.now() + timeout; + return (cb) => { + if (tooLateAfter < Date.now()) { + throw new Error('TOO_LATE'); + } + return cb(); + }; +}; + +/** + * Return true if file is in the temp folder or is a welcome file. + */ +const isTempFile = (fileId) => { + const contentId = `${fileId}/content`; + if (store.getters['data/syncDataByItemId'][contentId]) { + // If file has already been synced, let's not consider it a temp file + return false; + } + const file = store.state.file.itemsById[fileId]; + const content = store.state.content.itemsById[contentId]; + if (!file || !content) { + return false; + } + if (file.parentId === 'temp') { + return true; + } + const locations = [ + ...store.getters['syncLocation/filteredGroupedByFileId'][fileId] || [], + ...store.getters['publishLocation/filteredGroupedByFileId'][fileId] || [], + ]; + if (locations.length) { + // If file has sync/publish locations, it's not a temp file + return false; + } + // Return true if it's a welcome file that has no discussion + const { welcomeFileHashes } = store.getters['data/localSettings']; + const hash = utils.hash(content.text); + const hasDiscussions = Object.keys(content.discussions).length; + return file.name === 'Welcome file' && welcomeFileHashes[hash] && !hasDiscussions; +}; + +/** + * Patch sync data if some have changed in the result. + */ +const updateSyncData = (result) => { + [ + result.syncData, + result.contentSyncData, + result.fileSyncData, + ].forEach((syncData) => { + if (syncData) { + const oldSyncData = store.getters['data/syncDataById'][syncData.id]; + if (utils.serializeObject(oldSyncData) !== utils.serializeObject(syncData)) { + store.dispatch('data/patchSyncDataById', { + [syncData.id]: syncData, + }); + } + } + }); + return result; +}; + +class SyncContext { + restartSkipContents = false; + attempted = {}; +} + +/** + * Sync one file with all its locations. + */ +const syncFile = async (fileId, syncContext = new SyncContext()) => { + const contentId = `${fileId}/content`; + syncContext.attempted[contentId] = true; + + await localDbSvc.loadSyncedContent(fileId); + try { + await localDbSvc.loadItem(contentId); + } catch (e) { + // Item may not exist if content has not been downloaded yet + } + + const getSyncedContent = () => upgradeSyncedContent(store.state.syncedContent.itemsById[`${fileId}/syncedContent`]); + const getSyncHistoryItem = syncLocationId => getSyncedContent().syncHistory[syncLocationId]; + + try { + if (isTempFile(fileId)) { + return; + } + + const syncLocations = [ + ...store.getters['syncLocation/filteredGroupedByFileId'][fileId] || [], + ]; + if (isWorkspaceSyncPossible()) { + syncLocations.unshift({ id: 'main', providerId: workspaceProvider.id, fileId }); + } + + await utils.awaitSequence(syncLocations, async (syncLocation) => { + const provider = providerRegistry.providersById[syncLocation.providerId]; + if (!provider) { + return; + } + const token = provider.getToken(syncLocation); + if (!token) { + return; + } + + const downloadContent = async () => { + // On simple provider, call simply downloadContent + if (syncLocation.id !== 'main') { + return provider.downloadContent(token, syncLocation); + } + + // On workspace provider, call downloadWorkspaceContent + const oldContentSyncData = store.getters['data/syncDataByItemId'][contentId]; + const oldFileSyncData = store.getters['data/syncDataByItemId'][fileId]; + if (!oldContentSyncData || !oldFileSyncData) { + return null; + } + + const { content } = updateSyncData(await provider.downloadWorkspaceContent({ + token, + contentId, + contentSyncData: oldContentSyncData, + fileSyncData: oldFileSyncData, + })); + + // Return the downloaded content + return content; + }; + + const uploadContent = async (content, ifNotTooLate, commitMessage) => { + // On simple provider, call simply uploadContent + if (syncLocation.id !== 'main') { + return provider.uploadContent(token, content, syncLocation, ifNotTooLate); + } + + // On workspace provider, call uploadWorkspaceContent + const oldContentSyncData = store.getters['data/syncDataByItemId'][contentId]; + if (oldContentSyncData && oldContentSyncData.hash === content.hash) { + return syncLocation; + } + const oldFileSyncData = store.getters['data/syncDataByItemId'][fileId]; + + updateSyncData(await provider.uploadWorkspaceContent({ + token, + content, + commitMessage, + // Use deepCopy to freeze item + file: utils.deepCopy(store.state.file.itemsById[fileId]), + contentSyncData: oldContentSyncData, + fileSyncData: oldFileSyncData, + ifNotTooLate, + })); + + // Return syncLocation + return syncLocation; + }; + + const doSyncLocation = async () => { + const serverContent = await downloadContent(token, syncLocation); + const syncedContent = getSyncedContent(); + const syncHistoryItem = getSyncHistoryItem(syncLocation.id); + + // Merge content + let mergedContent; + const clientContent = utils.deepCopy(store.state.content.itemsById[contentId]); + if (!clientContent) { + mergedContent = utils.deepCopy(serverContent || null); + } else if (!serverContent // If sync location has not been created yet + // Or server and client contents are synced + || serverContent.hash === clientContent.hash + // Or server content has not changed or has already been merged + || syncedContent.historyData[serverContent.hash] + ) { + mergedContent = clientContent; + } else { + // Perform a merge with last merged content if any, or perform a simple fusion otherwise + let lastMergedContent = utils.someResult( + serverContent.history, + hash => syncedContent.historyData[hash], + ); + if (!lastMergedContent && syncHistoryItem) { + lastMergedContent = syncedContent.historyData[syncHistoryItem[LAST_MERGED]]; + } + mergedContent = diffUtils.mergeContent(serverContent, clientContent, lastMergedContent); + if (mergedContent.mergeFlag) { + const file = store.state.file.itemsById[syncLocation.fileId]; + store.dispatch('notification/info', `${file.name} 存在冲突已自动合并,请注意合并结果!`); + } + } + if (!mergedContent) { + return; + } + + // Update or set content in store + store.commit('content/setItem', { + id: contentId, + text: utils.sanitizeText(mergedContent.text), + properties: utils.sanitizeText(mergedContent.properties), + discussions: mergedContent.discussions, + comments: mergedContent.comments, + }); + + // Retrieve content with its new hash value and freeze it + mergedContent = utils.deepCopy(store.state.content.itemsById[contentId]); + + // Make merged content history + const mergedContentHistory = serverContent ? serverContent.history.slice() : []; + let skipUpload = true; + if (mergedContentHistory[0] !== mergedContent.hash) { + // Put merged content hash at the beginning of history + mergedContentHistory.unshift(mergedContent.hash); + // Server content is either out of sync or its history is incomplete, do upload + skipUpload = false; + } + if (syncHistoryItem + && syncHistoryItem[LAST_SENT] != null + && syncHistoryItem[LAST_SENT] !== mergedContent.hash + ) { + // Clean up by removing the hash we've previously added + const idx = mergedContentHistory.lastIndexOf(syncHistoryItem[LAST_SENT]); + if (idx !== -1) { + mergedContentHistory.splice(idx, 1); + } + } + + // Update synced content + const newSyncedContent = utils.deepCopy(syncedContent); + const newSyncHistoryItem = newSyncedContent.syncHistory[syncLocation.id] || []; + newSyncedContent.syncHistory[syncLocation.id] = newSyncHistoryItem; + if (serverContent && + (serverContent.hash === newSyncHistoryItem[LAST_SEEN] || + serverContent.history.includes(newSyncHistoryItem[LAST_SEEN])) + ) { + // That's the 2nd time we've seen this content, trust it for future merges + newSyncHistoryItem[LAST_MERGED] = newSyncHistoryItem[LAST_SEEN]; + } + newSyncHistoryItem[LAST_MERGED] = newSyncHistoryItem[LAST_MERGED] || null; + newSyncHistoryItem[LAST_SEEN] = mergedContent.hash; + newSyncHistoryItem[LAST_SENT] = skipUpload ? null : mergedContent.hash; + newSyncedContent.historyData[mergedContent.hash] = mergedContent; + + // Clean synced content from unused revisions + cleanSyncedContent(newSyncedContent); + // Store synced content + store.commit('syncedContent/patchItem', newSyncedContent); + + if (skipUpload) { + // Server content and merged content are equal, skip content upload + return; + } + + // If content is to be created, schedule a restart to create the file as well + if (provider === workspaceProvider && + !store.getters['data/syncDataByItemId'][fileId] + ) { + syncContext.restartSkipContents = true; + } + + const currentWorkspace = store.getters['workspace/currentWorkspace']; + const isGit = !!store.getters['workspace/currentWorkspaceIsGit']; + let commitMsg = ''; + // 是git 并且未配置自动同步或启用了自动同步 并且文档类型是content + if (isGit && (currentWorkspace.autoSync !== undefined && !currentWorkspace.autoSync)) { + const file = store.state.file.itemsById[fileId]; + try { + const { commitMessage } = await store.dispatch('modal/open', { + type: 'commitMessage', + name: file.name, + }); + commitMsg = commitMessage; + } catch (e) { + return; + } + } + // Upload merged content + const item = { + ...mergedContent, + history: mergedContentHistory.slice(0, maxContentHistory), + }; + const syncLocationToStore = await uploadContent( + item, + tooLateChecker(restartContentSyncAfter), + commitMsg, + ); + + // Replace sync location if modified + if (utils.serializeObject(syncLocation) !== + utils.serializeObject(syncLocationToStore) + ) { + store.commit('syncLocation/patchItem', syncLocationToStore); + workspaceSvc.ensureUniqueLocations(); + } + }; + + await store.dispatch('queue/doWithLocation', { + location: syncLocation, + action: async () => { + try { + await doSyncLocation(); + } catch (err) { + if (store.state.offline || (err && err.message === 'TOO_LATE')) { + throw err; + } + console.error(err); // eslint-disable-line no-console + store.dispatch('notification/error', err); + } + }, + }); + }); + } catch (err) { + if (err && err.message === 'TOO_LATE') { + // Restart sync + await syncFile(fileId, syncContext); + } else { + throw err; + } + } finally { + await localDbSvc.unloadContents(); + } +}; + +/** + * Sync a data item, typically settings, templates or workspaces. + */ +const syncDataItem = async (dataId) => { + const getItem = () => store.state.data.itemsById[dataId] + || store.state.data.lsItemsById[dataId]; + + const oldItem = getItem(); + const oldSyncData = store.getters['data/syncDataById'][dataId]; + // Sync if item hash and syncData hash are out of sync + if (oldSyncData && oldItem && oldItem.hash === oldSyncData.hash) { + return; + } + + const token = workspaceProvider.getToken(); + const { item } = updateSyncData(await workspaceProvider.downloadWorkspaceData({ + token, + syncData: oldSyncData || { id: dataId }, + })); + + const serverItem = item; + const dataSyncData = store.getters['data/dataSyncDataById'][dataId]; + const clientItem = utils.deepCopy(getItem()); + let mergedItem = (() => { + if (!clientItem) { + return serverItem; + } + if (!serverItem) { + return clientItem; + } + if (!dataSyncData) { + return serverItem; + } + if (dataSyncData.hash !== serverItem.hash) { + // Server version has changed + if (dataSyncData.hash !== clientItem.hash && typeof clientItem.data === 'object') { + // Client version has changed as well, merge data objects + return { + ...clientItem, + data: diffUtils.mergeObjects(serverItem.data, clientItem.data), + }; + } + return serverItem; + } + return clientItem; + })(); + + if (!mergedItem) { + return; + } + + if (clientItem && dataId === 'workspaces') { + // Clean deleted workspaces + await Promise.all(Object.keys(clientItem.data) + .filter(id => !mergedItem.data[id]) + .map(id => workspaceSvc.removeWorkspace(id))); + } + + // Update item in store + store.commit('data/setItem', { + id: dataId, + ...mergedItem, + }); + + // Retrieve item with new `hash` and freeze it + mergedItem = utils.deepCopy(getItem()); + + // Upload merged data item if out of sync + if (!serverItem || serverItem.hash !== mergedItem.hash) { + updateSyncData(await workspaceProvider.uploadWorkspaceData({ + token, + item: mergedItem, + syncData: store.getters['data/syncDataById'][dataId], + ifNotTooLate: tooLateChecker(restartContentSyncAfter), + })); + } + + // Copy sync data into data sync data + store.dispatch('data/patchDataSyncDataById', { + [dataId]: utils.deepCopy(store.getters['data/syncDataById'][dataId]), + }); +}; + +/** + * Sync the whole workspace with the main provider and the current file explicit locations. + */ +const syncWorkspace = async (skipContents = false) => { + try { + const workspace = store.getters['workspace/currentWorkspace']; + const syncContext = new SyncContext(); + + // Store the sub in the DB since it's not safely stored in the token + const syncToken = store.getters['workspace/syncToken']; + const localSettings = store.getters['data/localSettings']; + if (!localSettings.syncSub) { + store.dispatch('data/patchLocalSettings', { + syncSub: syncToken.sub, + }); + } else if (localSettings.syncSub !== syncToken.sub) { + throw new Error('Synchronization failed due to token inconsistency.'); + } + + const changes = await workspaceProvider.getChanges(); + + // Apply changes + applyChanges(workspaceProvider.prepareChanges(changes)); + workspaceProvider.onChangesApplied(); + + // Prevent from sending items too long after changes have been retrieved + const ifNotTooLate = tooLateChecker(restartSyncAfter); + + // Find and save one item to save + await utils.awaitSome(() => ifNotTooLate(async () => { + const storeItemMap = { + ...store.state.file.itemsById, + ...store.state.folder.itemsById, + ...store.state.syncLocation.itemsById, + ...store.state.publishLocation.itemsById, + // Deal with contents and data later + }; + + const syncDataByItemId = store.getters['data/syncDataByItemId']; + const isGit = !!store.getters['workspace/currentWorkspaceIsGit']; + const [changedItem, syncDataToUpdate] = utils.someResult( + Object.entries(storeItemMap), + ([id, item]) => { + const syncData = syncDataByItemId[id]; + if ((syncData && syncData.hash === item.hash) + // Add file/folder only if parent folder has been added + || (!isGit && storeItemMap[item.parentId] && !syncDataByItemId[item.parentId]) + // Don't create folder if it's a git workspace + || (isGit && item.type === 'folder') + // Add file only if content has been added + || (item.type === 'file' && !syncDataByItemId[`${id}/content`]) + // 如果是发布位置 文件不存在了 则不需要更新 等待后续删除 + || (item.type === 'publishLocation' && (!item.fileId || !syncDataByItemId[`${item.fileId}/content`])) + ) { + return null; + } + return [item, syncData]; + }, + ) || []; + + if (!changedItem) return false; + + updateSyncData(await workspaceProvider.saveWorkspaceItem({ + // Use deepCopy to freeze objects + item: utils.deepCopy(changedItem), + syncData: utils.deepCopy(syncDataToUpdate), + ifNotTooLate, + })); + + return true; + })); + + // Find and remove one item to remove + await utils.awaitSome(() => ifNotTooLate(async () => { + let getItem; + let getFileItem; + let getOriginFileItem; + if (store.getters['workspace/currentWorkspaceIsGit']) { + const { itemsByGitPath } = store.getters; + getItem = syncData => itemsByGitPath[syncData.id]; + getOriginFileItem = syncData => itemsByGitPath[syncData.fileId]; + getFileItem = syncData => itemsByGitPath[syncData.id.slice(1)]; // Remove leading / + } else { + const { allItemsById } = store.getters; + getItem = syncData => allItemsById[syncData.itemId]; + getOriginFileItem = syncData => allItemsById[syncData.fileId]; + getFileItem = syncData => allItemsById[syncData.itemId.split('/')[0]]; + } + + const syncDataById = store.getters['data/syncDataById']; + const syncDataToRemove = utils.deepCopy(utils.someResult( + Object.values(syncDataById), + (syncData) => { + if (getItem(syncData) + // We don't want to delete data items, especially on first sync + || syncData.type === 'data' + // Remove content only if file has been removed + || (syncData.type === 'content' && getFileItem(syncData)) + // 发布位置 如果对应的文件不存在了 也需要删除 + || (syncData.type === 'publishLocation' && syncData.fileId && getOriginFileItem(syncData)) + ) { + return null; + } + return syncData; + }, + )); + + if (!syncDataToRemove) return false; + + await workspaceProvider.removeWorkspaceItem({ + syncData: syncDataToRemove, + ifNotTooLate, + }); + const syncDataByIdCopy = { ...store.getters['data/syncDataById'] }; + delete syncDataByIdCopy[syncDataToRemove.id]; + store.dispatch('data/setSyncDataById', syncDataByIdCopy); + return true; + })); + + // Sync settings, workspaces and badges only in the main workspace + if (workspace.id === 'main') { + // await syncDataItem('settings'); + await syncDataItem('workspaces'); + await syncDataItem('badgeCreations'); + // await syncDataItem('templates'); + } + + if (!skipContents) { + const currentFileId = store.getters['file/current'].id; + if (currentFileId) { + // Sync current file first + await syncFile(currentFileId, syncContext); + } + + // Find and sync one file out of sync + await utils.awaitSome(async () => { + let getSyncData; + if (store.getters['workspace/currentWorkspaceIsGit']) { + const { gitPathsByItemId } = store.getters; + const syncDataById = store.getters['data/syncDataById']; + getSyncData = contentId => syncDataById[gitPathsByItemId[contentId]]; + } else { + const syncDataByItemId = store.getters['data/syncDataByItemId']; + getSyncData = contentId => syncDataByItemId[contentId]; + } + + // Collect all [fileId, contentId] + const ids = [ + ...Object.keys(localDbSvc.hashMap.content) + .map(contentId => [contentId.split('/')[0], contentId]), + ...store.getters['file/items'] + .map(file => [file.id, `${file.id}/content`]), + ]; + + // Find the first content out of sync + const contentMap = store.state.content.itemsById; + const fileIdToSync = utils.someResult(ids, ([fileId, contentId]) => { + // Get the content hash from itemsById or from localDbSvc if not loaded + const loadedContent = contentMap[contentId]; + const hash = loadedContent ? loadedContent.hash : localDbSvc.hashMap.content[contentId]; + const syncData = getSyncData(contentId); + if ( + // Sync if content syncing was not attempted yet + !syncContext.attempted[contentId] && + // And if syncData does not exist or if content hash and syncData hash are inconsistent + (!syncData || syncData.hash !== hash) + ) { + return fileId; + } + return null; + }); + + if (!fileIdToSync) return false; + + await syncFile(fileIdToSync, syncContext); + return true; + }); + } + + // Restart sync if requested + if (syncContext.restartSkipContents) { + await syncWorkspace(true); + } + + if (workspace.id === 'main') { + badgeSvc.addBadge(workspace.providerId === 'giteeAppData' ? 'syncMainWorkspace' : 'githubSyncMainWorkspace'); + } + } catch (err) { + if (err && err.message === 'TOO_LATE') { + // Restart sync + await syncWorkspace(); + } else { + throw err; + } + } +}; + +const syncImg = async (absolutePath) => { + const token = workspaceProvider.getToken(); + const path = absolutePath.substring(1, absolutePath.length).replaceAll('%20', ' '); + const { sha, content } = await workspaceProvider.downloadFile({ + token, + path, + }); + if (!sha || !content) { + return; + } + await localDbSvc.saveImg({ + id: md5(absolutePath), + path: absolutePath, + content, + uploaded: 1, + sha, + }); +}; + +const uploadImg = async (imgIds, index = 0) => { + if (imgIds.length - 1 < index) { + return; + } + const item = await localDbSvc.getImgItem(imgIds[index]); + // 不存在item 或已上传 则跳过 + if (!item || item.uploaded) { + setTimeout(await uploadImg(imgIds, index + 1), 10); + return; + } + const token = workspaceProvider.getToken(); + const { sha } = await workspaceProvider.uploadWorkspaceContent({ + token, + file: { + ...utils.deepCopy(item), + type: 'img', + path: item.path.substring(1, item.path.length).replaceAll('%20', ' '), + }, + isImg: true, + }); + await localDbSvc.saveImg({ + ...item, + uploaded: 1, + sha, + }); + setTimeout(await uploadImg(imgIds, index + 1), 500); +}; + +const uploadImgs = async () => { + // 新增的图片 + const imgIds = await localDbSvc.getWaitUploadImgIds(); + if (imgIds.length > 0) { + await uploadImg(imgIds); + } +}; + +/** + * Enqueue a sync task, if possible. + */ +const requestSync = (addTriggerSyncBadge = false) => { + // No sync in light mode + if (store.state.light) { + return; + } + + store.dispatch('queue/enqueueSyncRequest', async () => { + let intervalId; + const attempt = async () => { + // Only start syncing when these conditions are met + if (networkSvc.isUserActive() && isSyncWindow()) { + clearInterval(intervalId); + if (!isSyncPossible()) { + // Cancel sync + throw new Error('无法同步。'); + } + + // Determine if we have to clean files + const fileHashesToClean = {}; + if (getLastStoredSyncActivity() + constants.cleanTrashAfter < Date.now()) { + // Last synchronization happened 7 days ago + const syncDataByItemId = store.getters['data/syncDataByItemId']; + store.getters['file/items'].forEach((file) => { + // If file is in the trash and has not been modified since it was last synced + const syncData = syncDataByItemId[file.id]; + if (syncData && file.parentId === 'trash' && file.hash === syncData.hash) { + fileHashesToClean[file.id] = file.hash; + } + }); + } + + // Call setLastSyncActivity periodically + intervalId = utils.setInterval(() => setLastSyncActivity(), 1000); + setLastSyncActivity(); + + try { + if (isWorkspaceSyncPossible()) { + await syncWorkspace(); + } else if (hasCurrentFileSyncLocations()) { + // Only sync the current file if workspace sync is unavailable + // as we don't want to look for out-of-sync files by loading + // all the syncedContent objects. + await syncFile(store.getters['file/current'].id); + } + // 同步图片 + await uploadImgs(); + + // Clean files + Object.entries(fileHashesToClean).forEach(([fileId, fileHash]) => { + const file = store.state.file.itemsById[fileId]; + if (file && file.hash === fileHash) { + workspaceSvc.deleteFile(fileId); + } + }); + + if (addTriggerSyncBadge) { + badgeSvc.addBadge('triggerSync'); + } + } finally { + clearInterval(intervalId); + } + } + }; + + intervalId = utils.setInterval(() => attempt(), 1000); + return attempt(); + }); +}; + +const afterSignIn = async () => { + if (store.getters['workspace/currentWorkspace'].id === 'main' && workspaceProvider) { + const mainToken = store.getters['workspace/mainWorkspaceToken']; + // Try to find a suitable workspace sync provider + workspaceProvider = mainToken.providerId === 'githubAppData' ? githubAppDataProvider : giteeAppDataProvider; + await workspaceProvider.initWorkspace(); + } +}; + +export default { + async init() { + // Load workspaces and tokens from localStorage + localDbSvc.syncLocalStorage(); + + // Try to find a suitable action provider + actionProvider = providerRegistry.providersById[utils.queryParams.providerId]; + if (actionProvider && actionProvider.initAction) { + await actionProvider.initAction(); + } + + const mainToken = store.getters['workspace/mainWorkspaceToken']; + // Try to find a suitable workspace sync provider + workspaceProvider = providerRegistry.providersById[utils.queryParams.providerId]; + if (!workspaceProvider || !workspaceProvider.initWorkspace) { + workspaceProvider = mainToken && mainToken.providerId === 'githubAppData' ? githubAppDataProvider : giteeAppDataProvider; + } + const workspace = await workspaceProvider.initWorkspace(); + // Fix the URL hash + const { paymentSuccess } = utils.queryParams; + utils.setQueryParams(workspaceProvider.getWorkspaceParams(workspace)); + + store.dispatch('workspace/setCurrentWorkspaceId', workspace.id); + await localDbSvc.init(); + + // Enable sponsorship + if (paymentSuccess) { + store.dispatch('modal/open', 'paymentSuccess') + .catch(() => { /* Cancel */ }); + const sponsorToken = store.getters['workspace/sponsorToken']; + // Force check sponsorship after a few seconds + const currentDate = Date.now(); + if (sponsorToken && sponsorToken.expiresOn > currentDate - checkSponsorshipAfter) { + store.dispatch('data/addGoogleToken', { + ...sponsorToken, + expiresOn: currentDate - checkSponsorshipAfter, + }); + } + } + + // Try to find a suitable action provider + actionProvider = providerRegistry.providersById[utils.queryParams.providerId] || actionProvider; + if (actionProvider && actionProvider.performAction) { + const newSyncLocation = await actionProvider.performAction(); + if (newSyncLocation) { + this.createSyncLocation(newSyncLocation); + } + } + + await tempFileSvc.init(); + + if (!store.state.light) { + // Sync periodically + utils.setInterval(() => { + if (isSyncPossible() + && networkSvc.isUserActive() + && isSyncWindow() + && isAutoSyncReady() + && isEnableAutoSyncWorkspace() + ) { + requestSync(); + } + }, 1000); + + // Unload contents from memory periodically + utils.setInterval(() => { + // Wait for sync and 发布到finish + if (store.state.queue.isEmpty) { + localDbSvc.unloadContents(); + } + }, 5000); + } + }, + afterSignIn, + syncImg, + isSyncPossible, + requestSync, + createSyncLocation, +}; diff --git a/src/services/tempFileSvc.js b/src/services/tempFileSvc.js new file mode 100644 index 0000000..76563c4 --- /dev/null +++ b/src/services/tempFileSvc.js @@ -0,0 +1,99 @@ +import cledit from './editor/cledit'; +import store from '../store'; +import utils from './utils'; +import editorSvc from './editorSvc'; +import workspaceSvc from './workspaceSvc'; + +const { + origin, + fileName, + contentText, + contentProperties, +} = utils.queryParams; +const isLight = origin && window.parent; + +export default { + setReady() { + if (isLight) { + // Wait for the editor to init + setTimeout(() => window.parent.postMessage({ type: 'ready' }, origin), 1); + } + }, + closed: false, + close() { + if (isLight) { + if (!this.closed) { + window.parent.postMessage({ type: 'close' }, origin); + } + this.closed = true; + } + }, + async init() { + if (!isLight) { + return; + } + store.commit('setLight', true); + + const file = await workspaceSvc.createFile({ + name: fileName || utils.getHostname(origin), + text: contentText || '\n', + properties: contentProperties, + parentId: 'temp', + }, true); + + // Sanitize file creations + const lastCreated = {}; + const fileItemsById = store.state.file.itemsById; + Object.entries(store.getters['data/lastCreated']).forEach(([id, value]) => { + if (fileItemsById[id] && fileItemsById[id].parentId === 'temp') { + lastCreated[id] = value; + } + }); + + // Track file creation from other site + lastCreated[file.id] = { + created: Date.now(), + }; + + // Keep only the last 10 temp files created by other sites + Object.entries(lastCreated) + .sort(([, value1], [, value2]) => value2.created - value1.created) + .splice(10) + .forEach(([id]) => { + delete lastCreated[id]; + workspaceSvc.deleteFile(id); + }); + + // Store file creations and open the file + store.dispatch('data/setLastCreated', lastCreated); + store.commit('file/setCurrentId', file.id); + + const onChange = cledit.Utils.debounce(() => { + const currentFile = store.getters['file/current']; + if (currentFile.id !== file.id) { + // Close editor if file has changed for some reason + this.close(); + } else if (!this.closed && editorSvc.previewCtx.html != null) { + const content = store.getters['content/current']; + const properties = utils.computeProperties(content.properties); + window.parent.postMessage({ + type: 'fileChange', + payload: { + id: file.id, + name: currentFile.name, + content: { + text: content.text.slice(0, -1), // Remove trailing LF + properties, + yamlProperties: content.properties, + html: editorSvc.previewCtx.html, + }, + }, + }, origin); + } + }, 25); + + // Watch preview refresh and file name changes + editorSvc.$on('previewCtx', onChange); + store.watch(() => store.getters['file/current'].name, onChange); + }, +}; diff --git a/src/services/templateWorker.js b/src/services/templateWorker.js new file mode 100644 index 0000000..8cc69e6 --- /dev/null +++ b/src/services/templateWorker.js @@ -0,0 +1,99 @@ +// This WebWorker provides a safe environment to run user scripts +// See http://stackoverflow.com/questions/10653809/making-webworkers-a-safe-environment/10796616 + +import Handlebars from 'handlebars'; + +// Classeur own helpers +Handlebars.registerHelper('tocToHtml', (toc, depth = 6) => { + function arrayToHtml(arr) { + if (!arr || !arr.length || arr[0].level > depth) { + return ''; + } + const ulHtml = arr.map((item) => { + let result = '
      • '; + if (item.anchor && item.title) { + result += `${item.title}`; + } + result += arrayToHtml(item.children); + return `${result}
      • `; + }).join('\n'); + return `\n
          \n${ulHtml}\n
        \n`; + } + return new Handlebars.SafeString(arrayToHtml(toc)); +}); + +const whiteList = { + self: 1, + onmessage: 1, + postMessage: 1, + global: 1, + whiteList: 1, + eval: 1, + Array: 1, + Boolean: 1, + Date: 1, + Function: 1, + Number: 1, + Object: 1, + RegExp: 1, + String: 1, + Error: 1, + EvalError: 1, + RangeError: 1, + ReferenceError: 1, + SyntaxError: 1, + TypeError: 1, + URIError: 1, + decodeURI: 1, + decodeURIComponent: 1, + encodeURI: 1, + encodeURIComponent: 1, + isFinite: 1, + isNaN: 1, + parseFloat: 1, + parseInt: 1, + Infinity: 1, + JSON: 1, + Math: 1, + NaN: 1, + undefined: 1, + safeEval: 1, + close: 1, +}; + +/* eslint-disable no-restricted-globals */ +let global = self; +while (global !== Object.prototype) { + Object.getOwnPropertyNames(global).forEach((prop) => { // eslint-disable-line no-loop-func + if (!Object.prototype.hasOwnProperty.call(whiteList, prop)) { + try { + Object.defineProperty(global, prop, { + get() { + throw new Error(`Security Exception: cannot access ${prop}`); + }, + configurable: false, + }); + } catch (e) { + // Ignore + } + } + }); + global = Object.getPrototypeOf(global); +} +self.Handlebars = Handlebars; + +function safeEval(code) { + eval(`"use strict";\n${code}`); // eslint-disable-line no-eval +} + +self.onmessage = (evt) => { + try { + const template = Handlebars.compile(evt.data[0]); + const context = evt.data[1]; + safeEval(evt.data[2]); + self.postMessage([null, template(context)]); + } catch (err) { + self.postMessage([`${err}`]); + } + close(); +}; diff --git a/src/services/timeSvc.js b/src/services/timeSvc.js new file mode 100644 index 0000000..65552fe --- /dev/null +++ b/src/services/timeSvc.js @@ -0,0 +1,113 @@ +// Credit: https://github.com/github/time-elements/ +const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; +const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + +const pad = num => `0${num}`.slice(-2); + +function strftime(time, formatString) { + const day = time.getDay(); + const date = time.getDate(); + const month = time.getMonth(); + const year = time.getFullYear(); + const hour = time.getHours(); + const minute = time.getMinutes(); + const second = time.getSeconds(); + return formatString.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g, (_arg) => { + let match; + const modifier = _arg[1]; + switch (modifier) { + case '%': + default: + return '%'; + case 'a': + return weekdays[day].slice(0, 3); + case 'A': + return weekdays[day]; + case 'b': + return months[month].slice(0, 3); + case 'B': + return months[month]; + case 'c': + return time.toString(); + case 'd': + return pad(date); + case 'e': + return date; + case 'H': + return pad(hour); + case 'I': + return pad(strftime(time, '%l')); + case 'l': + return hour === 0 || hour === 12 ? 12 : (hour + 12) % 12; + case 'm': + return pad(month + 1); + case 'M': + return pad(minute); + case 'p': + return hour > 11 ? 'PM' : 'AM'; + case 'P': + return hour > 11 ? 'pm' : 'am'; + case 'S': + return pad(second); + case 'w': + return day; + case 'y': + return pad(year % 100); + case 'Y': + return year; + case 'Z': + match = time.toString().match(/\((\w+)\)$/); + return match ? match[1] : ''; + case 'z': + match = time.toString().match(/\w([+-]\d\d\d\d) /); + return match ? match[1] : ''; + } + }); +} + +class RelativeTime { + constructor(date) { + this.date = date; + } + + toString() { + const ago = this.timeElapsed(); + return ago || `${this.formatDate()}`; + } + + timeElapsed() { + const ms = new Date().getTime() - this.date.getTime(); + const sec = Math.round(ms / 1000); + const min = Math.round(sec / 60); + const hr = Math.round(min / 60); + const day = Math.round(hr / 24); + if (ms < 0) { + return '刚刚'; + } else if (sec < 45) { + return '刚刚'; + } else if (sec < 90) { + return '1分钟前'; + } else if (min < 45) { + return `${min}分钟前`; + } else if (min < 90) { + return '1小时前'; + } else if (hr < 24) { + return `${hr}小时前`; + } else if (hr < 36) { + return '1天前'; + } else if (day < 30) { + return `${day}天前`; + } + return null; + } + + formatDate() { + return strftime(this.date, '%Y-%m-%d'); + } +} + +export default { + format(time) { + return time && new RelativeTime(new Date(time)).toString(); + }, +}; diff --git a/src/services/userSvc.js b/src/services/userSvc.js new file mode 100644 index 0000000..b8aae11 --- /dev/null +++ b/src/services/userSvc.js @@ -0,0 +1,91 @@ +import store from '../store'; +import utils from './utils'; + +const refreshUserInfoAfter = 60 * 60 * 1000; // 60 minutes + +const infoResolversByType = {}; +const subPrefixesByType = {}; +const typesBySubPrefix = {}; + +const lastInfosByUserId = {}; +const infoPromisedByUserId = {}; + +const sanitizeUserId = (userId) => { + const prefix = userId[2] === ':' && userId.slice(0, 2); + if (typesBySubPrefix[prefix]) { + return userId; + } + return `go:${userId}`; +}; + +const parseUserId = userId => [typesBySubPrefix[userId.slice(0, 2)], userId.slice(3)]; + +const refreshUserInfos = () => { + if (store.state.offline) { + return; + } + + Object.entries(lastInfosByUserId) + .filter(([userId, lastInfo]) => lastInfo === 0 && !infoPromisedByUserId[userId]) + .forEach(async ([userId]) => { + const [type, sub] = parseUserId(userId); + const infoResolver = infoResolversByType[type]; + if (infoResolver) { + try { + infoPromisedByUserId[userId] = true; + const userInfo = await infoResolver(sub); + store.commit('userInfo/setItem', userInfo); + } finally { + infoPromisedByUserId[userId] = false; + lastInfosByUserId[userId] = Date.now(); + } + } + }); +}; + +export default { + setInfoResolver(type, subPrefix, resolver) { + infoResolversByType[type] = resolver; + subPrefixesByType[type] = subPrefix; + typesBySubPrefix[subPrefix] = type; + }, + getCurrentUserId() { + const loginToken = store.getters['workspace/loginToken']; + if (!loginToken) { + return null; + } + const loginType = store.getters['workspace/loginType']; + const prefix = subPrefixesByType[loginType]; + return prefix ? `${prefix}:${loginToken.sub}` : loginToken.sub; + }, + sanitizeUserId, + addUserInfo(userInfo) { + store.commit('userInfo/setItem', userInfo); + lastInfosByUserId[userInfo.id] = Date.now(); + }, + addUserId(userId) { + if (userId) { + const sanitizedUserId = sanitizeUserId(userId); + const lastInfo = lastInfosByUserId[sanitizedUserId]; + if (lastInfo === undefined) { + // Try to find a token with this sub to resolve name as soon as possible + const [type, sub] = parseUserId(sanitizedUserId); + const token = store.getters['data/tokensByType'][type][sub]; + if (token) { + store.commit('userInfo/setItem', { + id: sanitizedUserId, + name: token.name, + }); + } + } + + if (lastInfo === undefined || lastInfo + refreshUserInfoAfter < Date.now()) { + lastInfosByUserId[sanitizedUserId] = 0; + refreshUserInfos(); + } + } + }, +}; + +// Get user info periodically +utils.setInterval(() => refreshUserInfos(), 60 * 1000); diff --git a/src/services/utils.js b/src/services/utils.js new file mode 100644 index 0000000..d171432 --- /dev/null +++ b/src/services/utils.js @@ -0,0 +1,439 @@ +import yaml from 'js-yaml'; +import '../libs/clunderscore'; +import presets from '../data/presets'; +import constants from '../data/constants'; + +// For utils.uid() +const uidLength = 16; +const crypto = window.crypto || window.msCrypto; +const alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); +const radix = alphabet.length; +const array = new Uint32Array(uidLength); + +// For utils.parseQueryParams() +const parseQueryParams = (params) => { + const result = {}; + params.split('&').forEach((param) => { + const [key, value] = param.split('=').map(decodeURIComponent); + if (key && value != null) { + result[key] = value; + } + }); + return result; +}; + +// For utils.setQueryParams() +const filterParams = (params = {}) => { + const result = {}; + Object.entries(params).forEach(([key, value]) => { + if (key && value != null) { + result[key] = value; + } + }); + return result; +}; + +// For utils.computeProperties() +const deepOverride = (obj, opt) => { + if (obj === undefined) { + return opt; + } + const objType = Object.prototype.toString.call(obj); + const optType = Object.prototype.toString.call(opt); + if (objType !== optType) { + return obj; + } + if (objType !== '[object Object]') { + return opt === undefined ? obj : opt; + } + Object.keys({ + ...obj, + ...opt, + }).forEach((key) => { + obj[key] = deepOverride(obj[key], opt[key]); + }); + return obj; +}; + +// For utils.addQueryParams() +const urlParser = document.createElement('a'); + +const deepCopy = (obj) => { + if (obj == null) { + return obj; + } + return JSON.parse(JSON.stringify(obj)); +}; + +// Compute presets +const computedPresets = {}; +Object.keys(presets).forEach((key) => { + let preset = deepCopy(presets[key][0]); + if (presets[key][1]) { + preset = deepOverride(preset, presets[key][1]); + } + computedPresets[key] = preset; +}); + +export default { + computedPresets, + queryParams: parseQueryParams(window.location.hash.slice(1)), + setQueryParams(params = {}) { + this.queryParams = filterParams(params); + const serializedParams = Object.entries(this.queryParams).map(([key, value]) => + `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&'); + const hash = `#${serializedParams}`; + if (window.location.hash !== hash) { + window.location.replace(hash); + } + }, + sanitizeText(text) { + const result = `${text || ''}`.slice(0, constants.textMaxLength); + // last char must be a `\n`. + return `${result}\n`.replace(/\n\n$/, '\n'); + }, + sanitizeName(name) { + return `${name || ''}` + // Keep only 250 characters + .slice(0, 250) || constants.defaultName; + }, + sanitizeFilename(name) { + return this.sanitizeName(`${name || ''}` + // Replace `/`, control characters and other kind of spaces with a space + .replace(/[/\x00-\x1F\x7f-\xa0\s]+/g, ' ') // eslint-disable-line no-control-regex + .trim()) || constants.defaultName; + }, + deepCopy, + serializeObject(obj) { + return obj === undefined ? obj : JSON.stringify(obj, (key, value) => { + if (Object.prototype.toString.call(value) !== '[object Object]') { + return value; + } + // Sort keys to have a predictable result + return Object.keys(value).sort().reduce((sorted, valueKey) => { + sorted[valueKey] = value[valueKey]; + return sorted; + }, {}); + }); + }, + search(items, criteria) { + let result; + items.some((item) => { + // If every field fits the criteria + if (Object.entries(criteria).every(([key, value]) => value === item[key])) { + result = item; + } + return result; + }); + return result; + }, + uid() { + crypto.getRandomValues(array); + return array.cl_map(value => alphabet[value % radix]).join(''); + }, + hash(str) { + // https://stackoverflow.com/a/7616484/1333165 + let hash = 0; + if (!str) return hash; + for (let i = 0; i < str.length; i += 1) { + const char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; // eslint-disable-line no-bitwise + hash |= 0; // eslint-disable-line no-bitwise + } + return hash; + }, + getItemHash(item) { + return this.hash(this.serializeObject({ + ...item, + // These properties must not be part of the hash + id: undefined, + hash: undefined, + history: undefined, + })); + }, + addItemHash(item) { + return { + ...item, + hash: this.getItemHash(item), + }; + }, + makeWorkspaceId(params) { + return Math.abs(this.hash(this.serializeObject(params))).toString(36); + }, + getDbName(workspaceId) { + let dbName = 'stackedit-db'; + if (workspaceId !== 'main') { + dbName += `-${workspaceId}`; + } + return dbName; + }, + encodeBase64(str, urlSafe = false) { + const uriEncodedStr = encodeURIComponent(str); + const utf8Str = uriEncodedStr.replace( + /%([0-9A-F]{2})/g, + (match, p1) => String.fromCharCode(`0x${p1}`), + ); + const result = btoa(utf8Str); + if (!urlSafe) { + return result; + } + return result + .replace(/\//g, '_') // Replace `/` with `_` + .replace(/\+/g, '-') // Replace `+` with `-` + .replace(/=+$/, ''); // Remove trailing `=` + }, + encodeFiletoBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result.split(',').pop()); + reader.onerror = error => reject(error); + }); + }, + base64ToBlob(dataurl, fileName) { + const potIdx = fileName.lastIndexOf('.'); + const suffix = potIdx > -1 ? fileName.substring(potIdx + 1) : 'png'; + const mime = `image/${suffix}`; + const bstr = atob(dataurl); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n >= 0) { + n -= 1; + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { type: mime }); + }, + decodeBase64(str) { + // In case of URL safe base64 + const sanitizedStr = str.replace(/_/g, '/').replace(/-/g, '+'); + const utf8Str = atob(sanitizedStr); + const uriEncodedStr = utf8Str + .split('') + .map(c => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`) + .join(''); + return decodeURIComponent(uriEncodedStr); + }, + computeProperties(yamlProperties) { + let properties = {}; + try { + properties = yaml.safeLoad(yamlProperties) || {}; + } catch (e) { + // Ignore + } + const extensions = properties.extensions || {}; + const computedPreset = deepCopy(computedPresets[extensions.preset] || computedPresets.default); + const computedExtensions = deepOverride(computedPreset, properties.extensions); + computedExtensions.preset = extensions.preset; + properties.extensions = computedExtensions; + return properties; + }, + randomize(value) { + return Math.floor((1 + (Math.random() * 0.2)) * value); + }, + setInterval(func, interval) { + return setInterval(() => func(), this.randomize(interval)); + }, + async awaitSequence(values, asyncFunc) { + const results = []; + const valuesLeft = values.slice().reverse(); + const runWithNextValue = async () => { + if (!valuesLeft.length) { + return results; + } + results.push(await asyncFunc(valuesLeft.pop())); + return runWithNextValue(); + }; + return runWithNextValue(); + }, + async awaitSome(asyncFunc) { + if (await asyncFunc()) { + return this.awaitSome(asyncFunc); + } + return null; + }, + someResult(values, func) { + let result; + values.some((value) => { + result = func(value); + return result; + }); + return result; + }, + parseQueryParams, + addQueryParams(url = '', params = {}, hash = false) { + const keys = Object.keys(params).filter(key => params[key] != null); + urlParser.href = url; + if (!keys.length) { + return urlParser.href; + } + const serializedParams = keys.map(key => + `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&'); + if (hash) { + if (urlParser.hash) { + urlParser.hash += '&'; + } else { + urlParser.hash = '#'; + } + urlParser.hash += serializedParams; + } else { + if (urlParser.search) { + urlParser.search += '&'; + } else { + urlParser.search = '?'; + } + urlParser.search += serializedParams; + } + return urlParser.href; + }, + resolveUrl(baseUrl, path) { + const oldBaseElt = document.getElementsByTagName('base')[0]; + const oldHref = oldBaseElt && oldBaseElt.href; + const newBaseElt = oldBaseElt || document.head.appendChild(document.createElement('base')); + newBaseElt.href = baseUrl; + urlParser.href = path; + const result = urlParser.href; + if (oldBaseElt) { + oldBaseElt.href = oldHref; + } else { + document.head.removeChild(newBaseElt); + } + return result; + }, + getHostname(url) { + urlParser.href = url; + return urlParser.hostname; + }, + encodeUrlPath(path) { + return path ? path.split('/').map(encodeURIComponent).join('/') : ''; + }, + decodeUrlPath(path) { + return path ? path.split('/').map(decodeURIComponent).join('/') : ''; + }, + parseGithubRepoUrl(url) { + const parsedRepo = url && url.match(/([^/:]+)\/([^/]+?)(?:\.git|\/)?$/); + return parsedRepo && { + owner: parsedRepo[1], + repo: parsedRepo[2], + }; + }, + parseGitlabProjectPath(url) { + const parsedProject = url && url.match(/^http[s]?:\/\/[^/]+\/(.+?)(?:\.git|\/)?$/); + return parsedProject && parsedProject[1]; + }, + parseGiteaProjectPath(url) { + const parsedProject = url && url.match(/^http[s]?:\/\/[^/]+\/(.+?)(?:\.git|\/)?$/); + return parsedProject && parsedProject[1]; + }, + createHiddenIframe(url) { + const iframeElt = document.createElement('iframe'); + iframeElt.style.position = 'absolute'; + iframeElt.style.left = '-99px'; + iframeElt.style.width = '1px'; + iframeElt.style.height = '1px'; + iframeElt.src = url; + return iframeElt; + }, + wrapRange(range, eltProperties) { + const rangeLength = `${range}`.length; + let wrappedLength = 0; + const treeWalker = document + .createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT); + let { startOffset } = range; + treeWalker.currentNode = range.startContainer; + if (treeWalker.currentNode.nodeType === Node.TEXT_NODE || treeWalker.nextNode()) { + do { + if (treeWalker.currentNode.nodeValue !== '\n') { + if (treeWalker.currentNode === range.endContainer && + range.endOffset < treeWalker.currentNode.nodeValue.length + ) { + treeWalker.currentNode.splitText(range.endOffset); + } + if (startOffset) { + treeWalker.currentNode = treeWalker.currentNode.splitText(startOffset); + startOffset = 0; + } + const elt = document.createElement('span'); + Object.entries(eltProperties).forEach(([key, value]) => { + elt[key] = value; + }); + treeWalker.currentNode.parentNode.insertBefore(elt, treeWalker.currentNode); + elt.appendChild(treeWalker.currentNode); + } + wrappedLength += treeWalker.currentNode.nodeValue.length; + if (wrappedLength >= rangeLength) { + break; + } + } + while (treeWalker.nextNode()); + } + }, + unwrapRange(eltCollection) { + Array.prototype.slice.call(eltCollection).forEach((elt) => { + // Loop in case another wrapper has been added inside + for (let child = elt.firstChild; child; child = elt.firstChild) { + if (child.nodeType === 3) { + if (elt.previousSibling && elt.previousSibling.nodeType === 3) { + child.nodeValue = elt.previousSibling.nodeValue + child.nodeValue; + elt.parentNode.removeChild(elt.previousSibling); + } + if (!child.nextSibling && elt.nextSibling && elt.nextSibling.nodeType === 3) { + child.nodeValue += elt.nextSibling.nodeValue; + elt.parentNode.removeChild(elt.nextSibling); + } + } + elt.parentNode.insertBefore(child, elt); + } + elt.parentNode.removeChild(elt); + }); + }, + getAbsoluteDir(currDirNode) { + if (!currDirNode) { + return ''; + } + let path = currDirNode.item.name; + if (currDirNode.parentNode) { + const parentPath = this.getAbsoluteDir(currDirNode.parentNode); + if (parentPath) { + path = `${parentPath}/${path}`; + } + } + return path || ''; + }, + // 根据当前绝对路径 与 文件路径计算出文件绝对路径 + getAbsoluteFilePath(currDirNode, originFilePath) { + const filePath = originFilePath && originFilePath.replaceAll('\\', '/'); + const currAbsolutePath = this.getAbsoluteDir(currDirNode); + // "/"开头说明已经是绝对路径 + if (filePath.indexOf('/') === 0) { + return filePath.replaceAll(' ', '%20'); + } + let path = filePath; + // 相对上级路径 + if (path.indexOf('../') === 0) { + return this.getAbsoluteFilePath(currDirNode && currDirNode.parentNode, path.replace('../', '')); + } else if (path.indexOf('./') === 0) { + path = `${currAbsolutePath}/${path.replace('./', '')}`; + } else { + path = `${currAbsolutePath}/${path}`; + } + return (path.indexOf('/') === 0 ? path : `/${path}`).replaceAll(' ', '%20'); + }, + findNodeByPath(rootNode, currDirNode, filePath) { + // 先获取绝对路径 + const path = this.getAbsoluteFilePath(currDirNode, filePath).replaceAll('%20', ' '); + const pathArr = path.split('/'); + let node = rootNode; + for (let i = 0; i < pathArr.length; i += 1) { + if (i > 0) { + if (i === pathArr.length - 1) { + return node.files.find(it => `${it.item.name}.md` === pathArr[i]); + } + node = node.folders.find(it => it.item.name === pathArr[i]); + if (!node) { + return null; + } + } + } + return null; + }, +}; diff --git a/src/services/workspaceSvc.js b/src/services/workspaceSvc.js new file mode 100644 index 0000000..c950554 --- /dev/null +++ b/src/services/workspaceSvc.js @@ -0,0 +1,312 @@ +import store from '../store'; +import utils from './utils'; +import constants from '../data/constants'; +import badgeSvc from './badgeSvc'; + +const forbiddenFolderNameMatcher = /^\.stackedit-data$|^\.stackedit-trash$|\.md$|\.sync$|\.publish$/; + +export default { + + /** + * Create a file in the store with the specified fields. + */ + async createFile({ + name, + parentId, + text, + properties, + discussions, + comments, + } = {}, background = false) { + const id = utils.uid(); + const item = { + id, + name: utils.sanitizeFilename(name), + parentId: parentId || null, + }; + const content = { + id: `${id}/content`, + text: utils.sanitizeText(text || store.getters['data/computedSettings'].newFileContent), + properties: utils + .sanitizeText(properties || store.getters['data/computedSettings'].newFileProperties), + discussions: discussions || {}, + comments: comments || {}, + }; + const workspaceUniquePaths = store.getters['workspace/currentWorkspaceHasUniquePaths']; + + // Show warning dialogs + if (!background) { + // If name is being stripped + if (item.name !== constants.defaultName && item.name !== name) { + await store.dispatch('modal/open', { + type: 'stripName', + item, + }); + } + + // Check if there is already a file with that path + if (workspaceUniquePaths) { + const parentPath = store.getters.pathsByItemId[item.parentId] || ''; + const path = parentPath + item.name; + if (store.getters.itemsByPath[path]) { + await store.dispatch('modal/open', { + type: 'pathConflict', + item, + }); + } + } + } + + // Save file and content in the store + store.commit('content/setItem', content); + store.commit('file/setItem', item); + if (workspaceUniquePaths) { + this.makePathUnique(id); + } + + // Return the new file item + return store.state.file.itemsById[id]; + }, + + /** + * Make sanity checks and then create/update the folder/file in the store. + */ + async storeItem(item) { + const id = item.id || utils.uid(); + const sanitizedName = utils.sanitizeFilename(item.name); + + if (item.type === 'folder' && forbiddenFolderNameMatcher.exec(sanitizedName)) { + await store.dispatch('modal/open', { + type: 'unauthorizedName', + item, + }); + throw new Error('未经授权的名称。'); + } + + // Show warning dialogs + // If name has been stripped + if (sanitizedName !== constants.defaultName && sanitizedName !== item.name) { + await store.dispatch('modal/open', { + type: 'stripName', + item, + }); + } + + // Check if there is a path conflict + if (store.getters['workspace/currentWorkspaceHasUniquePaths']) { + const parentPath = store.getters.pathsByItemId[item.parentId] || ''; + const path = parentPath + sanitizedName; + const items = store.getters.itemsByPath[path] || []; + if (items.some(itemWithSamePath => itemWithSamePath.id !== id)) { + await store.dispatch('modal/open', { + type: 'pathConflict', + item, + }); + } + } + + return this.setOrPatchItem({ + ...item, + id, + }); + }, + + /** + * Create/update the folder/file in the store and make sure its path is unique. + */ + setOrPatchItem(patch) { + const item = { + ...store.getters.allItemsById[patch.id] || patch, + }; + if (!item.id) { + return null; + } + + if (patch.parentId !== undefined) { + item.parentId = patch.parentId || null; + } + if (patch.name) { + const sanitizedName = utils.sanitizeFilename(patch.name); + if (item.type !== 'folder' || !forbiddenFolderNameMatcher.exec(sanitizedName)) { + item.name = sanitizedName; + } + } + + // Save item in the store + store.commit(`${item.type}/setItem`, item); + + // Remove circular reference + this.removeCircularReference(item); + + // Ensure path uniqueness + if (store.getters['workspace/currentWorkspaceHasUniquePaths']) { + this.makePathUnique(item.id); + } + + return store.getters.allItemsById[item.id]; + }, + + /** + * Delete a file in the store and all its related items. + */ + deleteFile(fileId) { + // Delete the file + store.commit('file/deleteItem', fileId); + // Delete the content + store.commit('content/deleteItem', `${fileId}/content`); + // Delete the syncedContent + store.commit('syncedContent/deleteItem', `${fileId}/syncedContent`); + // Delete the contentState + store.commit('contentState/deleteItem', `${fileId}/contentState`); + // Delete sync locations + (store.getters['syncLocation/groupedByFileId'][fileId] || []) + .forEach(item => store.commit('syncLocation/deleteItem', item.id)); + // Delete publish locations + (store.getters['publishLocation/groupedByFileId'][fileId] || []) + .forEach(item => store.commit('publishLocation/deleteItem', item.id)); + }, + + /** + * Sanitize the whole workspace. + */ + sanitizeWorkspace(idsToKeep) { + // Detect and remove circular references for all folders. + store.getters['folder/items'].forEach(folder => this.removeCircularReference(folder)); + + this.ensureUniquePaths(idsToKeep); + this.ensureUniqueLocations(idsToKeep); + }, + + /** + * Detect and remove circular reference for an item. + */ + removeCircularReference(item) { + const foldersById = store.state.folder.itemsById; + for ( + let parentFolder = foldersById[item.parentId]; + parentFolder; + parentFolder = foldersById[parentFolder.parentId] + ) { + if (parentFolder.id === item.id) { + store.commit('folder/patchItem', { + id: item.id, + parentId: null, + }); + break; + } + } + }, + + /** + * Ensure two files/folders don't have the same path if the workspace doesn't allow it. + */ + ensureUniquePaths(idsToKeep = {}) { + if (store.getters['workspace/currentWorkspaceHasUniquePaths']) { + if (Object.keys(store.getters.pathsByItemId) + .some(id => !idsToKeep[id] && this.makePathUnique(id)) + ) { + // Just changed one item path, restart + this.ensureUniquePaths(idsToKeep); + } + } + }, + + /** + * Return false if the file/folder path is unique. + * Add a prefix to its name and return true otherwise. + */ + makePathUnique(id) { + const { itemsByPath, allItemsById, pathsByItemId } = store.getters; + const item = allItemsById[id]; + if (!item) { + return false; + } + let path = pathsByItemId[id]; + if (itemsByPath[path].length === 1) { + return false; + } + const isFolder = item.type === 'folder'; + if (isFolder) { + // Remove trailing slash + path = path.slice(0, -1); + } + for (let suffix = 1; ; suffix += 1) { + let pathWithSuffix = `${path}.${suffix}`; + if (isFolder) { + pathWithSuffix += '/'; + } + if (!itemsByPath[pathWithSuffix]) { + store.commit(`${item.type}/patchItem`, { + id: item.id, + name: `${item.name}.${suffix}`, + }); + return true; + } + } + }, + + addSyncLocation(location) { + store.commit('syncLocation/setItem', { + ...location, + id: utils.uid(), + }); + + // Sanitize the workspace + this.ensureUniqueLocations(); + + if (Object.keys(store.getters['syncLocation/currentWithWorkspaceSyncLocation']).length > 1) { + badgeSvc.addBadge('syncMultipleLocations'); + } + }, + + addPublishLocation(location) { + store.commit('publishLocation/setItem', { + ...location, + id: utils.uid(), + }); + + // Sanitize the workspace + this.ensureUniqueLocations(); + + if (Object.keys(store.getters['publishLocation/current']).length > 1) { + badgeSvc.addBadge('publishMultipleLocations'); + } + }, + + /** + * Ensure two sync/publish locations of the same file don't have the same hash. + */ + ensureUniqueLocations(idsToKeep = {}) { + ['syncLocation', 'publishLocation'].forEach((type) => { + store.getters[`${type}/items`].forEach((item) => { + if (!idsToKeep[item.id] + && store.getters[`${type}/groupedByFileIdAndHash`][item.fileId][item.hash].length > 1 + ) { + store.commit(`${item.type}/deleteItem`, item.id); + } + }); + }); + }, + + /** + * Drop the database and clean the localStorage for the specified workspaceId. + */ + async removeWorkspace(id) { + // Remove from the store first as workspace tabs will reload. + // Workspace deletion will be persisted as soon as possible + // by the store.getters['data/workspaces'] watcher in localDbSvc. + store.dispatch('workspace/removeWorkspace', id); + + // Drop the database + await new Promise((resolve) => { + const dbName = utils.getDbName(id); + const request = indexedDB.deleteDatabase(dbName); + request.onerror = resolve; // Ignore errors + request.onsuccess = resolve; + }); + + // Clean the local storage + localStorage.removeItem(`${id}/lastSyncActivity`); + localStorage.removeItem(`${id}/lastWindowFocus`); + }, +}; diff --git a/src/store/content.js b/src/store/content.js new file mode 100644 index 0000000..2e82d1f --- /dev/null +++ b/src/store/content.js @@ -0,0 +1,114 @@ +import DiffMatchPatch from 'diff-match-patch'; +import moduleTemplate from './moduleTemplate'; +import empty from '../data/empties/emptyContent'; +import utils from '../services/utils'; +import cledit from '../services/editor/cledit'; +import badgeSvc from '../services/badgeSvc'; + +const diffMatchPatch = new DiffMatchPatch(); + +const module = moduleTemplate(empty); + +module.state = { + ...module.state, + revisionContent: null, +}; + +module.mutations = { + ...module.mutations, + setRevisionContent: (state, value) => { + if (value) { + state.revisionContent = { + ...empty(), + ...value, + id: utils.uid(), + hash: Date.now(), + }; + } else { + state.revisionContent = null; + } + }, +}; + +module.getters = { + ...module.getters, + current: ({ itemsById, revisionContent }, getters, rootState, rootGetters) => { + if (revisionContent) { + return revisionContent; + } + return itemsById[`${rootGetters['file/current'].id}/content`] || empty(); + }, + currentChangeTrigger: (state, getters) => { + const { current } = getters; + return utils.serializeObject([ + current.id, + current.text, + current.hash, + ]); + }, + currentProperties: (state, { current }) => utils.computeProperties(current.properties), + isCurrentEditable: ({ revisionContent }, { current }, rootState, rootGetters) => + !revisionContent && current.id && rootGetters['layout/styles'].showEditor, +}; + +module.actions = { + ...module.actions, + patchCurrent({ state, getters, commit }, value) { + const { id } = getters.current; + if (id && !state.revisionContent) { + commit('patchItem', { + ...value, + id, + }); + } + }, + setRevisionContent({ state, rootGetters, commit }, value) { + const currentFile = rootGetters['file/current']; + const currentContent = state.itemsById[`${currentFile.id}/content`]; + if (currentContent) { + const diffs = diffMatchPatch.diff_main(currentContent.text, value.text); + diffMatchPatch.diff_cleanupSemantic(diffs); + commit('setRevisionContent', { + text: diffs.map(([, text]) => text).join(''), + diffs, + originalText: value.text, + }); + } + }, + async restoreRevision({ + state, + getters, + commit, + dispatch, + }) { + const { revisionContent } = state; + if (revisionContent) { + await dispatch('modal/open', 'fileRestoration', { root: true }); + // Close revision + commit('setRevisionContent'); + const currentContent = utils.deepCopy(getters.current); + if (currentContent) { + // Restore text and move discussions + const diffs = diffMatchPatch + .diff_main(currentContent.text, revisionContent.originalText); + diffMatchPatch.diff_cleanupSemantic(diffs); + Object.entries(currentContent.discussions).forEach(([, discussion]) => { + const adjustOffset = (offsetName) => { + const marker = new cledit.Marker(discussion[offsetName], offsetName === 'end'); + marker.adjustOffset(diffs); + discussion[offsetName] = marker.offset; + }; + adjustOffset('start'); + adjustOffset('end'); + }); + dispatch('patchCurrent', { + ...currentContent, + text: revisionContent.originalText, + }); + badgeSvc.addBadge('restoreVersion'); + } + } + }, +}; + +export default module; diff --git a/src/store/contentState.js b/src/store/contentState.js new file mode 100644 index 0000000..3cbcb1b --- /dev/null +++ b/src/store/contentState.js @@ -0,0 +1,22 @@ +import moduleTemplate from './moduleTemplate'; +import empty from '../data/empties/emptyContentState'; + +const module = moduleTemplate(empty, true); + +module.getters = { + ...module.getters, + current: ({ itemsById }, getters, rootState, rootGetters) => + itemsById[`${rootGetters['file/current'].id}/contentState`] || empty(), +}; + +module.actions = { + ...module.actions, + patchCurrent({ getters, commit }, value) { + commit('patchItem', { + ...value, + id: getters.current.id, + }); + }, +}; + +export default module; diff --git a/src/store/contextMenu.js b/src/store/contextMenu.js new file mode 100644 index 0000000..6b4180e --- /dev/null +++ b/src/store/contextMenu.js @@ -0,0 +1,55 @@ +const setter = propertyName => (state, value) => { + state[propertyName] = value; +}; + +export default { + namespaced: true, + state: { + coordinates: { + left: 0, + top: 0, + }, + items: [], + resolve: () => {}, + }, + mutations: { + setCoordinates: setter('coordinates'), + setItems: setter('items'), + setResolve: setter('resolve'), + }, + actions: { + open({ commit, rootState }, { coordinates, items }) { + commit('setItems', items); + // Place the context menu outside the screen + commit('setCoordinates', { top: 0, left: -9999 }); + // Let the UI refresh itself + setTimeout(() => { + // Take the size of the context menu and place it + const elt = document.querySelector('.context-menu__inner'); + if (elt) { + const height = elt.offsetHeight; + if (coordinates.top + height > rootState.layout.bodyHeight) { + coordinates.top -= height; + } + if (coordinates.top < 0) { + coordinates.top = 0; + } + const width = elt.offsetWidth; + if (coordinates.left + width > rootState.layout.bodyWidth) { + coordinates.left -= width; + } + if (coordinates.left < 0) { + coordinates.left = 0; + } + commit('setCoordinates', coordinates); + } + }, 1); + + return new Promise(resolve => commit('setResolve', resolve)); + }, + close({ commit }) { + commit('setItems', []); + commit('setResolve', () => {}); + }, + }, +}; diff --git a/src/store/data.js b/src/store/data.js new file mode 100644 index 0000000..374e987 --- /dev/null +++ b/src/store/data.js @@ -0,0 +1,338 @@ +import Vue from 'vue'; +import yaml from 'js-yaml'; +import utils from '../services/utils'; +import defaultWorkspaces from '../data/defaults/defaultWorkspaces'; +import defaultSettings from '../data/defaults/defaultSettings.yml'; +import defaultLocalSettings from '../data/defaults/defaultLocalSettings'; +import defaultLayoutSettings from '../data/defaults/defaultLayoutSettings'; +import plainHtmlTemplate from '../data/templates/plainHtmlTemplate.html'; +import styledHtmlTemplate from '../data/templates/styledHtmlTemplate.html'; +import styledHtmlWithTocTemplate from '../data/templates/styledHtmlWithTocTemplate.html'; +import styledHtmlWithThemeTemplate from '../data/templates/styledHtmlWithThemeTemplate.html'; +import styledHtmlWithThemeAndTocTemplate from '../data/templates/styledHtmlWithThemeAndTocTemplate.html'; +import jekyllSiteTemplate from '../data/templates/jekyllSiteTemplate.html'; +import constants from '../data/constants'; +import features from '../data/features'; +import badgeSvc from '../services/badgeSvc'; + +const itemTemplate = (id, data = {}) => ({ + id, + type: 'data', + data, + hash: 0, +}); + +const empty = (id) => { + switch (id) { + case 'workspaces': + return itemTemplate(id, defaultWorkspaces()); + case 'settings': + return itemTemplate(id, '\n'); + case 'localSettings': + return itemTemplate(id, defaultLocalSettings()); + case 'layoutSettings': + return itemTemplate(id, defaultLayoutSettings()); + default: + return itemTemplate(id); + } +}; + +// Item IDs that will be stored in the localStorage +const localStorageIdSet = new Set(constants.localStorageDataIds); + +// Getter/setter/patcher factories +const getter = id => (state) => { + const itemsById = localStorageIdSet.has(id) + ? state.lsItemsById + : state.itemsById; + if (itemsById[id]) { + return itemsById[id].data; + } + return empty(id).data; +}; +const setter = id => ({ commit }, data) => commit('setItem', itemTemplate(id, data)); +const patcher = id => ({ state, commit }, data) => { + const itemsById = localStorageIdSet.has(id) + ? state.lsItemsById + : state.itemsById; + const item = Object.assign(empty(id), itemsById[id]); + commit('setItem', { + ...empty(id), + data: typeof data === 'object' ? { + ...item.data, + ...data, + } : data, + }); +}; + +// For layoutSettings +const toggleLayoutSetting = (name, value, featureId, getters, dispatch) => { + const currentValue = getters.layoutSettings[name]; + const patch = { + [name]: value === undefined ? !currentValue : !!value, + }; + if (patch[name] !== currentValue) { + dispatch('patchLayoutSettings', patch); + badgeSvc.addBadge(featureId); + } +}; + +const layoutSettingsToggler = (propertyName, featureId) => ({ getters, dispatch }, value) => + toggleLayoutSetting(propertyName, value, featureId, getters, dispatch); + +const notEnoughSpace = (layoutConstants, showGutter) => + document.body.clientWidth < layoutConstants.editorMinWidth + + layoutConstants.explorerWidth + + layoutConstants.sideBarWidth + + layoutConstants.buttonBarWidth + + (showGutter ? layoutConstants.gutterWidth : 0); + +// For templates +const makeAdditionalTemplate = (name, value, helpers = '\n') => ({ + name, + value, + helpers, + isAdditional: true, +}); +const defaultTemplates = { + plainText: makeAdditionalTemplate('Markdown文本', '{{{files.0.content.text}}}'), + plainHtml: makeAdditionalTemplate('无样式HTML', plainHtmlTemplate), + styledHtml: makeAdditionalTemplate('标准样式HTML', styledHtmlTemplate), + styledHtmlWithToc: makeAdditionalTemplate('带目录标准样式HTML', styledHtmlWithTocTemplate), + styledHtmlWithTheme: makeAdditionalTemplate('带预览主题HTML', styledHtmlWithThemeTemplate), + styledHtmlWithThemeAndToc: makeAdditionalTemplate('带目录预览主题HTML', styledHtmlWithThemeAndTocTemplate), + jekyllSite: makeAdditionalTemplate('Jekyll site', jekyllSiteTemplate), +}; + +// For tokens +const tokenAdder = providerId => ({ getters, dispatch }, token) => { + dispatch('patchTokensByType', { + [providerId]: { + ...getters[`${providerId}TokensBySub`], + [token.sub]: token, + }, + }); +}; + +export default { + namespaced: true, + state: { + // Data items stored in the DB + itemsById: {}, + // Data items stored in the localStorage + lsItemsById: {}, + }, + mutations: { + setItem: ({ itemsById, lsItemsById }, value) => { + // Create an empty item and override its data field + const emptyItem = empty(value.id); + const data = typeof value.data === 'object' + ? Object.assign(emptyItem.data, value.data) + : value.data; + + // Make item with hash + const item = utils.addItemHash({ + ...emptyItem, + data, + }); + + // Store item in itemsById or lsItemsById if its stored in the localStorage + Vue.set(localStorageIdSet.has(item.id) ? lsItemsById : itemsById, item.id, item); + }, + deleteItem({ itemsById }, id) { + // Only used by localDbSvc to clean itemsById from object moved to localStorage + Vue.delete(itemsById, id); + }, + }, + getters: { + serverConf: getter('serverConf'), + workspaces: getter('workspaces'), // Not to be used, prefer workspace/workspacesById + settings: getter('settings'), + computedSettings: (state, { settings }) => { + const customSettings = yaml.safeLoad(settings); + const parsedSettings = yaml.safeLoad(defaultSettings); + const override = (obj, opt) => { + const objType = Object.prototype.toString.call(obj); + const optType = Object.prototype.toString.call(opt); + if (objType !== optType) { + return obj; + } else if (objType !== '[object Object]') { + return opt; + } + Object.keys(obj).forEach((key) => { + if (key === 'shortcuts') { + obj[key] = Object.assign(obj[key], opt[key]); + } else { + obj[key] = override(obj[key], opt[key]); + } + }); + return obj; + }; + return override(parsedSettings, customSettings); + }, + localSettings: getter('localSettings'), + layoutSettings: getter('layoutSettings'), + templatesById: getter('templates'), + allTemplatesById: (state, { templatesById }) => ({ + ...templatesById, + ...defaultTemplates, + }), + lastCreated: getter('lastCreated'), + lastOpened: getter('lastOpened'), + lastOpenedIds: (state, { lastOpened }, rootState) => { + const result = { + ...lastOpened, + }; + const currentFileId = rootState.file.currentId; + if (currentFileId && !result[currentFileId]) { + result[currentFileId] = Date.now(); + } + return Object.keys(result) + .filter(id => rootState.file.itemsById[id]) + .sort((id1, id2) => result[id2] - result[id1]) + .slice(0, 20); + }, + syncDataById: getter('syncData'), + syncDataByItemId: (state, { syncDataById }, rootState, rootGetters) => { + const result = {}; + if (rootGetters['workspace/currentWorkspaceIsGit']) { + Object.entries(rootGetters.gitPathsByItemId).forEach(([id, path]) => { + const syncDataEntry = syncDataById[path]; + if (syncDataEntry) { + result[id] = syncDataEntry; + } + }); + } else { + Object.entries(syncDataById).forEach(([, syncDataEntry]) => { + result[syncDataEntry.itemId] = syncDataEntry; + }); + } + return result; + }, + dataSyncDataById: getter('dataSyncData'), + tokensByType: getter('tokens'), + googleTokensBySub: (state, { tokensByType }) => tokensByType.google || {}, + couchdbTokensBySub: (state, { tokensByType }) => tokensByType.couchdb || {}, + dropboxTokensBySub: (state, { tokensByType }) => tokensByType.dropbox || {}, + githubTokensBySub: (state, { tokensByType }) => tokensByType.github || {}, + giteeTokensBySub: (state, { tokensByType }) => tokensByType.gitee || {}, + gitlabTokensBySub: (state, { tokensByType }) => tokensByType.gitlab || {}, + giteaTokensBySub: (state, { tokensByType }) => tokensByType.gitea || {}, + wordpressTokensBySub: (state, { tokensByType }) => tokensByType.wordpress || {}, + zendeskTokensBySub: (state, { tokensByType }) => tokensByType.zendesk || {}, + smmsTokensBySub: (state, { tokensByType }) => tokensByType.smms || {}, + customTokensBySub: (state, { tokensByType }) => tokensByType.custom || {}, + badgeCreations: getter('badgeCreations'), + badgeTree: (state, { badgeCreations }) => features + .map(feature => feature.toBadge(badgeCreations)), + allBadges: (state, { badgeTree }) => { + const result = []; + const processBadgeNodes = nodes => nodes.forEach((node) => { + result.push(node); + if (node.children) { + processBadgeNodes(node.children); + } + }); + processBadgeNodes(badgeTree); + return result; + }, + }, + actions: { + setServerConf: setter('serverConf'), + setSettings: setter('settings'), + switchThemeSetting: ({ commit, getters }) => { + const customSettingStr = getters.settings; + let { colorTheme } = getters.computedSettings; + if (!colorTheme || colorTheme === 'light') { + colorTheme = 'dark'; + } else { + colorTheme = 'light'; + } + const themeStr = `colorTheme: ${colorTheme}`; + let settingsStr = (customSettingStr && customSettingStr.trim()) || '# 增加您的自定义配置覆盖默认配置'; + settingsStr = settingsStr.indexOf('colorTheme:') > -1 ? + settingsStr.replace(/.*colorTheme:.*/, themeStr) : `${settingsStr}\n${themeStr}`; + commit('setItem', itemTemplate('settings', settingsStr)); + badgeSvc.addBadge('switchTheme'); + }, + patchLocalSettings: patcher('localSettings'), + patchLayoutSettings: patcher('layoutSettings'), + toggleNavigationBar: layoutSettingsToggler('showNavigationBar', 'toggleNavigationBar'), + toggleEditor: layoutSettingsToggler('showEditor', 'toggleEditor'), + toggleSidePreview: layoutSettingsToggler('showSidePreview', 'toggleSidePreview'), + toggleStatusBar: layoutSettingsToggler('showStatusBar', 'toggleStatusBar'), + toggleScrollSync: layoutSettingsToggler('scrollSync', 'toggleScrollSync'), + toggleFocusMode: layoutSettingsToggler('focusMode', 'toggleFocusMode'), + toggleSideBar: ({ getters, dispatch, rootGetters }, value) => { + // Reset side bar + dispatch('setSideBarPanel'); + + // Toggle it + toggleLayoutSetting('showSideBar', value, 'toggleSideBar', getters, dispatch); + + // Close explorer if not enough space + if (getters.layoutSettings.showSideBar && + notEnoughSpace(rootGetters['layout/constants'], rootGetters['discussion/currentDiscussion']) + ) { + dispatch('patchLayoutSettings', { + showExplorer: false, + }); + } + }, + toggleExplorer: ({ getters, dispatch, rootGetters }, value) => { + // Toggle explorer + toggleLayoutSetting('showExplorer', value, 'toggleExplorer', getters, dispatch); + + // Close side bar if not enough space + if (getters.layoutSettings.showExplorer && + notEnoughSpace(rootGetters['layout/constants'], rootGetters['discussion/currentDiscussion']) + ) { + dispatch('patchLayoutSettings', { + showSideBar: false, + }); + } + }, + setSideBarPanel: ({ dispatch }, value) => dispatch('patchLayoutSettings', { + sideBarPanel: value === undefined ? 'menu' : value, + }), + setTemplatesById: ({ commit }, templatesById) => { + const templatesToCommit = { + ...templatesById, + }; + // We don't store additional templates + Object.keys(defaultTemplates).forEach((id) => { + delete templatesToCommit[id]; + }); + commit('setItem', itemTemplate('templates', templatesToCommit)); + }, + setLastCreated: setter('lastCreated'), + setLastOpenedId: ({ getters, commit, rootState }, fileId) => { + const lastOpened = { ...getters.lastOpened }; + lastOpened[fileId] = Date.now(); + // Remove entries that don't exist anymore + const cleanedLastOpened = {}; + Object.entries(lastOpened).forEach(([id, value]) => { + if (rootState.file.itemsById[id]) { + cleanedLastOpened[id] = value; + } + }); + commit('setItem', itemTemplate('lastOpened', cleanedLastOpened)); + }, + setSyncDataById: setter('syncData'), + patchSyncDataById: patcher('syncData'), + patchDataSyncDataById: patcher('dataSyncData'), + patchTokensByType: patcher('tokens'), + addGoogleToken: tokenAdder('google'), + addCouchdbToken: tokenAdder('couchdb'), + addDropboxToken: tokenAdder('dropbox'), + addGithubToken: tokenAdder('github'), + addGiteeToken: tokenAdder('gitee'), + addGitlabToken: tokenAdder('gitlab'), + addGiteaToken: tokenAdder('gitea'), + addWordpressToken: tokenAdder('wordpress'), + addZendeskToken: tokenAdder('zendesk'), + patchBadgeCreations: patcher('badgeCreations'), + addSmmsToken: tokenAdder('smms'), + addCustomToken: tokenAdder('custom'), + }, +}; diff --git a/src/store/discussion.js b/src/store/discussion.js new file mode 100644 index 0000000..ebd33ab --- /dev/null +++ b/src/store/discussion.js @@ -0,0 +1,187 @@ +import utils from '../services/utils'; +import giteeHelper from '../services/providers/helpers/giteeHelper'; +import githubHelper from '../services/providers/helpers/githubHelper'; +import syncSvc from '../services/syncSvc'; + +const idShifter = offset => (state, getters) => { + const ids = Object.keys(getters.currentFileDiscussions) + .filter(id => id !== state.newDiscussionId); + const idx = ids.indexOf(state.currentDiscussionId) + offset + ids.length; + return ids[idx % ids.length]; +}; + +export default { + namespaced: true, + state: { + currentDiscussionId: null, + newDiscussion: null, + newDiscussionId: null, + isCommenting: false, + newCommentText: '', + newCommentSelection: { start: 0, end: 0 }, + newCommentFocus: false, + stickyComment: null, + }, + mutations: { + setCurrentDiscussionId: (state, value) => { + if (state.currentDiscussionId !== value) { + state.currentDiscussionId = value; + state.isCommenting = false; + } + }, + setNewDiscussion: (state, value) => { + state.newDiscussion = value; + state.newDiscussionId = utils.uid(); + state.currentDiscussionId = state.newDiscussionId; + state.isCommenting = true; + state.newCommentFocus = true; + }, + patchNewDiscussion: (state, value) => { + Object.assign(state.newDiscussion, value); + }, + setIsCommenting: (state, value) => { + state.isCommenting = value; + if (!value) { + state.newDiscussionId = null; + } else { + state.newCommentFocus = true; + } + }, + setNewCommentText: (state, value) => { + state.newCommentText = value || ''; + }, + setNewCommentSelection: (state, value) => { + state.newCommentSelection = value; + }, + setNewCommentFocus: (state, value) => { + state.newCommentFocus = value; + }, + setStickyComment: (state, value) => { + state.stickyComment = value; + }, + }, + getters: { + newDiscussion: ({ currentDiscussionId, newDiscussionId, newDiscussion }) => + currentDiscussionId === newDiscussionId && newDiscussion, + currentFileDiscussionLastComments: (state, getters, rootState, rootGetters) => { + const { discussions, comments } = rootGetters['content/current']; + const discussionLastComments = {}; + Object.entries(comments).forEach(([, comment]) => { + if (discussions[comment.discussionId]) { + const lastComment = discussionLastComments[comment.discussionId]; + if (!lastComment || lastComment.created < comment.created) { + discussionLastComments[comment.discussionId] = comment; + } + } + }); + return discussionLastComments; + }, + currentFileDiscussions: ( + { newDiscussionId }, + { newDiscussion, currentFileDiscussionLastComments }, + rootState, + rootGetters, + ) => { + const currentFileDiscussions = {}; + if (newDiscussion) { + currentFileDiscussions[newDiscussionId] = newDiscussion; + } + const { discussions } = rootGetters['content/current']; + Object.entries(currentFileDiscussionLastComments) + .sort(([, lastComment1], [, lastComment2]) => + lastComment1.created - lastComment2.created) + .forEach(([discussionId]) => { + currentFileDiscussions[discussionId] = discussions[discussionId]; + }); + return currentFileDiscussions; + }, + currentDiscussion: ({ currentDiscussionId }, { currentFileDiscussions }) => + currentFileDiscussions[currentDiscussionId], + previousDiscussionId: idShifter(-1), + nextDiscussionId: idShifter(1), + currentDiscussionComments: ( + { currentDiscussionId }, + { currentDiscussion }, + rootState, + rootGetters, + ) => { + const comments = {}; + if (currentDiscussion) { + const contentComments = rootGetters['content/current'].comments; + Object.entries(contentComments) + .filter(([, comment]) => + comment.discussionId === currentDiscussionId) + .sort(([, comment1], [, comment2]) => + comment1.created - comment2.created) + .forEach(([commentId, comment]) => { + comments[commentId] = comment; + }); + } + return comments; + }, + currentDiscussionLastCommentId: (state, { currentDiscussionComments }) => + Object.keys(currentDiscussionComments).pop(), + currentDiscussionLastComment: ( + state, + { currentDiscussionComments, currentDiscussionLastCommentId }, + ) => currentDiscussionComments[currentDiscussionLastCommentId], + }, + actions: { + cancelNewComment({ commit, getters }) { + commit('setIsCommenting', false); + if (!getters.currentDiscussion) { + commit('setCurrentDiscussionId', getters.nextDiscussionId); + } + }, + async createNewDiscussion({ commit, dispatch, rootGetters }, selection) { + const loginToken = rootGetters['workspace/loginToken']; + if (!loginToken) { + try { + const signInWhere = await dispatch('modal/open', 'signInForComment', { root: true }); + if (signInWhere === 'github') { + await githubHelper.signin(); + } else { + await giteeHelper.signin(); + } + await syncSvc.afterSignIn(); + syncSvc.requestSync(); + await dispatch('createNewDiscussion', selection); + } catch (e) { /* cancel */ } + } else if (selection) { + let text = rootGetters['content/current'].text.slice(selection.start, selection.end).trim(); + const maxLength = 80; + if (text.length > maxLength) { + text = `${text.slice(0, maxLength - 1).trim()}…`; + } + commit('setNewDiscussion', { ...selection, text }); + } + }, + cleanCurrentFile({ + getters, + rootGetters, + commit, + dispatch, + }, { filterComment, filterDiscussion } = {}) { + const { discussions } = rootGetters['content/current']; + const { comments } = rootGetters['content/current']; + const patch = { + discussions: {}, + comments: {}, + }; + Object.entries(comments).forEach(([commentId, comment]) => { + const discussion = discussions[comment.discussionId]; + if (discussion && comment !== filterComment && discussion !== filterDiscussion) { + patch.discussions[comment.discussionId] = discussion; + patch.comments[commentId] = comment; + } + }); + + const { nextDiscussionId } = getters; + dispatch('content/patchCurrent', patch, { root: true }); + if (!getters.currentDiscussion) { + // Keep the gutter open + commit('setCurrentDiscussionId', nextDiscussionId); + } + }, + }, +}; diff --git a/src/store/explorer.js b/src/store/explorer.js new file mode 100644 index 0000000..9846981 --- /dev/null +++ b/src/store/explorer.js @@ -0,0 +1,217 @@ +import Vue from 'vue'; +import emptyFile from '../data/empties/emptyFile'; +import emptyFolder from '../data/empties/emptyFolder'; + +const setter = propertyName => (state, value) => { + state[propertyName] = value; +}; + +function debounceAction(action, wait) { + let timeoutId; + return (context) => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => action(context), wait); + }; +} + +const collator = new Intl.Collator(undefined, { sensitivity: 'base', numeric: true }); +const compare = (node1, node2) => collator.compare(node1.item.name, node2.item.name); + +class Node { + constructor(item, locations = [], isFolder = false) { + this.item = item; + this.locations = locations; + this.isFolder = isFolder; + if (isFolder) { + this.folders = []; + this.files = []; + } + } + + sortChildren() { + if (this.isFolder) { + this.folders.sort(compare); + this.files.sort(compare); + this.folders.forEach(child => child.sortChildren()); + } + } +} + +const nilFileNode = new Node(emptyFile()); +nilFileNode.isNil = true; +const fakeFileNode = new Node(emptyFile()); +fakeFileNode.item.id = 'fake'; +fakeFileNode.noDrag = true; + +function getParent({ item, isNil }, { nodeMap, rootNode }) { + if (isNil) { + return nilFileNode; + } + return nodeMap[item.parentId] || rootNode; +} + +function getFolder(node, getters) { + return node.item.type === 'folder' ? + node : + getParent(node, getters); +} + +export default { + namespaced: true, + state: { + selectedId: null, + editingId: null, + dragSourceId: null, + dragTargetId: null, + newChildNode: nilFileNode, + openNodes: {}, + }, + mutations: { + setSelectedId: setter('selectedId'), + setEditingId: setter('editingId'), + setDragSourceId: setter('dragSourceId'), + setDragTargetId: setter('dragTargetId'), + setNewItem(state, item) { + state.newChildNode = item ? new Node(item, [], item.type === 'folder') : nilFileNode; + }, + setNewItemName(state, name) { + state.newChildNode.item.name = name; + }, + toggleOpenNode(state, id) { + Vue.set(state.openNodes, id, !state.openNodes[id]); + }, + }, + getters: { + nodeStructure: (state, getters, rootState, rootGetters) => { + const rootNode = new Node(emptyFolder(), [], true); + rootNode.isRoot = true; + + // Create Trash node + const trashFolderNode = new Node(emptyFolder(), [], true); + trashFolderNode.item.id = 'trash'; + trashFolderNode.item.name = '回收站'; + trashFolderNode.noDrag = true; + trashFolderNode.isTrash = true; + trashFolderNode.parentNode = rootNode; + + // Create Temp node + const tempFolderNode = new Node(emptyFolder(), [], true); + tempFolderNode.item.id = 'temp'; + tempFolderNode.item.name = '临时目录'; + tempFolderNode.noDrag = true; + tempFolderNode.noDrop = true; + tempFolderNode.isTemp = true; + tempFolderNode.parentNode = rootNode; + + // Fill nodeMap with all file and folder nodes + const nodeMap = { + trash: trashFolderNode, + temp: tempFolderNode, + }; + rootGetters['folder/items'].forEach((item) => { + nodeMap[item.id] = new Node(item, [], true); + }); + const syncLocationsByFileId = rootGetters['syncLocation/filteredGroupedByFileId']; + const publishLocationsByFileId = rootGetters['publishLocation/filteredGroupedByFileId']; + rootGetters['file/items'].forEach((item) => { + const locations = [ + ...syncLocationsByFileId[item.id] || [], + ...publishLocationsByFileId[item.id] || [], + ]; + nodeMap[item.id] = new Node(item, locations); + }); + + // Build the tree + Object.entries(nodeMap).forEach(([, node]) => { + let parentNode = nodeMap[node.item.parentId]; + if (!parentNode || !parentNode.isFolder) { + if (node.isTrash || node.isTemp) { + return; + } + parentNode = rootNode; + } + if (node.isFolder) { + parentNode.folders.push(node); + } else { + parentNode.files.push(node); + } + node.parentNode = parentNode; + }); + rootNode.sortChildren(); + + // Add Trash and Temp nodes + rootNode.folders.unshift(tempFolderNode); + tempFolderNode.files.forEach((node) => { + node.noDrop = true; + }); + rootNode.folders.unshift(trashFolderNode); + + // Add a fake file at the end of the root folder to allow drag and drop into it + rootNode.files.push(fakeFileNode); + return { + nodeMap, + rootNode, + }; + }, + nodeMap: (state, { nodeStructure }) => nodeStructure.nodeMap, + rootNode: (state, { nodeStructure }) => nodeStructure.rootNode, + newChildNodeParent: (state, getters) => getParent(state.newChildNode, getters), + selectedNode: ({ selectedId }, { nodeMap }) => nodeMap[selectedId] || nilFileNode, + selectedNodeFolder: (state, getters) => getFolder(getters.selectedNode, getters), + editingNode: ({ editingId }, { nodeMap }) => nodeMap[editingId] || nilFileNode, + dragSourceNode: ({ dragSourceId }, { nodeMap }) => nodeMap[dragSourceId] || nilFileNode, + dragTargetNode: ({ dragTargetId }, { nodeMap }) => { + if (dragTargetId === 'fake') { + return fakeFileNode; + } + return nodeMap[dragTargetId] || nilFileNode; + }, + dragTargetNodeFolder: ({ dragTargetId }, getters) => { + if (dragTargetId === 'fake') { + return getters.rootNode; + } + return getFolder(getters.dragTargetNode, getters); + }, + }, + actions: { + openNode({ + state, + getters, + commit, + dispatch, + }, id) { + const node = getters.nodeMap[id]; + if (node) { + if (node.isFolder && !state.openNodes[id]) { + commit('toggleOpenNode', id); + } + dispatch('openNode', node.item.parentId); + } + }, + openDragTarget: debounceAction(({ state, dispatch }) => { + dispatch('openNode', state.dragTargetId); + }, 1000), + setDragTarget({ commit, getters, dispatch }, node) { + if (!node) { + commit('setDragTargetId'); + } else { + // Make sure target node is not a child of source node + const folderNode = getFolder(node, getters); + const sourceId = getters.dragSourceNode.item.id; + const { nodeMap } = getters; + for (let parentNode = folderNode; + parentNode; + parentNode = nodeMap[parentNode.item.parentId] + ) { + if (parentNode.item.id === sourceId) { + commit('setDragTargetId'); + return; + } + } + + commit('setDragTargetId', node.item.id); + dispatch('openDragTarget'); + } + }, + }, +}; diff --git a/src/store/file.js b/src/store/file.js new file mode 100644 index 0000000..3c06a20 --- /dev/null +++ b/src/store/file.js @@ -0,0 +1,36 @@ +import moduleTemplate from './moduleTemplate'; +import empty from '../data/empties/emptyFile'; + +const module = moduleTemplate(empty); + +module.state = { + ...module.state, + currentId: null, +}; + +module.getters = { + ...module.getters, + current: ({ itemsById, currentId }) => itemsById[currentId] || empty(), + isCurrentTemp: (state, { current }) => current.parentId === 'temp', + lastOpened: ({ itemsById }, { items }, rootState, rootGetters) => + itemsById[rootGetters['data/lastOpenedIds'][0]] || items[0] || empty(), +}; + +module.mutations = { + ...module.mutations, + setCurrentId(state, value) { + state.currentId = value; + }, +}; + +module.actions = { + ...module.actions, + patchCurrent({ getters, commit }, value) { + commit('patchItem', { + ...value, + id: getters.current.id, + }); + }, +}; + +export default module; diff --git a/src/store/findReplace.js b/src/store/findReplace.js new file mode 100644 index 0000000..1c37049 --- /dev/null +++ b/src/store/findReplace.js @@ -0,0 +1,32 @@ +export default { + namespaced: true, + state: { + type: null, + lastOpen: 0, + findText: '', + replaceText: '', + }, + mutations: { + setType: (state, value) => { + state.type = value; + }, + setLastOpen: (state) => { + state.lastOpen = Date.now(); + }, + setFindText: (state, value) => { + state.findText = value; + }, + setReplaceText: (state, value) => { + state.replaceText = value; + }, + }, + actions: { + open({ commit }, { type, findText }) { + commit('setType', type); + if (findText) { + commit('setFindText', findText); + } + commit('setLastOpen'); + }, + }, +}; diff --git a/src/store/folder.js b/src/store/folder.js new file mode 100644 index 0000000..715dc46 --- /dev/null +++ b/src/store/folder.js @@ -0,0 +1,6 @@ +import moduleTemplate from './moduleTemplate'; +import empty from '../data/empties/emptyFolder'; + +const module = moduleTemplate(empty); + +export default module; diff --git a/src/store/img.js b/src/store/img.js new file mode 100644 index 0000000..fe40455 --- /dev/null +++ b/src/store/img.js @@ -0,0 +1,89 @@ +import utils from '../services/utils'; + +const checkStorageLocalKey = 'img/checkedStorage'; +const workspacePathLocalKey = 'img/workspaceImgPath'; + +export default { + namespaced: true, + state: { + // 当前图片上传中的临时ID + currImgId: null, + // 选择的存储图床信息 + checkedStorage: { + type: 'workspace', // 目前存储类型分三种 token 与 tokenRepo 、workspace + provider: null, // 对应是何种账号 + sub: '/imgs/{YYYY}-{MM}-{DD}', // 对应 token 中的sub + sid: null, + }, + // 当前仓库图片存储位置 key 为path value 为true + workspaceImagePath: { + '/imgs/{YYYY}-{MM}-{DD}': true, + }, + }, + mutations: { + setCurrImgId: (state, value) => { + state.currImgId = value; + }, + clearCurrImg: (state) => { + state.currImg = null; + }, + changeCheckedStorage: (state, value) => { + if (value) { + state.checkedStorage = { + type: value.type, // 目前存储类型分两种 token 与 tokenRepo + provider: value.provider, // 对应是何种账号 + sub: value.sub, // 对应 token 中的sub + sid: value.sid, + }; + } else { + state.checkedStorage = { + type: null, // 目前存储类型分两种 token 与 tokenRepo + provider: null, // 对应是何种账号 + sub: null, // 对应 token 中的sub + sid: null, + }; + } + }, + setWorkspaceImgPath: (state, value) => { + state.workspaceImagePath = value; + localStorage.setItem(workspacePathLocalKey, JSON.stringify(state.workspaceImagePath)); + }, + addWorkspaceImgPath: (state, value) => { + state.workspaceImagePath[value] = true; + state.workspaceImagePath = utils.deepCopy(state.workspaceImagePath); + localStorage.setItem(workspacePathLocalKey, JSON.stringify(state.workspaceImagePath)); + }, + removeWorkspaceImgPath: (state, value) => { + delete state.workspaceImagePath[value]; + state.workspaceImagePath = utils.deepCopy(state.workspaceImagePath); + localStorage.setItem(workspacePathLocalKey, JSON.stringify(state.workspaceImagePath)); + }, + }, + getters: { + currImgId: state => state.currImgId, + getCheckedStorage: state => state.checkedStorage, + getCheckedStorageSub: state => state.checkedStorage.sub, + getWorkspaceImgPath: state => state.workspaceImagePath, + }, + actions: { + setCurrImgId({ commit }, imgId) { + commit('setCurrImgId', imgId); + }, + clearImg({ commit }) { + commit('clearCurrImg'); + }, + changeCheckedStorage({ commit }, checkedStorage) { + commit('changeCheckedStorage', checkedStorage); + localStorage.setItem(checkStorageLocalKey, JSON.stringify(checkedStorage)); + }, + setWorkspaceImgPath({ commit }, workspaceImgPath) { + commit('setWorkspaceImgPath', workspaceImgPath); + }, + addWorkspaceImgPath({ commit }, workspaceImgPathValue) { + commit('addWorkspaceImgPath', workspaceImgPathValue); + }, + removeWorkspaceImgPath({ commit }, workspaceImgPathValue) { + commit('removeWorkspaceImgPath', workspaceImgPathValue); + }, + }, +}; diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..f81e6ac --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,195 @@ +import createLogger from 'vuex/dist/logger'; +import Vue from 'vue'; +import Vuex from 'vuex'; +import utils from '../services/utils'; +import content from './content'; +import contentState from './contentState'; +import contextMenu from './contextMenu'; +import data from './data'; +import discussion from './discussion'; +import explorer from './explorer'; +import file from './file'; +import findReplace from './findReplace'; +import folder from './folder'; +import layout from './layout'; +import modal from './modal'; +import notification from './notification'; +import queue from './queue'; +import syncedContent from './syncedContent'; +import userInfo from './userInfo'; +import workspace from './workspace'; +import img from './img'; +import theme from './theme'; +import locationTemplate from './locationTemplate'; +import emptyPublishLocation from '../data/empties/emptyPublishLocation'; +import emptySyncLocation from '../data/empties/emptySyncLocation'; +import constants from '../data/constants'; + +Vue.use(Vuex); + +const debug = NODE_ENV !== 'production'; + +const store = new Vuex.Store({ + modules: { + content, + contentState, + contextMenu, + data, + discussion, + explorer, + file, + findReplace, + folder, + layout, + modal, + notification, + publishLocation: locationTemplate(emptyPublishLocation), + queue, + syncedContent, + syncLocation: locationTemplate(emptySyncLocation), + userInfo, + workspace, + img, + theme, + }, + state: { + light: false, + offline: false, + lastOfflineCheck: 0, + timeCounter: 0, + }, + mutations: { + setLight: (state, value) => { + state.light = value; + }, + setOffline: (state, value) => { + state.offline = value; + }, + updateLastOfflineCheck: (state) => { + state.lastOfflineCheck = Date.now(); + }, + updateTimeCounter: (state) => { + state.timeCounter += 1; + }, + }, + getters: { + allItemsById: (state) => { + const result = {}; + constants.types.forEach(type => Object.assign(result, state[type].itemsById)); + return result; + }, + pathsByItemId: (state, getters) => { + const result = {}; + const processNode = (node, parentPath = '') => { + let path = parentPath; + if (node.item.id) { + path += node.item.name; + if (node.isTrash) { + path = '.stackedit-trash/'; + } else if (node.isFolder) { + path += '/'; + } + result[node.item.id] = path; + } + + if (node.isFolder) { + node.folders.forEach(child => processNode(child, path)); + node.files.forEach(child => processNode(child, path)); + } + }; + + processNode(getters['explorer/rootNode']); + return result; + }, + itemsByPath: (state, { allItemsById, pathsByItemId }) => { + const result = {}; + Object.entries(pathsByItemId).forEach(([id, path]) => { + const items = result[path] || []; + items.push(allItemsById[id]); + result[path] = items; + }); + return result; + }, + gitPathsByItemId: (state, { allItemsById, pathsByItemId }) => { + const result = {}; + Object.entries(allItemsById).forEach(([id, item]) => { + if (item.type === 'data') { + result[id] = `.stackedit-data/${id}.json`; + } else if (item.type === 'file') { + const filePath = pathsByItemId[id]; + result[id] = `${filePath}.md`; + result[`${id}/content`] = `/${filePath}.md`; + } else if (item.type === 'content') { + const [fileId] = id.split('/'); + const filePath = pathsByItemId[fileId]; + result[fileId] = `${filePath}.md`; + result[id] = `/${filePath}.md`; + } else if (item.type === 'folder') { + result[id] = pathsByItemId[id]; + } else if (item.type === 'syncLocation' || item.type === 'publishLocation') { + // locations are stored as paths + const encodedItem = utils.encodeBase64(utils.serializeObject({ + ...item, + id: undefined, + type: undefined, + fileId: undefined, + hash: undefined, + }), true); + const extension = item.type === 'syncLocation' ? 'sync' : 'publish'; + const path = pathsByItemId[item.fileId]; + if (path) { + result[id] = `${path}.${encodedItem}.${extension}`; + } + } + }); + return result; + }, + itemIdsByGitPath: (state, { gitPathsByItemId }) => { + const result = {}; + Object.entries(gitPathsByItemId).forEach(([id, path]) => { + result[path] = id; + }); + return result; + }, + itemsByGitPath: (state, { allItemsById, gitPathsByItemId }) => { + const result = {}; + Object.entries(gitPathsByItemId).forEach(([id, path]) => { + const item = allItemsById[id]; + if (item) { + result[path] = item; + } + }); + return result; + }, + isSponsor: ({ light }, getters) => { + if (light) { + return true; + } + if (!getters['data/serverConf'].allowSponsorship) { + return true; + } + const sponsorToken = getters['workspace/sponsorToken']; + return sponsorToken ? sponsorToken.isSponsor : false; + }, + }, + actions: { + setOffline: ({ state, commit, dispatch }, value) => { + if (state.offline !== value) { + commit('setOffline', value); + if (state.offline) { + return Promise.reject(new Error('You are offline.')); + } + dispatch('notification/info', 'You are back online!'); + } + return Promise.resolve(); + }, + }, + strict: debug, + plugins: debug ? [createLogger()] : [], +}); + +setInterval(() => { + store.commit('updateTimeCounter'); +}, 30 * 1000); + +export default store; diff --git a/src/store/layout.js b/src/store/layout.js new file mode 100644 index 0000000..5910434 --- /dev/null +++ b/src/store/layout.js @@ -0,0 +1,187 @@ +import pagedownButtons from '../data/pagedownButtons'; + +let buttonCount = 2; // 2 for undo/redo +let spacerCount = 0; +pagedownButtons.forEach((button) => { + if (button.method) { + buttonCount += 1; + } else { + spacerCount += 1; + } +}); + +const minPadding = 25; +const editorTopPadding = 10; +const navigationBarEditButtonsWidth = (34 * buttonCount) + (8 * spacerCount); // buttons + spacers +const navigationBarLeftButtonWidth = 38 + 4 + 12; +const navigationBarRightButtonWidth = 38 + 8; +const navigationBarSpinnerWidth = 24 + 8 + 5; // 5 for left margin +const navigationBarLocationWidth = 20; +const navigationBarSyncPublishButtonsWidth = 34 + 10; +const navigationBarTitleMargin = 8; +const maxTitleMaxWidth = 800; +const minTitleMaxWidth = 200; + +const constants = { + editorMinWidth: 320, + explorerWidth: 260, + gutterWidth: 250, + sideBarWidth: 280, + navigationBarHeight: 44, + buttonBarWidth: 26, + statusBarHeight: 20, +}; + +function computeStyles(state, getters, layoutSettings = getters['data/layoutSettings'], styles = { + showNavigationBar: layoutSettings.showNavigationBar + || !layoutSettings.showEditor + || state.content.revisionContent + || state.light, + showStatusBar: layoutSettings.showStatusBar, + showEditor: layoutSettings.showEditor, + showSidePreview: layoutSettings.showSidePreview && layoutSettings.showEditor, + showPreview: layoutSettings.showSidePreview || !layoutSettings.showEditor, + showSideBar: layoutSettings.showSideBar && !state.light, + showExplorer: layoutSettings.showExplorer && !state.light, + layoutOverflow: false, + hideLocations: state.light, +}) { + styles.innerHeight = state.layout.bodyHeight; + if (styles.showNavigationBar) { + styles.innerHeight -= constants.navigationBarHeight; + } + if (styles.showStatusBar) { + styles.innerHeight -= constants.statusBarHeight; + } + + styles.innerWidth = state.layout.bodyWidth; + if (styles.innerWidth < constants.editorMinWidth + + constants.gutterWidth + constants.buttonBarWidth + ) { + styles.layoutOverflow = true; + } + if (styles.showSideBar) { + styles.innerWidth -= constants.sideBarWidth; + } + if (styles.showExplorer) { + styles.innerWidth -= constants.explorerWidth; + } + + let doublePanelWidth = styles.innerWidth - constants.buttonBarWidth; + // No commenting for temp files + const showGutter = !getters['file/isCurrentTemp'] && !!getters['discussion/currentDiscussion']; + if (showGutter) { + doublePanelWidth -= constants.gutterWidth; + } + if (doublePanelWidth < constants.editorMinWidth) { + doublePanelWidth = constants.editorMinWidth; + } + + if (styles.showSidePreview && doublePanelWidth / 2 < constants.editorMinWidth) { + styles.showSidePreview = false; + styles.showPreview = false; + styles.layoutOverflow = false; + return computeStyles(state, getters, layoutSettings, styles); + } + + const computedSettings = getters['data/computedSettings']; + styles.fontSize = 18; + styles.textWidth = 990; + if (doublePanelWidth < 1120) { + styles.fontSize -= 1; + styles.textWidth = 910; + } + if (doublePanelWidth < 1040) { + styles.textWidth = 830; + } + styles.textWidth *= computedSettings.maxWidthFactor; + if (doublePanelWidth < styles.textWidth) { + styles.textWidth = doublePanelWidth; + } + if (styles.textWidth < 640) { + styles.fontSize -= 1; + } + styles.fontSize *= computedSettings.fontSizeFactor; + + const bottomPadding = Math.floor(styles.innerHeight / 2); + const panelWidth = Math.floor(doublePanelWidth / 2); + styles.previewWidth = styles.showSidePreview ? + panelWidth : + doublePanelWidth; + const previewRightPadding = Math + .max(Math.floor((styles.previewWidth - styles.textWidth) / 2), minPadding); + if (!styles.showSidePreview) { + styles.previewWidth += constants.buttonBarWidth; + } + styles.previewGutterWidth = showGutter && !layoutSettings.showEditor + ? constants.gutterWidth + : 0; + const previewLeftPadding = previewRightPadding + styles.previewGutterWidth; + styles.previewGutterLeft = previewLeftPadding - minPadding; + styles.previewPadding = `${editorTopPadding}px ${previewRightPadding}px ${bottomPadding}px ${previewLeftPadding}px`; + styles.editorWidth = styles.showSidePreview ? + panelWidth : + doublePanelWidth; + const editorRightPadding = Math + .max(Math.floor((styles.editorWidth - styles.textWidth) / 2), minPadding); + styles.editorGutterWidth = showGutter && layoutSettings.showEditor + ? constants.gutterWidth + : 0; + const editorLeftPadding = editorRightPadding + styles.editorGutterWidth; + styles.editorGutterLeft = editorLeftPadding - minPadding; + styles.editorPadding = `${editorTopPadding}px ${editorRightPadding}px ${bottomPadding}px ${editorLeftPadding}px`; + + styles.titleMaxWidth = styles.innerWidth - + navigationBarLeftButtonWidth - + navigationBarRightButtonWidth - + navigationBarSpinnerWidth; + if (styles.showEditor) { + const syncLocations = getters['syncLocation/current']; + const publishLocations = getters['publishLocation/current']; + styles.titleMaxWidth -= navigationBarEditButtonsWidth + + (navigationBarLocationWidth * (syncLocations.length + publishLocations.length)) + + (navigationBarSyncPublishButtonsWidth * 2) + + navigationBarTitleMargin; + if (styles.titleMaxWidth + navigationBarEditButtonsWidth < minTitleMaxWidth) { + styles.hideLocations = true; + } + } + styles.titleMaxWidth = Math + .max(minTitleMaxWidth, Math + .min(maxTitleMaxWidth, styles.titleMaxWidth)); + return styles; +} + +export default { + namespaced: true, + state: { + canUndo: false, + canRedo: false, + bodyWidth: 0, + bodyHeight: 0, + }, + mutations: { + setCanUndo: (state, value) => { + state.canUndo = value; + }, + setCanRedo: (state, value) => { + state.canRedo = value; + }, + updateBodySize: (state) => { + state.bodyWidth = document.body.clientWidth; + state.bodyHeight = document.body.clientHeight; + }, + }, + getters: { + constants: () => constants, + styles: (state, getters, rootState, rootGetters) => computeStyles(rootState, rootGetters), + }, + actions: { + updateBodySize({ commit, dispatch, rootGetters }) { + commit('updateBodySize'); + // Make sure both explorer and side bar are not open if body width is small + const layoutSettings = rootGetters['data/layoutSettings']; + dispatch('data/toggleExplorer', layoutSettings.showExplorer, { root: true }); + }, + }, +}; diff --git a/src/store/locationTemplate.js b/src/store/locationTemplate.js new file mode 100644 index 0000000..9911383 --- /dev/null +++ b/src/store/locationTemplate.js @@ -0,0 +1,86 @@ +import moduleTemplate from './moduleTemplate'; +import providerRegistry from '../services/providers/common/providerRegistry'; +import utils from '../services/utils'; + +const addToGroup = (groups, item) => { + const list = groups[item.fileId]; + if (!list) { + groups[item.fileId] = [item]; + } else { + list.push(item); + } +}; + +export default (empty) => { + const module = moduleTemplate(empty); + + module.getters = { + ...module.getters, + groupedByFileId: (state, { items }) => { + const groups = {}; + items.forEach(item => addToGroup(groups, item)); + return groups; + }, + groupedByFileIdAndHash: (state, { items }) => { + const fileIdGroups = {}; + items.forEach((item) => { + let hashGroups = fileIdGroups[item.fileId]; + if (!hashGroups) { + hashGroups = {}; + fileIdGroups[item.fileId] = hashGroups; + } + const list = hashGroups[item.hash]; + if (!list) { + hashGroups[item.hash] = [item]; + } else { + list.push(item); + } + }); + return fileIdGroups; + }, + filteredGroupedByFileId: (state, { items }) => { + const groups = {}; + items + .filter((item) => { + // Filter items that we can't use + const provider = providerRegistry.providersById[item.providerId]; + return provider && provider.getToken(item); + }) + .forEach(item => addToGroup(groups, item)); + return groups; + }, + current: (state, { filteredGroupedByFileId }, rootState, rootGetters) => { + const locations = filteredGroupedByFileId[rootGetters['file/current'].id] || []; + return locations.map((location) => { + const provider = providerRegistry.providersById[location.providerId]; + return { + ...location, + description: utils.sanitizeName(provider.getLocationDescription(location)), + url: provider.getLocationUrl(location), + }; + }); + }, + currentWithWorkspaceSyncLocation: (state, { current }, rootState, rootGetters) => { + const fileId = rootGetters['file/current'].id; + const fileSyncData = rootGetters['data/syncDataByItemId'][fileId]; + const contentSyncData = rootGetters['data/syncDataByItemId'][`${fileId}/content`]; + if (!fileSyncData || !contentSyncData) { + return current; + } + + // Add the workspace sync location + const workspaceProvider = providerRegistry.providersById[ + rootGetters['workspace/currentWorkspace'].providerId]; + return [{ + id: 'main', + providerId: workspaceProvider.id, + fileId, + description: utils.sanitizeName(workspaceProvider + .getSyncDataDescription(fileSyncData, contentSyncData)), + url: workspaceProvider.getSyncDataUrl(fileSyncData, contentSyncData), + }, ...current]; + }, + }; + + return module; +}; diff --git a/src/store/modal.js b/src/store/modal.js new file mode 100644 index 0000000..632717d --- /dev/null +++ b/src/store/modal.js @@ -0,0 +1,40 @@ +export default { + namespaced: true, + state: { + stack: [], + hidden: false, + }, + mutations: { + setStack: (state, value) => { + state.stack = value; + }, + setHidden: (state, value) => { + state.hidden = value; + }, + }, + getters: { + config: ({ hidden, stack }) => !hidden && stack[0], + }, + actions: { + async open({ commit, state }, param) { + const config = typeof param === 'object' ? { ...param } : { type: param }; + try { + return await new Promise((resolve, reject) => { + config.resolve = resolve; + config.reject = reject; + commit('setStack', [config, ...state.stack]); + }); + } finally { + commit('setStack', state.stack.filter((otherConfig => otherConfig !== config))); + } + }, + async hideUntil({ commit }, promise) { + try { + commit('setHidden', true); + return await promise; + } finally { + commit('setHidden', false); + } + }, + }, +}; diff --git a/src/store/moduleTemplate.js b/src/store/moduleTemplate.js new file mode 100644 index 0000000..90fcfa6 --- /dev/null +++ b/src/store/moduleTemplate.js @@ -0,0 +1,40 @@ +import Vue from 'vue'; +import utils from '../services/utils'; + +export default (empty, simpleHash = false) => { + // Use Date.now() as a simple hash function, which is ok for not-synced types + const hashFunc = simpleHash ? Date.now : item => utils.getItemHash(item); + + return { + namespaced: true, + state: { + itemsById: {}, + }, + getters: { + items: ({ itemsById }) => Object.values(itemsById), + }, + mutations: { + setItem(state, value) { + const item = Object.assign(empty(value.id), value); + if (!item.hash || !simpleHash) { + item.hash = hashFunc(item); + } + Vue.set(state.itemsById, item.id, item); + }, + patchItem(state, patch) { + const item = state.itemsById[patch.id]; + if (item) { + Object.assign(item, patch); + item.hash = hashFunc(item); + Vue.set(state.itemsById, item.id, item); + return true; + } + return false; + }, + deleteItem(state, id) { + Vue.delete(state.itemsById, id); + }, + }, + actions: {}, + }; +}; diff --git a/src/store/notification.js b/src/store/notification.js new file mode 100644 index 0000000..9f33783 --- /dev/null +++ b/src/store/notification.js @@ -0,0 +1,90 @@ +import providerRegistry from '../services/providers/common/providerRegistry'; +import utils from '../services/utils'; + +const defaultTimeout = 5000; // 5 sec + +export default { + namespaced: true, + state: { + items: [], + }, + mutations: { + setItems: (state, value) => { + state.items = value; + }, + }, + actions: { + showItem({ state, commit }, item) { + const existingItem = utils.someResult( + state.items, + other => other.type === item.type && other.content === item.content && item, + ); + if (existingItem) { + return existingItem.promise; + } + + item.promise = new Promise((resolve, reject) => { + commit('setItems', [...state.items, item]); + const removeItem = () => commit( + 'setItems', + state.items.filter(otherItem => otherItem !== item), + ); + setTimeout( + () => removeItem(), + item.timeout || defaultTimeout, + ); + item.resolve = (res) => { + removeItem(); + resolve(res); + }; + item.reject = (err) => { + removeItem(); + reject(err); + }; + }); + + return item.promise; + }, + info({ dispatch }, content) { + return dispatch('showItem', { + type: 'info', + content, + }); + }, + badge({ dispatch }, content) { + return dispatch('showItem', { + type: 'badge', + content, + }); + }, + confirm({ dispatch }, content) { + return dispatch('showItem', { + type: 'confirm', + content, + timeout: 10000, // 10 sec + }); + }, + error({ dispatch, rootState }, error) { + const item = { type: 'error' }; + if (error) { + if (error.message) { + item.content = error.message; + } else if (error.status) { + const location = rootState.queue.currentLocation; + if (location.providerId) { + const provider = providerRegistry.providersById[location.providerId]; + item.content = `HTTP error ${error.status} on ${provider.name} location.`; + } else { + item.content = `HTTP error ${error.status}.`; + } + } else { + item.content = `${error}`; + } + } + if (!item.content || item.content === '[object Object]') { + item.content = 'Unknown error.'; + } + return dispatch('showItem', item); + }, + }, +}; diff --git a/src/store/queue.js b/src/store/queue.js new file mode 100644 index 0000000..084a86a --- /dev/null +++ b/src/store/queue.js @@ -0,0 +1,83 @@ +const setter = propertyName => (state, value) => { + state[propertyName] = value; +}; + +let queue = Promise.resolve(); + +export default { + namespaced: true, + state: { + isEmpty: true, + isSyncRequested: false, + isPublishRequested: false, + currentLocation: {}, + }, + mutations: { + setIsEmpty: setter('isEmpty'), + setIsSyncRequested: setter('isSyncRequested'), + setIsPublishRequested: setter('isPublishRequested'), + setCurrentLocation: setter('currentLocation'), + }, + actions: { + enqueue({ state, commit, dispatch }, cb) { + if (state.offline) { + // No need to enqueue + return; + } + const checkOffline = () => { + if (state.offline) { + // Empty queue + queue = Promise.resolve(); + commit('setIsEmpty', true); + throw new Error('offline'); + } + }; + if (state.isEmpty) { + commit('setIsEmpty', false); + } + const newQueue = queue + .then(() => checkOffline()) + .then(() => Promise.resolve() + .then(() => cb()) + .catch((err) => { + console.error(err); // eslint-disable-line no-console + checkOffline(); + dispatch('notification/error', err, { root: true }); + }) + .then(() => { + if (newQueue === queue) { + commit('setIsEmpty', true); + } + })); + queue = newQueue; + }, + enqueueSyncRequest({ state, commit, dispatch }, cb) { + if (!state.isSyncRequested) { + commit('setIsSyncRequested', true); + const unset = () => commit('setIsSyncRequested', false); + dispatch('enqueue', () => cb().then(unset, (err) => { + unset(); + throw err; + })); + } + }, + enqueuePublishRequest({ state, commit, dispatch }, cb) { + if (!state.isSyncRequested) { + commit('setIsPublishRequested', true); + const unset = () => commit('setIsPublishRequested', false); + dispatch('enqueue', () => cb().then(unset, (err) => { + unset(); + throw err; + })); + } + }, + async doWithLocation({ commit }, { location, action }) { + try { + commit('setCurrentLocation', location); + return await action(); + } finally { + commit('setCurrentLocation', {}); + } + }, + }, +}; diff --git a/src/store/syncedContent.js b/src/store/syncedContent.js new file mode 100644 index 0000000..471c89f --- /dev/null +++ b/src/store/syncedContent.js @@ -0,0 +1,12 @@ +import moduleTemplate from './moduleTemplate'; +import empty from '../data/empties/emptySyncedContent'; + +const module = moduleTemplate(empty, true); + +module.getters = { + ...module.getters, + current: ({ itemsById }, getters, rootState, rootGetters) => + itemsById[`${rootGetters['file/current'].id}/syncedContent`] || empty(), +}; + +export default module; diff --git a/src/store/theme.js b/src/store/theme.js new file mode 100644 index 0000000..6509aaa --- /dev/null +++ b/src/store/theme.js @@ -0,0 +1,138 @@ +const localKey = 'theme/currEditTheme'; +const customEditThemeKey = 'theme/customEditThemeStyle'; +const previewLocalKey = 'theme/currPreviewTheme'; +const customPreviewThemeKey = 'theme/customPreviewThemeStyle'; + +export default { + namespaced: true, + state: { + // 当前编辑主题 + currEditTheme: '', + customEditThemeStyle: null, + // 当前预览主题 + currPreviewTheme: '', + customPreviewThemeStyle: null, + }, + mutations: { + setEditTheme: (state, value) => { + state.currEditTheme = value; + }, + setCustomEditThemeStyle: (state, value) => { + state.customEditThemeStyle = value; + }, + setPreviewTheme: (state, value) => { + state.currPreviewTheme = value; + }, + setCustomPreviewThemeStyle: (state, value) => { + state.customPreviewThemeStyle = value; + }, + }, + getters: { + currEditTheme: state => state.currEditTheme, + customEditThemeStyle: state => state.customEditThemeStyle, + currPreviewTheme: state => state.currPreviewTheme, + customPreviewThemeStyle: state => state.customPreviewThemeStyle, + }, + actions: { + async setEditTheme({ commit }, theme) { + // 如果不是default 则加载样式 + if (!theme || theme === 'default') { + commit('setEditTheme', theme); + localStorage.setItem(localKey, theme); + return; + } + const themeStyle = document.getElementById(`edit-theme-${theme}`); + if (themeStyle) { + commit('setEditTheme', theme); + localStorage.setItem(localKey, theme); + return; + } + // 如果是自定义则直接追加 + if (theme === 'custom') { + const styleEle = document.createElement('style'); + styleEle.id = `edit-theme-${theme}`; + styleEle.type = 'text/css'; + styleEle.innerHTML = localStorage.getItem(customEditThemeKey) || ''; + commit('setCustomEditThemeStyle', styleEle.innerHTML); + document.head.appendChild(styleEle); + commit('setEditTheme', theme); + localStorage.setItem(localKey, theme); + return; + } + const script = document.createElement('script'); + let timeout; + try { + await new Promise((resolve, reject) => { + script.onload = resolve; + script.onerror = reject; + script.src = `/themes/edit-theme-${theme}.js`; + try { + document.head.appendChild(script); + timeout = setTimeout(reject, 30); + commit('setEditTheme', theme); + localStorage.setItem(localKey, theme); + } catch (e) { + reject(e); + } + }); + } finally { + clearTimeout(timeout); + document.head.removeChild(script); + } + }, + setCustomEditThemeStyle({ commit }, value) { + commit('setCustomEditThemeStyle', value); + localStorage.setItem(customEditThemeKey, value); + }, + async setPreviewTheme({ commit }, theme) { + // 如果不是default 则加载样式 + if (!theme || theme === 'default') { + commit('setPreviewTheme', theme); + localStorage.setItem(previewLocalKey, theme); + return; + } + const themeStyle = document.getElementById(`preview-theme-${theme}`); + if (themeStyle) { + commit('setPreviewTheme', theme); + localStorage.setItem(previewLocalKey, theme); + return; + } + // 如果是自定义则直接追加 + if (theme === 'custom') { + const styleEle = document.createElement('style'); + styleEle.id = `preview-theme-${theme}`; + styleEle.type = 'text/css'; + styleEle.innerHTML = localStorage.getItem(customPreviewThemeKey) || ''; + commit('setCustomPreviewThemeStyle', styleEle.innerHTML); + document.head.appendChild(styleEle); + commit('setPreviewTheme', theme); + localStorage.setItem(previewLocalKey, theme); + return; + } + const script = document.createElement('script'); + let timeout; + try { + await new Promise((resolve, reject) => { + script.onload = resolve; + script.onerror = reject; + script.src = `/themes/preview-theme-${theme}.js`; + try { + document.head.appendChild(script); + timeout = setTimeout(reject, 30); + commit('setPreviewTheme', theme); + localStorage.setItem(previewLocalKey, theme); + } catch (e) { + reject(e); + } + }); + } finally { + clearTimeout(timeout); + document.head.removeChild(script); + } + }, + setCustomPreviewThemeStyle({ commit }, value) { + commit('setCustomPreviewThemeStyle', value); + localStorage.setItem(customPreviewThemeKey, value); + }, + }, +}; diff --git a/src/store/userInfo.js b/src/store/userInfo.js new file mode 100644 index 0000000..dabfa9a --- /dev/null +++ b/src/store/userInfo.js @@ -0,0 +1,25 @@ +import Vue from 'vue'; + +export default { + namespaced: true, + state: { + itemsById: {}, + }, + mutations: { + setItem: ({ itemsById }, item) => { + const itemToSet = { + ...item, + }; + const existingItem = itemsById[item.id]; + if (existingItem) { + if (!itemToSet.name) { + itemToSet.name = existingItem.name; + } + if (!itemToSet.imageUrl) { + itemToSet.imageUrl = existingItem.imageUrl; + } + } + Vue.set(itemsById, item.id, itemToSet); + }, + }, +}; diff --git a/src/store/workspace.js b/src/store/workspace.js new file mode 100644 index 0000000..c71e6cb --- /dev/null +++ b/src/store/workspace.js @@ -0,0 +1,150 @@ +import utils from '../services/utils'; +import providerRegistry from '../services/providers/common/providerRegistry'; + +export default { + namespaced: true, + state: { + currentWorkspaceId: null, + lastFocus: 0, + }, + mutations: { + setCurrentWorkspaceId: (state, value) => { + state.currentWorkspaceId = value; + }, + setLastFocus: (state, value) => { + state.lastFocus = value; + }, + }, + getters: { + workspacesById: (state, getters, rootState, rootGetters) => { + const workspacesById = {}; + const mainWorkspaceToken = rootGetters['workspace/mainWorkspaceToken']; + Object.entries(rootGetters['data/workspaces']).forEach(([id, workspace]) => { + const sanitizedWorkspace = { + id, + providerId: (mainWorkspaceToken && mainWorkspaceToken.providerId) || 'giteeAppData', + sub: mainWorkspaceToken && mainWorkspaceToken.sub, + ...workspace, + }; + // Filter workspaces that don't have a provider + const workspaceProvider = providerRegistry.providersById[sanitizedWorkspace.providerId]; + if (workspaceProvider) { + // Build the url with the current hostname + const params = workspaceProvider.getWorkspaceParams(sanitizedWorkspace); + sanitizedWorkspace.url = utils.addQueryParams('app', params, true); + sanitizedWorkspace.locationUrl = workspaceProvider + .getWorkspaceLocationUrl(sanitizedWorkspace); + workspacesById[id] = sanitizedWorkspace; + } + }); + return workspacesById; + }, + mainWorkspace: (state, { workspacesById }) => workspacesById.main, + currentWorkspace: ({ currentWorkspaceId }, { workspacesById, mainWorkspace }) => + workspacesById[currentWorkspaceId] || mainWorkspace, + currentWorkspaceIsGit: (state, { currentWorkspace }) => + currentWorkspace.providerId === 'githubWorkspace' + || currentWorkspace.providerId === 'giteeWorkspace' + || currentWorkspace.providerId === 'gitlabWorkspace' + || currentWorkspace.providerId === 'giteaWorkspace' + || currentWorkspace.providerId === 'giteeAppData' + || currentWorkspace.providerId === 'githubAppData', + currentWorkspaceHasUniquePaths: (state, { currentWorkspace }) => + currentWorkspace.providerId === 'githubWorkspace' + || currentWorkspace.providerId === 'giteeWorkspace' + || currentWorkspace.providerId === 'gitlabWorkspace' + || currentWorkspace.providerId === 'giteaWorkspace' + || currentWorkspace.providerId === 'giteeAppData' + || currentWorkspace.providerId === 'githubAppData', + lastSyncActivityKey: (state, { currentWorkspace }) => `${currentWorkspace.id}/lastSyncActivity`, + lastFocusKey: (state, { currentWorkspace }) => `${currentWorkspace.id}/lastWindowFocus`, + mainWorkspaceToken: (state, getters, rootState, rootGetters) => + utils.someResult([...Object.values(rootGetters['data/giteeTokensBySub']), ...Object.values(rootGetters['data/githubTokensBySub'])], (token) => { + if (token.isLogin) { + return token; + } + return null; + }), + syncToken: (state, { currentWorkspace, mainWorkspaceToken }, rootState, rootGetters) => { + switch (currentWorkspace.providerId) { + case 'googleDriveWorkspace': + return rootGetters['data/googleTokensBySub'][currentWorkspace.sub]; + case 'githubWorkspace': + return rootGetters['data/githubTokensBySub'][currentWorkspace.sub]; + case 'giteeWorkspace': + return rootGetters['data/giteeTokensBySub'][currentWorkspace.sub]; + case 'gitlabWorkspace': + return rootGetters['data/gitlabTokensBySub'][currentWorkspace.sub]; + case 'giteaWorkspace': + return rootGetters['data/giteaTokensBySub'][currentWorkspace.sub]; + case 'couchdbWorkspace': + return rootGetters['data/couchdbTokensBySub'][currentWorkspace.id]; + default: + return mainWorkspaceToken; + } + }, + loginType: (state, { currentWorkspace }) => { + switch (currentWorkspace.providerId) { + case 'googleDriveWorkspace': + return 'google'; + case 'githubAppData': + case 'githubWorkspace': + return 'github'; + case 'giteeAppData': + case 'giteeWorkspace': + default: + return 'gitee'; + case 'gitlabWorkspace': + return 'gitlab'; + case 'giteaWorkspace': + return 'gitea'; + } + }, + loginToken: (state, { loginType, currentWorkspace }, rootState, rootGetters) => { + const tokensBySub = rootGetters['data/tokensByType'][loginType]; + return tokensBySub && tokensBySub[currentWorkspace.sub]; + }, + sponsorToken: (state, { mainWorkspaceToken }) => mainWorkspaceToken, + }, + actions: { + removeWorkspace: ({ commit, rootGetters }, id) => { + const workspaces = { + ...rootGetters['data/workspaces'], + }; + delete workspaces[id]; + commit( + 'data/setItem', + { id: 'workspaces', data: workspaces }, + { root: true }, + ); + }, + patchWorkspacesById: ({ commit, rootGetters }, workspaces) => { + const sanitizedWorkspaces = {}; + Object + .entries({ + ...rootGetters['data/workspaces'], + ...workspaces, + }) + .forEach(([id, workspace]) => { + sanitizedWorkspaces[id] = { + ...workspace, + id, + // Do not store urls + url: undefined, + locationUrl: undefined, + }; + }); + + commit( + 'data/setItem', + { id: 'workspaces', data: sanitizedWorkspaces }, + { root: true }, + ); + }, + setCurrentWorkspaceId: ({ commit, getters }, value) => { + commit('setCurrentWorkspaceId', value); + const lastFocus = parseInt(localStorage.getItem(getters.lastFocusKey), 10) || 0; + commit('setLastFocus', lastFocus); + }, + }, +}; diff --git a/src/styles/app.scss b/src/styles/app.scss new file mode 100644 index 0000000..b3356fe --- /dev/null +++ b/src/styles/app.scss @@ -0,0 +1,435 @@ +@import './variables.scss'; + +body { + background-color: #fff; + top: 0; + right: 0; + bottom: 0; + left: 0; + position: fixed; + tab-size: 4; + text-rendering: auto; + + /* Prevent body overscroll on Chrome */ + overflow: hidden; + -webkit-overflow-scrolling: touch; +} + +* { + box-sizing: border-box; +} + +::-webkit-scrollbar-track { + background-color: transparent; +} + +::-webkit-scrollbar { + background-color: transparent; + + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + &:horizontal { + height: 8px; + } + + /* stylelint-disable-next-line selector-pseudo-class-no-unknown */ + &:vertical { + width: 8px; + } +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: #bbb; + + .app--dark & { + background-color: #666; + } +} + +:focus { + outline: none; +} + +input[type=checkbox] { + outline: #349be8 auto 5px; +} + +.icon { + width: 100%; + height: 100%; + display: block; + + * { + fill: currentColor; + } +} + +.table-wrapper { + max-width: 100%; + overflow: auto; +} + +button, +input, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.text-input { + display: block; + font-variant-ligatures: no-common-ligatures; + width: 100%; + height: 36px; + padding: 3px 12px; + font-size: inherit; + line-height: 1.5; + color: inherit; + background-color: rgba(255, 255, 255, 0.8); + background-image: none; + border: 0; + border-radius: $border-radius-base; + + .app--dark & { + background-color: rgba(0, 0, 0, 0.2); + } +} + +.button { + color: #333; + background-color: transparent; + display: inline-block; + height: auto; + padding: 8px 16px; + font-size: 17px; + font-weight: 400; + line-height: 1.4; + text-transform: uppercase; + overflow: hidden; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 0; + border-radius: $border-radius-base; + text-decoration: none; + + &:active, + &:focus, + &:hover, + .hidden-file:focus + & { + color: #333; + background-color: rgba(0, 0, 0, 0.05); + outline: 0; + text-decoration: none; + } + + .app--dark & { + color: rgba(255, 255, 255, 0.75); + + &:active, + &:focus, + &:hover, + .hidden-file:focus + & { + color: rgba(255, 255, 255, 0.75); + background-color: rgba(255, 255, 255, 0.05); + outline: 0; + text-decoration: none; + } + } + + .app--dark .layout__panel--editor &, + .app--dark .layout__panel--preview & { + color: #ccc; + + &:active, + &:focus, + &:hover { + color: #ccc; + background-color: rgba(255, 255, 255, 0.067); + } + } + + &[disabled] { + &, + &:active, + &:focus, + &:hover { + opacity: 0.33; + background-color: transparent; + cursor: not-allowed; + } + } +} + +.button--resolve { + background-color: #349be8; + color: #fff; + margin: -2px 0 -2px 4px; + padding: 10px 20px; + font-size: 18px; + + &:active, + &:focus, + &:hover { + color: #fff; + background-color: darken(#349be8, 8%); + } + + .app--dark & { + background-color: #567c98; + color: rgb(222, 222, 222); + + &:active, + &:focus, + &:hover { + color: #fff; + background-color: darken(#567c98, 8%); + } + } +} + +.textfield { + background-color: #fff; + border: 0; + font-family: inherit; + font-weight: 400; + font-size: 1.05em; + padding: 0 0.6rem; + box-sizing: border-box; + width: 100%; + max-width: 100%; + color: inherit; + height: 2.4rem; + + &:focus { + outline: none; + } + + &[disabled] { + cursor: not-allowed; + background-color: #f0f0f0; + color: #999; + } + + .app--dark & { + background-color: rgba(0, 0, 0, 0.2); + + &[disabled] { + cursor: not-allowed; + background-color: #373737; + color: #999; + } + } +} + +.flex { + display: flex; +} + +.flex--row { + flex-direction: row; +} + +.flex--column { + flex-direction: column; +} + +.flex--center { + justify-content: center; +} + +.flex--end { + justify-content: flex-end; +} + +.flex--space-between { + justify-content: space-between; +} + +.flex--align-center { + align-items: center; +} + +.flex--align-end { + align-items: flex-end; +} + +.user-name { + font-weight: 600; +} + +.side-title { + height: 44px; + line-height: 36px; + padding: 4px 4px 0; + background-color: rgba(0, 0, 0, 0.1); + flex: none; +} + +.side-title__button { + width: 38px; + height: 36px; + padding: 6px; + display: inline-block; + background-color: transparent; + opacity: 0.75; + flex: none; + + /* prevent from seeing wrapped buttons */ + margin-bottom: 20px; + + &:active, + &:focus, + &:hover { + opacity: 1; + background-color: rgba(0, 0, 0, 0.1); + } +} + +.side-title__title { + text-transform: uppercase; + padding: 0 5px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + width: 100%; +} + +.logo-background { + background: no-repeat center url('../assets/logo.svg'); + background-size: contain; +} + +.gutter { + position: absolute; + top: 0; + height: 100%; +} + +.gutter__background { + position: absolute; + height: 100%; + right: 0; +} + +.new-discussion-button { + color: rgba(0, 0, 0, 0.33); + position: absolute; + left: 0; + padding: 3px 3px 3px 0; + width: 22px; + height: 21px; + line-height: 1; + + .app--dark & { + color: rgba(255, 255, 255, 0.33); + } + + &:active, + &:focus, + &:hover { + color: rgba(0, 0, 0, 0.4); + + .app--dark & { + color: rgba(255, 255, 255, 0.4); + } + } +} + +.discussion-editor-highlighting, +.discussion-preview-highlighting { + background-color: mix($editor-background-light, $selection-highlighting-color, 70%); + padding: 0.25em 0; + + .app--dark & { + background-color: mix($editor-background-dark, $selection-highlighting-color, 70%); + } +} + +.discussion-editor-highlighting--hover, +.discussion-preview-highlighting--hover { + background-color: mix($editor-background-light, $selection-highlighting-color, 50%); + + .app--dark & { + background-color: mix($editor-background-dark, $selection-highlighting-color, 50%); + } + + * { + background-color: transparent; + } +} + +.discussion-editor-highlighting--selected, +.discussion-preview-highlighting--selected { + background-color: mix($editor-background-light, $selection-highlighting-color, 20%); + + .app--dark & { + background-color: mix($editor-background-dark, $selection-highlighting-color, 20%); + } + + * { + background-color: transparent; + } +} + +.discussion-preview-highlighting { + cursor: pointer; + + &.discussion-preview-highlighting--selected { + cursor: auto; + } +} + +.hidden-rendering-container { + position: absolute; + width: 500px; + left: -1000px; +} + +@media print { + body { + background-color: transparent !important; + color: #000 !important; // Black prints faster + overflow: visible !important; + position: absolute !important; + + div { + display: none !important; + } + + a { + text-decoration: underline; + } + } + + body > .app, + body > .app > .layout, + body > .app > .layout > .layout__panel, + body > .app > .layout > .layout__panel > .layout__panel, + body > .app > .layout > .layout__panel > .layout__panel > .layout__panel, + body > .app > .layout > .layout__panel > .layout__panel > .layout__panel > .layout__panel--preview, + body > .app > .layout > .layout__panel > .layout__panel > .layout__panel > .layout__panel--preview div { + background-color: transparent !important; + display: block !important; + height: auto !important; + overflow: visible !important; + position: static !important; + width: auto !important; + font-size: 16px; + } + + .preview__inner-2 { + padding: 0 50px !important; + } + // scss-lint:enable ImportantRule +} diff --git a/src/styles/base.scss b/src/styles/base.scss new file mode 100644 index 0000000..f8e5269 --- /dev/null +++ b/src/styles/base.scss @@ -0,0 +1,310 @@ +@import '../../node_modules/normalize-scss/sass/normalize'; +@import './variables'; + +@include normalize(); + +html, +body { + color: $body-color-light; + font-size: 16px; + font-family: $font-family-main; + font-variant-ligatures: common-ligatures; + line-height: $line-height-base; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + .app--dark { + color: $body-color-dark; + } +} + +.app--dark .layout__panel--editor, +.app--dark .layout__panel--preview { + color: $body-color-dark; +} + +.preview-toc ul { + list-style-type: none; + margin-bottom: 15px; +} + +p, +blockquote, +pre, +ul, +ol, +dl { + margin: 0 0 1.1em; +} + +ul, +ol { + padding-left: 30px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 1.2em 0 0.9em; + line-height: $line-height-title; +} + +h1, +h2 { + &::after { + content: ''; + display: block; + position: relative; + top: 0.33em; + border-bottom: 1px solid $hr-color; + } +} + +ol ul, +ul ol, +ul ul, +ol ol { + margin: 0 0 1.1em; +} + +dt { + font-weight: bold; +} + +a { + color: $link-color; + text-decoration: none; + text-decoration-skip: ink; + + &:hover, + &:focus { + text-decoration: underline; + } +} + +code, +pre, +samp { + font-family: $font-family-monospace; + font-size: $font-size-monospace; + + * { + font-size: inherit; + } +} + +blockquote { + color: rgba(0, 0, 0, 0.5); + padding: 0.5em 1em; + border-left: 8px solid #cfd1d6; + background: #e2e4e9; + word-break: break-word !important; + + :last-child { + margin-bottom: 0; + } + + .app--dark .layout__panel--editor &, + .app--dark .layout__panel--preview & { + color: rgba(255, 255, 255, 0.4); + border-left-color: #333; + background: rgba(51, 51, 51, 0.5); + } +} + +code { + background-color: $code-bg; + border-radius: $border-radius-base; + padding: 2px 4px; + + .app--dark & { + background-color: $code-dark-bg; + } +} + +hr { + border: 0; + border-top: 1px solid $hr-color; + margin: 2em 0; +} + +pre > code { + background-color: $code-bg; + display: block; + padding: 0.5em; + -webkit-text-size-adjust: none; + overflow-x: auto; + white-space: pre; + + .app--dark & { + background-color: $code-dark-bg; + } +} + +.toc ul { + list-style-type: none; + padding-left: 20px; +} + +table { + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; + margin-bottom: 1em; +} + +td, +th { + border: 1px solid #c9c9c9; + padding: 8px 12px; + + .app--dark & { + border: 1px solid #5f5f5f; + } +} + +td { + border: 1px solid #c9c9c9; + + .app--dark & { + border: 1px solid #5f5f5f; + } +} + +mark { + background-color: #f8f840; +} + +kbd { + font-family: $font-family-main; + background-color: #fff; + border: 1px solid rgba(63, 63, 63, 0.25); + border-radius: 3px; + box-shadow: 0 1px 0 rgba(63, 63, 63, 0.25); + color: #333; + display: inline-block; + font-size: 0.8em; + margin: 0 0.1em; + padding: 0.1em 0.6em; + white-space: nowrap; +} + +abbr { + &[title] { + border-bottom: 1px dotted #777; + cursor: help; + } +} + +img { + max-width: 100%; +} + +.task-list-item { + list-style-type: none; +} + +.task-list-item-checkbox { + margin: 0 0.2em 0 -1.3em; +} + +.footnote { + font-size: 0.8em; + position: relative; + top: -0.25em; + vertical-align: top; +} + +.page-break-after { + page-break-after: always; +} + +.abc-notation-block { + overflow-x: auto !important; +} + +.stackedit__html { + margin-bottom: 180px; + margin-left: auto; + margin-right: auto; + padding-left: 30px; + padding-right: 30px; + max-width: 750px; +} + +.stackedit__toc { + ul { + padding: 0; + + a { + margin: 0.5rem 0; + padding: 0.5rem 1rem; + } + + ul { + color: #888; + font-size: 0.9em; + + a { + margin: 0; + padding: 0.1rem 1rem; + } + } + } + + li { + display: block; + } + + a { + display: block; + color: inherit; + text-decoration: none; + + &:active, + &:focus, + &:hover { + background-color: rgba(0, 0, 0, 0.075); + border-radius: $border-radius-base; + } + } +} + +.stackedit__left { + position: fixed; + display: none; + width: 250px; + height: 100%; + top: 0; + left: 0; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: none; + + @media (min-width: 1060px) { + display: block; + } +} + +.stackedit__right { + position: absolute; + right: 0; + top: 0; + left: 0; + + @media (min-width: 1060px) { + left: 250px; + } +} + +.stackedit--pdf { + .stackedit__html { + padding-left: 0; + padding-right: 0; + max-width: none; + } +} diff --git a/src/styles/fonts.scss b/src/styles/fonts.scss new file mode 100644 index 0000000..9769705 --- /dev/null +++ b/src/styles/fonts.scss @@ -0,0 +1,41 @@ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: url('../assets/fonts/lato-normal.woff') format('woff'); +} + +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: url('../assets/fonts/lato-normal-italic.woff') format('woff'); +} + +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 600; + src: url('../assets/fonts/lato-black.woff') format('woff'); +} + +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 600; + src: url('../assets/fonts/lato-black-italic.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + src: url('../assets/fonts/RobotoMono-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 600; + src: url('../assets/fonts/RobotoMono-Bold.woff') format('woff'); +} diff --git a/src/styles/index.js b/src/styles/index.js new file mode 100644 index 0000000..f9da46e --- /dev/null +++ b/src/styles/index.js @@ -0,0 +1,4 @@ +import 'katex/dist/katex.css'; +import './fonts.scss'; +import './prism.scss'; +import './base.scss'; diff --git a/src/styles/markdownHighlighting.scss b/src/styles/markdownHighlighting.scss new file mode 100644 index 0000000..c992f2b --- /dev/null +++ b/src/styles/markdownHighlighting.scss @@ -0,0 +1,355 @@ +@import './variables'; + +.markdown-highlighting { + color: $editor-color-light; + caret-color: $editor-color-light-low; + + .app--dark & { + color: $editor-color-dark; + caret-color: $editor-color-dark-low; + } + + font-family: inherit; + font-size: inherit; + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: auto; + font-weight: $editor-font-weight-base; + + .code { + font-family: $font-family-monospace; + font-size: $font-size-monospace; + + * { + font-size: inherit !important; + } + } + + .pre { + color: $editor-color-light; + + .app--dark & { + color: $editor-color-dark; + } + + font-family: $font-family-monospace; + font-size: $font-size-monospace; + + [class*='language-'] { + color: $editor-color-light-low; + + .app--dark & { + color: $editor-color-dark-low; + } + } + + * { + font-size: inherit !important; + } + + &, + * { + line-height: $line-height-title; + } + } + + .tag { + color: $editor-color-light; + + .app--dark & { + color: $editor-color-dark; + } + + font-family: $font-family-monospace; + font-size: $font-size-monospace; + font-weight: $editor-font-weight-bold; + + .punctuation, + .attr-value, + .attr-name { + font-weight: $editor-font-weight-base; + } + + * { + font-size: inherit !important; + } + } + + .latex, + .math { + font-family: $font-family-monospace; + color: $editor-color-light; + + .app--dark & { + color: $editor-color-dark; + } + } + + .entity { + color: $editor-color-light; + + .app--dark & { + color: $editor-color-dark; + } + + font-family: $font-family-monospace; + font-size: $font-size-monospace; + font-style: italic; + + * { + font-size: inherit !important; + } + } + + .table { + font-family: $font-family-monospace; + font-size: $font-size-monospace; + + * { + font-size: inherit !important; + } + } + + .comment { + color: $editor-color-light-high; + + .app--dark & { + color: $editor-color-dark-high; + } + } + + .keyword { + color: $editor-color-light-low; + + .app--dark & { + color: $editor-color-dark-low; + } + + font-weight: $editor-font-weight-bold; + } + + .code, + .img, + .img-wrapper, + .imgref, + .cl-toc { + background-color: $code-bg; + border-radius: $code-border-radius; + padding: 0.15em 0; + + .app--dark & { + background-color: $code-dark-bg; + } + } + + .img-wrapper { + display: inline-block; + + .img { + display: inline-block; + padding: 0; + background-color: transparent; + } + + img { + max-width: 100%; + padding: 0 0.15em; + box-sizing: content-box; + } + } + + .cl-toc { + font-size: 2.8em; + padding: 0.15em; + } + + .blockquote { + color: $editor-color-light-blockquote; + + .app--dark & { + color: $editor-color-dark-blockquote; + } + } + + .h1, + .h11, + .h2, + .h22, + .h3, + .h4, + .h5, + .h6 { + font-weight: $editor-font-weight-bold; + + &, + * { + line-height: $line-height-title; + } + } + + .h1, + .h11 { + font-size: 1.7em; + } + + .h2, + .h22 { + font-size: 1.4em; + } + + .h3 { + font-size: 1.2em; + } + + .h4 { + font-size: 1.1em; + } + + .h5 { + font-size: 1em; + } + + .h6 { + font-size: 0.9em; + } + + .cl-hash { + color: $editor-color-light-high; + + .app--dark & { + color: $editor-color-dark-high; + } + } + + .cl, + .hr { + color: $editor-color-light-high; + + .app--dark & { + color: $editor-color-dark-high; + } + + font-style: normal; + font-weight: $editor-font-weight-base; + } + + .em, + .em .cl { + font-style: italic; + } + + .strong, + .strong .cl, + .term { + font-weight: $editor-font-weight-bold; + } + + .cl-del-text { + text-decoration: line-through; + } + + .cl-mark-text { + background-color: #f8f840; + color: $editor-color-light-low; + } + + .url, + .email, + .cl-underlined-text { + text-decoration: underline; + color: #d7a55b; + } + + .linkdef .url { + color: $editor-color-light-high; + + .app--dark & { + color: $editor-color-dark-high; + } + } + + .fn, + .inlinefn, + .sup { + font-size: smaller; + position: relative; + top: -0.5em; + } + + .sub { + bottom: -0.25em; + font-size: smaller; + position: relative; + } + + .img, + .imgref, + .link, + .linkref { + color: $editor-color-light-high; + + .app--dark & { + color: $editor-color-dark-high; + } + + .cl-underlined-text { + color: #d7a55b; + } + } + + .cl-title { + color: $editor-color-light; + + .app--dark & { + color: $editor-color-dark; + } + } + + .cn-head { + color: #dea731; + + .app--dark & { + color: #f8bb39; + } + } + + .cn-strong { + color: #db784d; + + .app--dark & { + color: #db784d; + } + } + + .cn-code { + color: #59b003; + + .app--dark & { + color: #95cc5e; + } + } + + .cn-toc { + color: #d7a55b; + font-size: 2.5em; + padding: 0.2em; + background-color: rgba(0, 0, 0, 0.1); + + .app--dark & { + background-color: rgba(0, 0, 0, 0.3); + } + } +} + +.markdown-highlighting--inline { + .h1, + .h11, + .h2, + .h22, + .h3, + .h4, + .h5, + .h6, + .cl-toc { + font-size: inherit; + } +} diff --git a/src/styles/prism.scss b/src/styles/prism.scss new file mode 100644 index 0000000..e9332d1 --- /dev/null +++ b/src/styles/prism.scss @@ -0,0 +1,73 @@ +.token.pre.gfm, +.prism { + * { + font-weight: inherit !important; + } + + .token.comment, + .token.prolog, + .token.doctype, + .token.cdata { + color: #708090; + } + + .token.punctuation { + color: #999; + } + + .namespace { + opacity: 0.7; + } + + .token.property, + .token.tag, + .token.boolean, + .token.number, + .token.constant, + .token.symbol, + .token.deleted { + color: #905; + } + + .token.selector, + .token.attr-name, + .token.string, + .token.char, + .token.builtin, + .token.inserted { + color: #690; + } + + .token.operator, + .token.entity, + .token.url, + .language-css .token.string, + .style .token.string { + color: #a67f59; + } + + .token.atrule, + .token.attr-value, + .token.keyword { + color: #07a; + } + + .token.function { + color: #dd4a68; + } + + .token.regex, + .token.important, + .token.variable { + color: #e90; + } + + .token.important, + .token.bold { + font-weight: 500; + } + + .token.italic { + font-style: italic; + } +} diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..ed90996 --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,38 @@ +$font-family-main: Lato, 'Helvetica Neue', Helvetica, sans-serif; +$font-family-monospace: 'Roboto Mono', 'Lucida Sans Typewriter', 'Lucida Console', monaco, Courrier, monospace; +$body-color-light: rgba(0, 0, 0, 0.75); +$body-color-dark: rgba(255, 255, 255, 0.75); +$code-bg: rgba(0, 0, 0, 0.05); +$code-dark-bg: #333; +$line-height-base: 1.67; +$line-height-title: 1.33; +$font-size-monospace: 0.85em; +$highlighting-color: #ff0; +$dark-highlighting-color: rgba(255, 255, 0, 0.6); +$selection-highlighting-color: #ffb067; +$info-bg: #ffad3326; +$code-border-radius: 3px; +$link-color: #0c93e4; +$error-color: #f31; +$border-radius-base: 3px; +$hr-color: rgba(128, 128, 128, 0.33); +$navbar-bg: #2c2c2c; +$navbar-color: mix($navbar-bg, #fff, 33%); +$navbar-hover-color: #fff; +$navbar-hover-background: rgba(255, 255, 255, 0.1); + +$editor-background-light: #fff; +$editor-background-dark: #36312c; + +$editor-color-light: rgba(0, 0, 0, 0.8); +$editor-color-light-low: rgba(0, 0, 0, 0.75); +$editor-color-light-high: rgba(0, 0, 0, 0.28); +$editor-color-light-blockquote: rgba(0, 0, 0, 0.48); + +$editor-color-dark: rgba(255, 255, 255, 0.8); +$editor-color-dark-low: rgba(255, 255, 255, 0.75); +$editor-color-dark-high: rgba(255, 255, 255, 0.28); +$editor-color-dark-blockquote: rgba(255, 255, 255, 0.48); + +$editor-font-weight-base: 400; +$editor-font-weight-bold: 600; diff --git a/static/landing/abc.png b/static/landing/abc.png new file mode 100644 index 0000000000000000000000000000000000000000..da05fc7100a099b92ac3109a579d9daf5b9b1540 GIT binary patch literal 19878 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 literal 0 HcmV?d00001 diff --git a/static/landing/discussion.png b/static/landing/discussion.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a0189229406403d9de4b83c546b4e0cef4510e GIT binary patch literal 36410 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%0Au8gtGW$_E9;pP$D2J6J=2L)}r^wJtEFuMOyv z_c_A>2{~{3dDgMr;@3u#Zom3utk>dpz|3sZoqT_;(hQj5JkFW{2Tp*Pg(%ba0gvoU zn3B{YPfBWPWPED2!LOqc5iDzsuwZ@GF`6>J*gM z;{x3^sC_b^=EOov-@t?$yy%V;2Noul|B4X!3o>XmL;>eq2n2G`9~l-F5NzWghFWyG zIZ$iZ7crU|Nr_nU^QQ?ws-aE{q2wN6m-}L?5WoX@Ob{1H?mK z)f<>=y8)|8x6?iXVBla1d@zymsHv%Kr^^+n*-8Q^Dbr*UWN7ye5BtvfDw;Ns@fp-V z@saNqrsxjeZgpx#?z*QLO{@Y-O-J;ShS{t6N-#Ho#}bRnf%?MYBCpfmUo->KnYO1J zecw`2YJpAU)$wW$?<}DRux%#cvZe%WP#=$59Y1YHg#Bm2paQDkOJM(*y*oKS52ku) z7aM3ol5zb3MhYei{15!niTNfrfltSnQ$AZi)S4-PQXkka$)vG~*_MSt$1=yMWC@oRdz2Z+RjJLoQJ4PG%p}mZ48F1Sr;M*2ffJ_80>EoU5(o zm?~P1J^*R_rQ#=WiqOC#@BrMx4?El)U4$YG_&tO@2{h7do7fJV!$0e{c6WEJ>psSa z`1tsYS119`6sYyoob#!74)6w%%MplX4Y@tvtp&1|0q{^z~Qfe1S=yapNQpDKe_Ew0BqV8tQ$x}|0H?(JLsz6d(+c0)q4KmwZB)za}T+ z=OHaEpq)9T@YMGxT@-wPkaEQ=dlzby4M({a7w#BX$FnAQs#70!qDLR<2nj8MUfQm$D~|9|cIFM)Z_H)dQ^0_OG4^IiizQvq6}_3dW* z?~+_#W&z58E+y+-3aqApmC{81ruVOlsWtN`~CBvRfS)#$Ip+<(3|RY z@$TKTz$+PxX(9(OCttoixmf;ssiaws1OxCye-=jv3z>6g_FQ?duaykU zO*7vGJnsW0s(0_+*;fX9-H><~7zN^Y_ix{BzWR2kiIghvItH($zxJ-PX9qVQzBr0N zs#s9HI+0(W_Z~3zF>76DZHrzRqgKMWs%$!Fwv0a!wR*RL(kI2`_n!j8&hd9W4~N7- TjTLN73_#%N>gTe~DWM4fuaaN{ literal 0 HcmV?d00001 diff --git a/static/landing/favicon.ico b/static/landing/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1704ee86d73f7381a17833fcd120052333eeb2a8 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/static/landing/gfm.png b/static/landing/gfm.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddf4a84acc971318f57297ddd252f8d2822e36c GIT binary patch literal 16128 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 + + + 文章分享 - StackEdit中文版 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/landing/index.html b/static/landing/index.html new file mode 100644 index 0000000..2277978 --- /dev/null +++ b/static/landing/index.html @@ -0,0 +1,539 @@ + + + + + StackEdit中文版 – 浏览器内 Markdown 编辑器 & 笔记利器 + + + + + + + + + + + + + + + +
        + +
        + + +
        +
        +
        +

        无与伦比的写作体验

        +
        +
        +
        +

        丰富的 Markdown 编辑器

        +

        StackEdit中文版 的 Markdown 语法高亮是独一无二的。 编辑器的精致文本格式可帮助您可视化文件的最终呈现。

        +
        +
        +
        +
        + +
        +
        +
        +
        + +
        +

        所见即所得控件

        +

        StackEdit中文版 提供了非常方便的格式化按钮和快捷方式,这要归功于 Stack Overflow 使用的所见即所得式 Markdown 编辑器 PageDown。

        +
        +
        +
        +
        +
        +

        智能布局

        +

        无论你是写作、阅读还是评论……StackEdit中文版的布局都为你提供了所需的灵活性。

        +
        +
        +
        + +
        +
        +
        +
        +

        滚动同步实时预览

        +

        StackEdit中文版的滚动同步功能精确地绑定了编辑器面板和预览面板的滚动条,以确保您在编写时始终关注输出。

        +
        + +
        +

        专为网络写手设计

        +
        +
        +
        +

        保持同步

        +

        StackEdit中文版 可以将您的文件与 Gitee、GitHub、Google Drive 和 Dropbox 同步。 它还可以将它们作为博客文章发布到 Blogger、WordPress 和 Zendesk。 您可以选择是以 Markdown 格式、HTML 上传,还是使用 Handlebars 模板引擎格式化输出。

        +
        +
        +
        + +
        +
        +
        +
        +
        +

        协作

        +

        借助 StackEdit中文版,您可以共享协作文档空间,这要归功于同步机制。 如果两个协作者同时处理同一个文件,StackEdit中文版 会负责合并更改。

        +
        + +
        +
        +
        +

        评论

        +

        StackEdit中文版 允许您在文件中插入内联评论和嵌入协作者讨论,就像 Microsoft Word 和 Google Docs 一样。

        +
        + +
        +
        +
        +
        +

        离线写作!

        +

        即使在旅行时,StackEdit中文版 仍然可以访问,让您可以像任何桌面应用程序一样离线编写。 你没有借口再偷懒!

        +
        +
        +

        扩展的 Markdown 支持

        +
        +
        +
        +
        + +
        +
        +
        +
        +

        GitHub 风格的 Markdown

        +

        StackEdit中文版 支持不同的 Markdown 风格,例如 Markdown Extra、GFM 和 CommonMark。 每个 Markdown 功能都可以在您方便的时候启用或禁用。

        +
        +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        +

        LaTeX 数学表达式

        +

        StackEdit中文版 从您的 Markdown 文件中的 LaTeX 表达式呈现数学公式。

        +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        +

        UML 图

        +

        StackEdit中文版 使您能够使用简单的语法编写序列图和流程图。

        +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        +

        乐谱

        +

        StackEdit中文版 可以使用 ABC 表示法渲染乐谱。

        +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        +

        Emojis表情

        +

        StackEdit中文版 支持使用 Markdown 表情符号标记在文件中插入表情符号。

        +
        +
        +
        +
        + +
        + + + + + + + diff --git a/static/landing/katex.gif b/static/landing/katex.gif new file mode 100644 index 0000000000000000000000000000000000000000..216677ddf512110a4561e50b20d26b9f9cdb4bb8 GIT binary patch literal 5812 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 literal 0 HcmV?d00001 diff --git a/static/landing/logo.svg b/static/landing/logo.svg new file mode 100644 index 0000000..5611016 --- /dev/null +++ b/static/landing/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/landing/mermaid.gif b/static/landing/mermaid.gif new file mode 100644 index 0000000000000000000000000000000000000000..8dcab22c1e52cd95749a3b98c16535f455c3c974 GIT binary patch literal 13545 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 literal 0 HcmV?d00001 diff --git a/static/landing/navigation-bar.png b/static/landing/navigation-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..6e81e8dcc1cfc15c4b6cdf9e5c6064df4ade382d GIT binary patch literal 4425 zcmai1c{tSF+aD=Q&saib$&!#H>rjN`nTX8TWf?Ry_I2!IdnB?Z`!19%A&RmL6%s}! z#yZxR$krn37=CAZ-uHU1-(T-F*PQ)(pZlD1-=F()#~C7Z*pBlbhd>}~x;Np*5C|g- zv<+F9Ksj(IR|YC3`&&A2$RYh#gfCA6Bdp#xEqx)7Q{wbLgRZgI4=~8=r;E73{Dpy; zlkKNQ*ytKeJV&?y2BACV*K=t$(hP1 z9qo^UrmjyN%gy3ResQYsW#>ks%x3BllYUc^Q`S-}UXw9trtd5Cut=UJ#^$tvKqmnQ z?iu`dCp|g#x$*Gr@b7qPdtKgTFXdxE6Nu>2xmx`^#FxsOGlq;g`P8v@aGgf|ZHbq9*UTdrQqVp^tnLlahKmJMSkZ zC*Q)`o+r^IofGlv8(&xuLraK_=_8SYoM7y&By%nhYW1Lz0rX1voGl7ib;y5K3pvxP ze>CZ$AxHV?r3mr=%KuXGUsW}W=t3Yz*yttapU?j-|4Yd6y=)2k0`12xxvBaR7#wbo zG@!1gmfqiw`17gUa#T2C2tEX>99^-uG?xyq-Q5jt3Zri2Oi;dbB^XQcu)s7;d1KBt z*Ce2M*GKb_mt+bAz>c3`2+yfz@o#=sFvNzsZKdf`3u!&PZSv~(z)ZRMo2AC0qIG{M z3B!obpFjV&y1H8V`1R}8=MVQclHEN#dJ;~{rtiI#k&%ga$ql;};qR|B5*0iI6E8sC zQpka>63=YnY~s60OsmZ5Jgjp*wJA-qrFxK!tA^i{Xtx^FN#8QRecL6S9on%p_WDQg z5e-5^1R7mD@1&Tar>l^Yo|ME^X)2Yn8nTD6%p|S&UnX?Qli=8B$AAEHM<*vrpKN=& zT?EbSU}v5~qd$HKhQK!Ei>37xw%LvP_fW84qr3k8W^slNyfM-;GVGKYq0Pt_Xx`L* z$1WJ6a@ZBz%Ou0RT$HUFHBqWuP!*A$kKq!RVGKeH-9@9(OCEC-=2c)(dX6{4UWQ(& zSXN(w>vIv&6sVHZ-2JRKF}XLrRPu6jQ(FSR_c}celQ1Y$n=`5Q&bCCMR^1Gjp})*n zm7euduUk zhKuFs>q(^f*a>$A$`#%e+Y>TXjoP>}&HdRcyAo(5eQHXV%VtzOt>+D6(1{dx<&_#M zPS-C#58}GiVLAHR2M1KI@$vEEKvP5IJoO=H3z`>t#=eF|D_&7ex@V$WKD2nCSgov#}PHTQ+Xu{M=NkjyJZE8giiO$P zw=`gD;F=}*j?VMD+MDpq=6SWH)VA&E+2V0s8Mn{omPOmDRSiE&@56w1cPF0$%L|aq z;fIrx`RRJ%6h}8xpU_b0EEyZ@;j}Z%nJ2%uv$K<#mDy;X5EJ;ap@H%jEDo*(40G6o zHy&p&Mk#eDI&C&(US-ECU3>8|xvH%Jlk+);>_Bb9~O3Sy>n_ zFWDb;E2Fi2H0m}6iyhq9tgO6{Q&51((3VGER3wwhk*AsZ>eXJtsvR92pPEX2u8{xz z` zxZ>cmqX}L1OTH6ME>>iPPmv$$pVw?-v&;B`+B+p@7zY!qswJ)+>^xa&Ue6nE@W@k` zR&Nc2KxGLF8@nbaKU566rVcDl#qpbI^;^EzH?&h;jgP+1e*~e!%*_1j7v)wHmZE16 zWqp$QHyF^{KhV+9iM0E!Ja1h!92)63mQnL#uC7!LMf!Uscw%xgy`!U}W+rg)lVB5W z^I2@HTEqcrWOTGe!wHAOi8vud+R)m=z>PlSyocgAlqgsgEVpHys)b1x)#*Lc+_QW% zr?Tc+VD}yx*!nE?^$BXg=8h~lF2*=U{ImHUOCsq|cy=8%aDaN4v+y}NwxZMNU z*p-ZU#(kY9Zacx@0fB)TA>1)$_l?Af_t`jsCqJ*LiD4?l;f3wF#xBkZsS|`GWO4!wZB8<-aVd&BMsuel}Sl+v~cOrtyfl0i+916QEtqYqw~7BKSQEzwvjmLRm~Z2HEQ0iizw!TY8N**x5Dnl#YOee-ijGTvh99_ zRdqbZ^4ILUC=TO{6ix0s7z~9p(6hMF>!FfYSSUe^-BG<%H1rm4Tl;dc`IZQ~ROMfH zU>%9ai_82&!Yq`o^wm$cN$2R}8VlWWzcyX2{_G6bARcXq0;nmKfs=|r7V%y0vNtMJ z4=I~WIIVnfrmz3mKYI1!&k6ng!4i!5IhQ)*#Pa&tHy4w!mP-IY0l>o$X(*ZV4h|0W z?d{)p3yXRKql998UR+{PywCrj%w;{ZZtLX23wdO*;iKC2g9#cQoM=kZf!w&LRv)S% zybGRqTIbpHX`Wq8UvF;_fN@5@x*VdJmJn{)J_qa2A|=Gtp-g;*uS|Rs3JG>=Xi%Do zHl}PblyEtI;c_*uOh>haj!&77XlQa=Y(UkHmZD@@Xkj7k{(gR900mODia8UgiD^Ag zL8O=&eG()h8>x-#Jyi>0j=?qBQ&OfPVo2@$i(r?*eI9{p}4{9~gBaAnUcx5T)LX{2}WA_bf$qLML|#xhwB zFDX~jdSWq_h4PQlylt$lwmiq9-!gWy!WP{@a0%a;W8PhF`JT?Igk}uUJ5hCB(i@|| zHzQ<~(J{WY)mWZ3Gd;b9k~Xs))-N?yxP1A1gB4eW zW!Njtx$(wKwgejVQtHPVFE!Wn?eB-$q05XbIi0m{h^9O$EfvQ!K92Ud>~IIN>2z86k3aPhD)T3DGm! z7I6G>M~t!m*RT53wY6xCaN3@KQ^a8#;75C^{WIZIgl%ik32H)2{4s`4suhDUghGz~ z5_a{8PV$wz7e7?EpORjJJDcOKk|!ruD{Jw-iw{F2IyV*vFkxZ%72mS*a`oZtFFd){ zf9uLx3m}GmdsI))%p~hy3!A1ZsJ(EP?6z_k;_ExKp=zB;Q7Jj=4kg)6Tlymfjus%e z%jFd7Bg^s%3Ir`}Z8N)*g{eZmT1n3$W9~ub+{pn>%Tbx;h@pi82F~Ba;kh}qLD*0gF z64R1W_hg3Uzsba!{Bw0>f{N`k8sfHCd1KM+jyBscE= z>XWtSjj8PiuHO4z0dMtN{MRmg|EX-#7i0*ZCnG&fp__W@_k$w^> z9n}(mSf9oV?Ch+sd%D}68G;%3PhWS7=5)$Dw>}(a<;CR(Kuxy^#lA*_cCbKUlPrRE z)u+SBjTjG)el|Q{88tZeUP-Ss7g|25HAvo@f*s?AGYQZJ& z>yRCl;j7pt)a;g`D&zhE^*dnRQ~2>u$`@18#_wdjzKVHixh+)kBBKiZ+JHwRqRU?X z_dyF9kZvAFLut})>i!kz*OkrY=e4yV=CDlW=-ZT5yz0xiKCj*3f>1{%Bf zN50L@L>!i$(9U@7G>4LdyeVlaq-H>lw+rZ$P4VhxB4< zxXM(j2VgpZK!EP=zXE&^ICP4K@1KN^Gv$#Eaf2HBCoTN{l1Ro<)c9A&mpxVNKs2W_ zi!7)>s+m?Cgz=j6u(;Xio&g5peg`7=iOzyz;zQ80C@T3=ru zu1tU``n3WAR&jU`%nUVm1Jj%>nj3qYZhXSRhj*eT!;f?nX=#^7l#jdj0&vs*8YsN5 z(&0)^k?pyir`scBL0Tzs{``Q_Sia7qZ`)2l8uEYAdf}YY-b73;s}fzC8$~`^{Sk+> z%L-AO8{y$RY$d6D*7SUwGeMJ^@-7tBG2o)b^uYZHJ!j`md3TjD08DDC3x7TeYDmd) YM9%CHBI{8nKYCa91`=MQb?4rH0J9rOS^xk5 literal 0 HcmV?d00001 diff --git a/static/landing/privacy_policy.html b/static/landing/privacy_policy.html new file mode 100644 index 0000000..0525366 --- /dev/null +++ b/static/landing/privacy_policy.html @@ -0,0 +1,96 @@ + + + + + + + + + + + 隐私权政策 + + + +

        隐私权政策

        +
        + 【StackEdit中文版】(以下简称“此站”)深知个人信息对您的重要性, 故不会特意收集个人信息。 +
        +
        + 请在使用我们的产品(或服务)前,仔细阅读并了解本《隐私权政策》。 +
        +
        + 一、关于您的文件信息 +
        +
        + 个人文档都是存储在第三方,此站对所有第三方的文件都是在您授权之后,通过您的浏览器直接访问,并不会在此站后端获取和保存您的任何个人文件信息。 +
        +
        + 二、关于您的用户信息 +
        +
        + 本站不存在注册行为,待您授权后,您在第三方平台上个人信息的获取仅仅是在您的浏览器中直接获取,并不会在此站后端获取和保存您的个人信息。 +
        +
        + 三、其他 +
        +
        + 我们可能会更新本隐私政策,以反映我们的业务需求和适用法律的变化。在更新隐私政策时,我们会通过我们的网站或其他合适的方式通知您。如果您继续使用我们的服务,则意味着您同意更新后的隐私政策。 +
        +
        + 四、如何联系我们 +
        +
        + 如果您对本隐私政策有任何疑问、意见或建议,通过以下方式与我们联系: +
        +
        + 邮箱:【mafgwo@163.com】 +
        +
        + 微信:【qicoding】 +
        +
        + 一般情况下,我们将在一周内回复。 +
        + + \ No newline at end of file diff --git a/static/landing/providers.png b/static/landing/providers.png new file mode 100644 index 0000000000000000000000000000000000000000..309ef180bbd282989aa36bf6daf313670f34b047 GIT binary patch literal 40371 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 Q?0D_J{ts)J5J>p{0S=KgcK`qY literal 0 HcmV?d00001 diff --git a/static/landing/share.html b/static/landing/share.html new file mode 100644 index 0000000..9c4deb1 --- /dev/null +++ b/static/landing/share.html @@ -0,0 +1,177 @@ + + + + 文章分享 - StackEdit中文版 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/landing/smart-layout.png b/static/landing/smart-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..9475214289554c19f68f0873a2f3b704bc29a993 GIT binary patch literal 9013 zcmeHNdr%Wc7~czNAQVK5l^_v$31#XGMpGnW0TB%uF*>$WiiO4+dH5hiBM=Ni)QX}3 zd{jk=C_0j9RS04Q1;bIDM2rJcE8!Kmg0CteQN}i)l-^!!|LK3~I8}3*%! z-|qL@@A8-OIL?lf9RUE&+~}xf08owqVE3H^1<$F<>GQ#Fl$DD(QD6-Ij$c;p$8)Hn z=r}O|lcvEx!d>QP#xw0Vau+YK??Wgbu_m&3US9y<1-Mc3zL0bdbTftVdL*w^n(tk< zXQyLTtE1u+Ir;!Auv?V6`c^FsTVA*Hl(Whw*(LIprtb6C6_8P`2Le9;w_7Pc$Imak`s zrt)IoBLETJEQCnxaac^;fnOxen#jLNCK3@owko(FUP>7*Q1OV@_FME!Om>0FBe@dFGVk=#NrBm5N*BR*zf5gOHNW%3rvy5uF z(b3USTU$GWJXeJ~od*+{WMJ43s;TMS+~`sva2mr@{6}9c3Cii5B)h`YW;Z)68De zI>byPJk39ZqnWGbjBX1A;~szJDI1%^wCWygf4g`^6Am~4RQ#bGE`s4(d~FE(Qwr)m z{CKoDJX>Xlwh+8Yl@_j^s+*l#ZHI1AYwgV870q@8@VwTapaPk1u=XpVw)oaWMtR~| zya4-#inA?7<=qTNKFuz$M{S02{$x@Z~7xu+1+8732! zE9*UvqvnUiIE}$@)Emnb<>Z8wekM(FfMYK8!!^G^%=1M}D{8t5n0f6`0Owb+B_R zu%j3N&qHHZ%h^gM(e76TERKFrJpNT^$tnQ}V6${>6vpXu$KvDV14pK)Tl@V>p?YB#LjIW3P(=T0ugrudFu}j=J5Wj9Pf@?%h+w zIRXCo?^=!XNzR>-kxe()&WL?dLTtb!sCmiwNE%}=TWK|Bw5N8C3w(`@MiEl5acUbF zY&6Ph3N{)AsUg1q~aYV*tj`U*_sZ4q81m}S| zRO-9sbBmkP|h z^`fh$V%gJmE6Ji%$aBzEhsC0WJ?hPCtuebo4du64zyh#RYm|b9vtaNron0l&j zy{k*W+L|eu`q_dfQ4?YLfa?)iz@XDwYhY8h?Mthm!0}f)L3nfF(Vwon`2aw=0KWzJ zPfRw628sqQ1Oq)`&Lp5p6gSBOao;2qo-Q(J zi}e~TYv4lv;7C$T&|sj?UINQ%e-^T&+r90DrQ4r<+vEQ?{DEgjYN~9=9zww?A45`i zLN9%5a`+BG46(q;+;}M@^~{1M+O&F^m^j_4&sLv&9oD_CgDeW`$)4S$6YcW!_W+__ z)VZ6PdAXTjPwHSQ$PSI9DYpE6za@7}b!i4g@#Bt`V1RwkZ^aL{{@VR4@%dw&OaEX_ z)d!-Dc*Sjc5={}NXX7&&TlteyKGl*`Lx1rZ#?t?#8<&eL7-e#d;!*;D+y%U-ipUjP F{{}YWhjRb` literal 0 HcmV?d00001 diff --git a/static/landing/syntax-highlighting.gif b/static/landing/syntax-highlighting.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf967b5cffeb8c2be5abb97335a8fb74f376e3b2 GIT binary patch literal 19260 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 GfB-vw literal 0 HcmV?d00001 diff --git a/static/landing/twemoji.png b/static/landing/twemoji.png new file mode 100644 index 0000000000000000000000000000000000000000..a3919a83f80b7fed84df60b751a39498e79e877a GIT binary patch literal 12872 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 Qd(08?GD^~Al7{~O2Nper?f?J) literal 0 HcmV?d00001 diff --git a/static/oauth2/callback.html b/static/oauth2/callback.html new file mode 100644 index 0000000..0778358 --- /dev/null +++ b/static/oauth2/callback.html @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/sitemap.xml b/static/sitemap.xml new file mode 100644 index 0000000..4526336 --- /dev/null +++ b/static/sitemap.xml @@ -0,0 +1,23 @@ + + + + https://stackedit.cn/ + weekly + 1.0 + + + https://stackedit.cn/app + weekly + 1.0 + + + https://gitee.com/mafgwo/stackedit/issues + weekly + 0.8 + + + https://stackedit.cn/privacy_policy.html + monthly + 0.6 + + diff --git a/static/themes/edit-theme-azure.js b/static/themes/edit-theme-azure.js new file mode 100644 index 0000000..0d9c6c0 --- /dev/null +++ b/static/themes/edit-theme-azure.js @@ -0,0 +1,72 @@ +function init_edit_theme_azure() { + const style = document.createElement('style'); + style.id = 'edit-theme-azure'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--azure .editor__inner {\n\ + color: #fff;\n\ + caret-color: #fff;\n\ +}\n\ +.edit-theme--azure .editor {\n\ + background-color: #181D26;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--azure .editor__inner .cn-head,\n\ +.edit-theme--azure .editor-in-page-buttons .icon {\n\ + color: #64aeb3;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--azure .editor__inner .cn-strong {\n\ + color: #508aaa;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--azure .editor__inner .blockquote {\n\ + color: #52708b;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--azure .editor__inner .cl,\n\ +.edit-theme--azure .editor__inner .hr,\n\ +.edit-theme--azure .editor__inner .link,\n\ +.edit-theme--azure .editor__inner .linkref, \n\ +.edit-theme--azure .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--azure .editor__inner .cn-toc, \n\ +.edit-theme--azure .editor__inner .code,\n\ +.edit-theme--azure .editor__inner .img,\n\ +.edit-theme--azure .editor__inner .img-wrapper,\n\ +.edit-theme--azure .editor__inner .imgref,\n\ +.edit-theme--azure .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--azure .editor__inner .cn-code {\n\ + color: #6AB0A3;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--azure .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--azure .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--azure .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--azure .editor__inner .linkref .cl-underlined-text {\n\ + color: #64aeb3;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--azure .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--azure .editor__inner .keyword {\n\ + color: #508aaa;\n\ +}\n\ +.edit-theme--azure .editor__inner .email,\n\ +.edit-theme--azure .editor__inner .cl-title,\n\ +.edit-theme--azure .editor__inner .tag,\n\ +.edit-theme--azure .editor__inner .latex,\n\ +.edit-theme--azure .editor__inner .math,\n\ +.edit-theme--azure .editor__inner .entity,\n\ +.edit-theme--azure .editor__inner .pre [class*='language-'] {\n\ + color: #fff;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_azure(); \ No newline at end of file diff --git a/static/themes/edit-theme-carbonight.js b/static/themes/edit-theme-carbonight.js new file mode 100644 index 0000000..e670a1c --- /dev/null +++ b/static/themes/edit-theme-carbonight.js @@ -0,0 +1,72 @@ +function init_edit_theme_carbonight() { + const style = document.createElement('style'); + style.id = 'edit-theme-carbonight'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--carbonight .editor__inner {\n\ + color: #B0B0B0;\n\ + caret-color: #B0B0B0;\n\ +}\n\ +.edit-theme--carbonight .editor {\n\ + background-color: #2E2C2B;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--carbonight .editor__inner .cn-head,\n\ +.edit-theme--carbonight .editor-in-page-buttons .icon {\n\ + color: #B0B0B0;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--carbonight .editor__inner .cn-strong {\n\ + color: #eeeeee;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--carbonight .editor__inner .blockquote {\n\ + color: #8C8C8C;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--carbonight .editor__inner .cl,\n\ +.edit-theme--carbonight .editor__inner .hr,\n\ +.edit-theme--carbonight .editor__inner .link,\n\ +.edit-theme--carbonight .editor__inner .linkref, \n\ +.edit-theme--carbonight .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--carbonight .editor__inner .cn-toc, \n\ +.edit-theme--carbonight .editor__inner .code,\n\ +.edit-theme--carbonight .editor__inner .img,\n\ +.edit-theme--carbonight .editor__inner .img-wrapper,\n\ +.edit-theme--carbonight .editor__inner .imgref,\n\ +.edit-theme--carbonight .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--carbonight .editor__inner .cn-code {\n\ + color: #fff;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--carbonight .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--carbonight .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--carbonight .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--carbonight .editor__inner .linkref .cl-underlined-text {\n\ + color: #fff;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--carbonight .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--carbonight .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--carbonight .editor__inner .email,\n\ +.edit-theme--carbonight .editor__inner .cl-title,\n\ +.edit-theme--carbonight .editor__inner .tag,\n\ +.edit-theme--carbonight .editor__inner .latex,\n\ +.edit-theme--carbonight .editor__inner .math,\n\ +.edit-theme--carbonight .editor__inner .entity,\n\ +.edit-theme--carbonight .editor__inner .pre [class*='language-'] {\n\ + color: #B0B0B0;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_carbonight(); \ No newline at end of file diff --git a/static/themes/edit-theme-clouds.js b/static/themes/edit-theme-clouds.js new file mode 100644 index 0000000..12ccb8d --- /dev/null +++ b/static/themes/edit-theme-clouds.js @@ -0,0 +1,72 @@ +function init_edit_theme_clouds() { + const style = document.createElement('style'); + style.id = 'edit-theme-clouds'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--clouds .editor__inner {\n\ + color: #000;\n\ + caret-color: #000;\n\ +}\n\ +.edit-theme--clouds .editor {\n\ + background-color: #fff;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--clouds .editor__inner .cn-head,\n\ +.edit-theme--clouds .editor-in-page-buttons .icon {\n\ + color: #46A609;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--clouds .editor__inner .cn-strong {\n\ + color: #AF956F;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--clouds .editor__inner .blockquote {\n\ + color: #5D90CD;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--clouds .editor__inner .cl,\n\ +.edit-theme--clouds .editor__inner .hr,\n\ +.edit-theme--clouds .editor__inner .link,\n\ +.edit-theme--clouds .editor__inner .linkref, \n\ +.edit-theme--clouds .editor__inner .linkdef .url {\n\ + color: rgba(102,128,153,0.6);\n\ +}\n\ +.edit-theme--clouds .editor__inner .cn-toc, \n\ +.edit-theme--clouds .editor__inner .code,\n\ +.edit-theme--clouds .editor__inner .img,\n\ +.edit-theme--clouds .editor__inner .img-wrapper,\n\ +.edit-theme--clouds .editor__inner .imgref,\n\ +.edit-theme--clouds .editor__inner .cl-toc {\n\ + color: rgba(102,128,153,0.6);\n\ + background-color: rgba(102,128,153,0.075);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--clouds .editor__inner .cn-code {\n\ + color: #C52727;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--clouds .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--clouds .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--clouds .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--clouds .editor__inner .linkref .cl-underlined-text {\n\ + color: #5D90CD;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--clouds .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--clouds .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--clouds .editor__inner .email,\n\ +.edit-theme--clouds .editor__inner .cl-title,\n\ +.edit-theme--clouds .editor__inner .tag,\n\ +.edit-theme--clouds .editor__inner .latex,\n\ +.edit-theme--clouds .editor__inner .math,\n\ +.edit-theme--clouds .editor__inner .entity,\n\ +.edit-theme--clouds .editor__inner .pre [class*='language-'] {\n\ + color: #000;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_clouds(); \ No newline at end of file diff --git a/static/themes/edit-theme-clouds_midnight.js b/static/themes/edit-theme-clouds_midnight.js new file mode 100644 index 0000000..3cade63 --- /dev/null +++ b/static/themes/edit-theme-clouds_midnight.js @@ -0,0 +1,72 @@ +function init_edit_theme_clouds_midnight() { + const style = document.createElement('style'); + style.id = 'edit-theme-clouds_midnight'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--clouds_midnight .editor__inner {\n\ + color: #929292;\n\ + caret-color: #929292;\n\ +}\n\ +.edit-theme--clouds_midnight .editor {\n\ + background-color: #191919;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .cn-head,\n\ +.edit-theme--clouds_midnight .editor-in-page-buttons .icon {\n\ + color: #46A609;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .cn-strong {\n\ + color: #927C5D;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .blockquote {\n\ + color: #5D90CD;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .cl,\n\ +.edit-theme--clouds_midnight .editor__inner .hr,\n\ +.edit-theme--clouds_midnight .editor__inner .link,\n\ +.edit-theme--clouds_midnight .editor__inner .linkref, \n\ +.edit-theme--clouds_midnight .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--clouds_midnight .editor__inner .cn-toc, \n\ +.edit-theme--clouds_midnight .editor__inner .code,\n\ +.edit-theme--clouds_midnight .editor__inner .img,\n\ +.edit-theme--clouds_midnight .editor__inner .img-wrapper,\n\ +.edit-theme--clouds_midnight .editor__inner .imgref,\n\ +.edit-theme--clouds_midnight .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .cn-code {\n\ + color: #E92E2E;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--clouds_midnight .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--clouds_midnight .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--clouds_midnight .editor__inner .linkref .cl-underlined-text {\n\ + color: #5D90CD;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--clouds_midnight .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--clouds_midnight .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--clouds_midnight .editor__inner .email,\n\ +.edit-theme--clouds_midnight .editor__inner .cl-title,\n\ +.edit-theme--clouds_midnight .editor__inner .tag,\n\ +.edit-theme--clouds_midnight .editor__inner .latex,\n\ +.edit-theme--clouds_midnight .editor__inner .math,\n\ +.edit-theme--clouds_midnight .editor__inner .entity,\n\ +.edit-theme--clouds_midnight .editor__inner .pre [class*='language-'] {\n\ + color: #929292;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_clouds_midnight(); \ No newline at end of file diff --git a/static/themes/edit-theme-dawn.js b/static/themes/edit-theme-dawn.js new file mode 100644 index 0000000..02e3d0d --- /dev/null +++ b/static/themes/edit-theme-dawn.js @@ -0,0 +1,72 @@ +function init_edit_theme_dawn() { + const style = document.createElement('style'); + style.id = 'edit-theme-dawn'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--dawn .editor__inner {\n\ + color: #080808;\n\ + caret-color: #080808;\n\ +}\n\ +.edit-theme--dawn .editor {\n\ + background-color: #F9F9F9;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--dawn .editor__inner .cn-head,\n\ +.edit-theme--dawn .editor-in-page-buttons .icon {\n\ + color: #19356D;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--dawn .editor__inner .cn-strong {\n\ + color: #794938;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--dawn .editor__inner .blockquote {\n\ + color: #811F24;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--dawn .editor__inner .cl,\n\ +.edit-theme--dawn .editor__inner .hr,\n\ +.edit-theme--dawn .editor__inner .link,\n\ +.edit-theme--dawn .editor__inner .linkref, \n\ +.edit-theme--dawn .editor__inner .linkdef .url {\n\ + color: rgba(102,128,153,0.6);\n\ +}\n\ +.edit-theme--dawn .editor__inner .cn-toc, \n\ +.edit-theme--dawn .editor__inner .code,\n\ +.edit-theme--dawn .editor__inner .img,\n\ +.edit-theme--dawn .editor__inner .img-wrapper,\n\ +.edit-theme--dawn .editor__inner .imgref,\n\ +.edit-theme--dawn .editor__inner .cl-toc {\n\ + color: rgba(102,128,153,0.6);\n\ + background-color: rgba(102,128,153,0.075);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--dawn .editor__inner .cn-code {\n\ + color: #693A17;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--dawn .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--dawn .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--dawn .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--dawn .editor__inner .linkref .cl-underlined-text {\n\ + color: #0B6125;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--dawn .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--dawn .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--dawn .editor__inner .email,\n\ +.edit-theme--dawn .editor__inner .cl-title,\n\ +.edit-theme--dawn .editor__inner .tag,\n\ +.edit-theme--dawn .editor__inner .latex,\n\ +.edit-theme--dawn .editor__inner .math,\n\ +.edit-theme--dawn .editor__inner .entity,\n\ +.edit-theme--dawn .editor__inner .pre [class*='language-'] {\n\ + color: #080808;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_dawn(); \ No newline at end of file diff --git a/static/themes/edit-theme-espresso_libre.js b/static/themes/edit-theme-espresso_libre.js new file mode 100644 index 0000000..8b556c1 --- /dev/null +++ b/static/themes/edit-theme-espresso_libre.js @@ -0,0 +1,72 @@ +function init_edit_theme_espresso_libre() { + const style = document.createElement('style'); + style.id = 'edit-theme-espresso_libre'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--espresso_libre .editor__inner {\n\ + color: #BDAE9D;\n\ + caret-color: #BDAE9D;\n\ +}\n\ +.edit-theme--espresso_libre .editor {\n\ + background-color: #2A211C;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .cn-head,\n\ +.edit-theme--espresso_libre .editor-in-page-buttons .icon {\n\ + color: #44AA43;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .cn-strong {\n\ + color: #43A8ED;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .blockquote {\n\ + color: #52708b;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .cl,\n\ +.edit-theme--espresso_libre .editor__inner .hr,\n\ +.edit-theme--espresso_libre .editor__inner .link,\n\ +.edit-theme--espresso_libre .editor__inner .linkref, \n\ +.edit-theme--espresso_libre .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--espresso_libre .editor__inner .cn-toc, \n\ +.edit-theme--espresso_libre .editor__inner .code,\n\ +.edit-theme--espresso_libre .editor__inner .img,\n\ +.edit-theme--espresso_libre .editor__inner .img-wrapper,\n\ +.edit-theme--espresso_libre .editor__inner .imgref,\n\ +.edit-theme--espresso_libre .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .cn-code {\n\ + color: #7290D9;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--espresso_libre .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--espresso_libre .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--espresso_libre .editor__inner .linkref .cl-underlined-text {\n\ + color: #049B0A;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--espresso_libre .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--espresso_libre .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--espresso_libre .editor__inner .email,\n\ +.edit-theme--espresso_libre .editor__inner .cl-title,\n\ +.edit-theme--espresso_libre .editor__inner .tag,\n\ +.edit-theme--espresso_libre .editor__inner .latex,\n\ +.edit-theme--espresso_libre .editor__inner .math,\n\ +.edit-theme--espresso_libre .editor__inner .entity,\n\ +.edit-theme--espresso_libre .editor__inner .pre [class*='language-'] {\n\ + color: #BDAE9D;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_espresso_libre(); \ No newline at end of file diff --git a/static/themes/edit-theme-github.js b/static/themes/edit-theme-github.js new file mode 100644 index 0000000..a78e025 --- /dev/null +++ b/static/themes/edit-theme-github.js @@ -0,0 +1,73 @@ +function init_edit_theme_github() { + const style = document.createElement('style'); + style.id = 'edit-theme-github'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--github .editor__inner {\n\ + color: #000;\n\ + caret-color: #000;\n\ + background-color: #fff;\n\ +}\n\ +.edit-theme--github .editor {\n\ + background-color: #fff;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--github .editor__inner .cn-head,\n\ +.edit-theme--github .editor-in-page-buttons .icon {\n\ + color: #AAAAAA;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--github .editor__inner .cn-strong {\n\ + color: #000;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--github .editor__inner .blockquote {\n\ + color: rgba(0,0,0,0.48);\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--github .editor__inner .cl,\n\ +.edit-theme--github .editor__inner .hr,\n\ +.edit-theme--github .editor__inner .link,\n\ +.edit-theme--github .editor__inner .linkref, \n\ +.edit-theme--github .editor__inner .linkdef .url {\n\ + color: rgba(0,0,0,0.28);\n\ +}\n\ +.edit-theme--github .editor__inner .cn-toc, \n\ +.edit-theme--github .editor__inner .code,\n\ +.edit-theme--github .editor__inner .img,\n\ +.edit-theme--github .editor__inner .img-wrapper,\n\ +.edit-theme--github .editor__inner .imgref,\n\ +.edit-theme--github .editor__inner .cl-toc {\n\ + color: rgba(0,0,0,0.28);\n\ + background-color: rgba(102,128,153,0.075);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--github .editor__inner .cn-code {\n\ + color: #0086B3;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--github .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--github .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--github .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--github .editor__inner .linkref .cl-underlined-text {\n\ + color: #D14;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--github .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--github .editor__inner .keyword {\n\ + color: rgba(0,0,0,0.75);\n\ +}\n\ +.edit-theme--github .editor__inner .email,\n\ +.edit-theme--github .editor__inner .cl-title,\n\ +.edit-theme--github .editor__inner .tag,\n\ +.edit-theme--github .editor__inner .latex,\n\ +.edit-theme--github .editor__inner .math,\n\ +.edit-theme--github .editor__inner .entity,\n\ +.edit-theme--github .editor__inner .pre [class*='language-'] {\n\ + color: #29333d;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_github(); \ No newline at end of file diff --git a/static/themes/edit-theme-iceberg_contrast.js b/static/themes/edit-theme-iceberg_contrast.js new file mode 100644 index 0000000..12e44ba --- /dev/null +++ b/static/themes/edit-theme-iceberg_contrast.js @@ -0,0 +1,72 @@ +function init_edit_theme_iceberg_contrast() { + const style = document.createElement('style'); + style.id = 'edit-theme-iceberg_contrast'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--iceberg_contrast .editor__inner {\n\ + color: #BDD6DB;\n\ + caret-color: #fff;\n\ +}\n\ +.edit-theme--iceberg_contrast .editor {\n\ + background-color: #0b0e0e;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .cn-head,\n\ +.edit-theme--iceberg_contrast .editor-in-page-buttons .icon {\n\ + color: #fff;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .cn-strong {\n\ + color: #B1E2F2;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .blockquote {\n\ + color: #ffffff;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .cl,\n\ +.edit-theme--iceberg_contrast .editor__inner .hr,\n\ +.edit-theme--iceberg_contrast .editor__inner .link,\n\ +.edit-theme--iceberg_contrast .editor__inner .linkref, \n\ +.edit-theme--iceberg_contrast .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--iceberg_contrast .editor__inner .cn-toc, \n\ +.edit-theme--iceberg_contrast .editor__inner .code,\n\ +.edit-theme--iceberg_contrast .editor__inner .img,\n\ +.edit-theme--iceberg_contrast .editor__inner .img-wrapper,\n\ +.edit-theme--iceberg_contrast .editor__inner .imgref,\n\ +.edit-theme--iceberg_contrast .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .cn-code {\n\ + color: #fff;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--iceberg_contrast .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--iceberg_contrast .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--iceberg_contrast .editor__inner .linkref .cl-underlined-text {\n\ + color: #fff;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--iceberg_contrast .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--iceberg_contrast .editor__inner .keyword {\n\ + color: #fff;\n\ +}\n\ +.edit-theme--iceberg_contrast .editor__inner .email,\n\ +.edit-theme--iceberg_contrast .editor__inner .cl-title,\n\ +.edit-theme--iceberg_contrast .editor__inner .tag,\n\ +.edit-theme--iceberg_contrast .editor__inner .latex,\n\ +.edit-theme--iceberg_contrast .editor__inner .math,\n\ +.edit-theme--iceberg_contrast .editor__inner .entity,\n\ +.edit-theme--iceberg_contrast .editor__inner .pre [class*='language-'] {\n\ + color: #BDD6DB;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_iceberg_contrast(); \ No newline at end of file diff --git a/static/themes/edit-theme-lavender.js b/static/themes/edit-theme-lavender.js new file mode 100644 index 0000000..0ea85fd --- /dev/null +++ b/static/themes/edit-theme-lavender.js @@ -0,0 +1,72 @@ +function init_edit_theme_lavender() { + const style = document.createElement('style'); + style.id = 'edit-theme-lavender'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--lavender .editor__inner {\n\ + color: #E0CEED;\n\ + caret-color: #E0CEED;\n\ +}\n\ +.edit-theme--lavender .editor {\n\ + background-color: #29222E;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--lavender .editor__inner .cn-head,\n\ +.edit-theme--lavender .editor-in-page-buttons .icon {\n\ + color: #F25AE6;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--lavender .editor__inner .cn-strong {\n\ + color: #8E6DA6;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--lavender .editor__inner .blockquote {\n\ + color: #B657FF;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--lavender .editor__inner .cl,\n\ +.edit-theme--lavender .editor__inner .hr,\n\ +.edit-theme--lavender .editor__inner .link,\n\ +.edit-theme--lavender .editor__inner .linkref, \n\ +.edit-theme--lavender .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--lavender .editor__inner .cn-toc, \n\ +.edit-theme--lavender .editor__inner .code,\n\ +.edit-theme--lavender .editor__inner .img,\n\ +.edit-theme--lavender .editor__inner .img-wrapper,\n\ +.edit-theme--lavender .editor__inner .imgref,\n\ +.edit-theme--lavender .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--lavender .editor__inner .cn-code {\n\ + color: #8E69C9;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--lavender .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--lavender .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--lavender .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--lavender .editor__inner .linkref .cl-underlined-text {\n\ + color: #F5B0EF;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--lavender .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--lavender .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--lavender .editor__inner .email,\n\ +.edit-theme--lavender .editor__inner .cl-title,\n\ +.edit-theme--lavender .editor__inner .tag,\n\ +.edit-theme--lavender .editor__inner .latex,\n\ +.edit-theme--lavender .editor__inner .math,\n\ +.edit-theme--lavender .editor__inner .entity,\n\ +.edit-theme--lavender .editor__inner .pre [class*='language-'] {\n\ + color: #E0CEED;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_lavender(); \ No newline at end of file diff --git a/static/themes/edit-theme-mintchoc.js b/static/themes/edit-theme-mintchoc.js new file mode 100644 index 0000000..05795dc --- /dev/null +++ b/static/themes/edit-theme-mintchoc.js @@ -0,0 +1,72 @@ +function init_edit_theme_mintchoc() { + const style = document.createElement('style'); + style.id = 'edit-theme-mintchoc'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--mintchoc .editor__inner {\n\ + color: #BABABA;\n\ + caret-color: #BABABA;\n\ +}\n\ +.edit-theme--mintchoc .editor {\n\ + background-color: #2b221c;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--mintchoc .editor__inner .cn-head,\n\ +.edit-theme--mintchoc .editor-in-page-buttons .icon {\n\ + color: #00E08C;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--mintchoc .editor__inner .cn-strong {\n\ + color: #9D8262;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--mintchoc .editor__inner .blockquote {\n\ + color: #008D62;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--mintchoc .editor__inner .cl,\n\ +.edit-theme--mintchoc .editor__inner .hr,\n\ +.edit-theme--mintchoc .editor__inner .link,\n\ +.edit-theme--mintchoc .editor__inner .linkref, \n\ +.edit-theme--mintchoc .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--mintchoc .editor__inner .cn-toc, \n\ +.edit-theme--mintchoc .editor__inner .code,\n\ +.edit-theme--mintchoc .editor__inner .img,\n\ +.edit-theme--mintchoc .editor__inner .img-wrapper,\n\ +.edit-theme--mintchoc .editor__inner .imgref,\n\ +.edit-theme--mintchoc .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--mintchoc .editor__inner .cn-code {\n\ + color: #008D62;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--mintchoc .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--mintchoc .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--mintchoc .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--mintchoc .editor__inner .linkref .cl-underlined-text {\n\ + color: #00E08C;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--mintchoc .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--mintchoc .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--mintchoc .editor__inner .email,\n\ +.edit-theme--mintchoc .editor__inner .cl-title,\n\ +.edit-theme--mintchoc .editor__inner .tag,\n\ +.edit-theme--mintchoc .editor__inner .latex,\n\ +.edit-theme--mintchoc .editor__inner .math,\n\ +.edit-theme--mintchoc .editor__inner .entity,\n\ +.edit-theme--mintchoc .editor__inner .pre [class*='language-'] {\n\ + color: #BABABA;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_mintchoc(); \ No newline at end of file diff --git a/static/themes/edit-theme-peacock.js b/static/themes/edit-theme-peacock.js new file mode 100644 index 0000000..02054ec --- /dev/null +++ b/static/themes/edit-theme-peacock.js @@ -0,0 +1,72 @@ +function init_edit_theme_peacock() { + const style = document.createElement('style'); + style.id = 'edit-theme-peacock'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--peacock .editor__inner {\n\ + color: #ede0ce;\n\ + caret-color: #ede0ce;\n\ +}\n\ +.edit-theme--peacock .editor {\n\ + background-color: #2b2a27;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--peacock .editor__inner .cn-head,\n\ +.edit-theme--peacock .editor-in-page-buttons .icon {\n\ + color: #bcd42a;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--peacock .editor__inner .cn-strong {\n\ + color: #26A6A6;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--peacock .editor__inner .blockquote {\n\ + color: #ff5d38;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--peacock .editor__inner .cl,\n\ +.edit-theme--peacock .editor__inner .hr,\n\ +.edit-theme--peacock .editor__inner .link,\n\ +.edit-theme--peacock .editor__inner .linkref, \n\ +.edit-theme--peacock .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--peacock .editor__inner .cn-toc, \n\ +.edit-theme--peacock .editor__inner .code,\n\ +.edit-theme--peacock .editor__inner .img,\n\ +.edit-theme--peacock .editor__inner .img-wrapper,\n\ +.edit-theme--peacock .editor__inner .imgref,\n\ +.edit-theme--peacock .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--peacock .editor__inner .cn-code {\n\ + color: #FF5D38;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--peacock .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--peacock .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--peacock .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--peacock .editor__inner .linkref .cl-underlined-text {\n\ + color: #bcd42a;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--peacock .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--peacock .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--peacock .editor__inner .email,\n\ +.edit-theme--peacock .editor__inner .cl-title,\n\ +.edit-theme--peacock .editor__inner .tag,\n\ +.edit-theme--peacock .editor__inner .latex,\n\ +.edit-theme--peacock .editor__inner .math,\n\ +.edit-theme--peacock .editor__inner .entity,\n\ +.edit-theme--peacock .editor__inner .pre [class*='language-'] {\n\ + color: #ede0ce;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_peacock(); \ No newline at end of file diff --git a/static/themes/edit-theme-slate.js b/static/themes/edit-theme-slate.js new file mode 100644 index 0000000..cde34d4 --- /dev/null +++ b/static/themes/edit-theme-slate.js @@ -0,0 +1,72 @@ +function init_edit_theme_slate() { + const style = document.createElement('style'); + style.id = 'edit-theme-slate'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--slate .editor__inner {\n\ + color: #ebebf4;\n\ + caret-color: #ebebf4;\n\ +}\n\ +.edit-theme--slate .editor {\n\ + background-color: #19191f;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--slate .editor__inner .cn-head,\n\ +.edit-theme--slate .editor-in-page-buttons .icon {\n\ + color: #9eb2d9;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--slate .editor__inner .cn-strong {\n\ + color: #566981;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--slate .editor__inner .blockquote {\n\ + color: #89A7B1;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--slate .editor__inner .cl,\n\ +.edit-theme--slate .editor__inner .hr,\n\ +.edit-theme--slate .editor__inner .link,\n\ +.edit-theme--slate .editor__inner .linkref, \n\ +.edit-theme--slate .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--slate .editor__inner .cn-toc, \n\ +.edit-theme--slate .editor__inner .code,\n\ +.edit-theme--slate .editor__inner .img,\n\ +.edit-theme--slate .editor__inner .img-wrapper,\n\ +.edit-theme--slate .editor__inner .imgref,\n\ +.edit-theme--slate .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--slate .editor__inner .cn-code {\n\ + color: #89A7B1;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--slate .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--slate .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--slate .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--slate .editor__inner .linkref .cl-underlined-text {\n\ + color: #9eb2d9;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--slate .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--slate .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--slate .editor__inner .email,\n\ +.edit-theme--slate .editor__inner .cl-title,\n\ +.edit-theme--slate .editor__inner .tag,\n\ +.edit-theme--slate .editor__inner .latex,\n\ +.edit-theme--slate .editor__inner .math,\n\ +.edit-theme--slate .editor__inner .entity,\n\ +.edit-theme--slate .editor__inner .pre [class*='language-'] {\n\ + color: #ebebf4;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_slate(); \ No newline at end of file diff --git a/static/themes/edit-theme-solarflare.js b/static/themes/edit-theme-solarflare.js new file mode 100644 index 0000000..e9a6d44 --- /dev/null +++ b/static/themes/edit-theme-solarflare.js @@ -0,0 +1,72 @@ +function init_edit_theme_solarflare() { + const style = document.createElement('style'); + style.id = 'edit-theme-solarflare'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--solarflare .editor__inner {\n\ + color: #e3e2e0;\n\ + caret-color: #e3e2e0;\n\ +}\n\ +.edit-theme--solarflare .editor {\n\ + background-color: #292D30;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--solarflare .editor__inner .cn-head,\n\ +.edit-theme--solarflare .editor-in-page-buttons .icon {\n\ + color: #FF4E50;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--solarflare .editor__inner .cn-strong {\n\ + color: #FF4E50;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--solarflare .editor__inner .blockquote {\n\ + color: #FF4E50;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--solarflare .editor__inner .cl,\n\ +.edit-theme--solarflare .editor__inner .hr,\n\ +.edit-theme--solarflare .editor__inner .link,\n\ +.edit-theme--solarflare .editor__inner .linkref, \n\ +.edit-theme--solarflare .editor__inner .linkdef .url {\n\ + color: rgba(139,158,177,0.8);\n\ +}\n\ +.edit-theme--solarflare .editor__inner .cn-toc, \n\ +.edit-theme--solarflare .editor__inner .code,\n\ +.edit-theme--solarflare .editor__inner .img,\n\ +.edit-theme--solarflare .editor__inner .img-wrapper,\n\ +.edit-theme--solarflare .editor__inner .imgref,\n\ +.edit-theme--solarflare .editor__inner .cl-toc {\n\ + color: rgba(139,158,177,0.8);\n\ + background-color: rgba(0,0,0,0.33);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--solarflare .editor__inner .cn-code {\n\ + color: #FC913A;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--solarflare .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--solarflare .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--solarflare .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--solarflare .editor__inner .linkref .cl-underlined-text {\n\ + color: #EDE574;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--solarflare .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--solarflare .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--solarflare .editor__inner .email,\n\ +.edit-theme--solarflare .editor__inner .cl-title,\n\ +.edit-theme--solarflare .editor__inner .tag,\n\ +.edit-theme--solarflare .editor__inner .latex,\n\ +.edit-theme--solarflare .editor__inner .math,\n\ +.edit-theme--solarflare .editor__inner .entity,\n\ +.edit-theme--solarflare .editor__inner .pre [class*='language-'] {\n\ + color: #e3e2e0;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_solarflare(); \ No newline at end of file diff --git a/static/themes/edit-theme-solarized_light.js b/static/themes/edit-theme-solarized_light.js new file mode 100644 index 0000000..e83fae3 --- /dev/null +++ b/static/themes/edit-theme-solarized_light.js @@ -0,0 +1,72 @@ +function init_edit_theme_solarized_light() { + const style = document.createElement('style'); + style.id = 'edit-theme-solarized_light'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--solarized_light .editor__inner {\n\ + color: #586E75;\n\ + caret-color: #586E75;\n\ +}\n\ +.edit-theme--solarized_light .editor {\n\ + background-color: #FDF6E3;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--solarized_light .editor__inner .cn-head,\n\ +.edit-theme--solarized_light .editor-in-page-buttons .icon {\n\ + color: #D33682;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--solarized_light .editor__inner .cn-strong {\n\ + color: #859900;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--solarized_light .editor__inner .blockquote {\n\ + color: #CB4B16;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--solarized_light .editor__inner .cl,\n\ +.edit-theme--solarized_light .editor__inner .hr,\n\ +.edit-theme--solarized_light .editor__inner .link,\n\ +.edit-theme--solarized_light .editor__inner .linkref, \n\ +.edit-theme--solarized_light .editor__inner .linkdef .url {\n\ + color: rgba(102,128,153,0.6);\n\ +}\n\ +.edit-theme--solarized_light .editor__inner .cn-toc, \n\ +.edit-theme--solarized_light .editor__inner .code,\n\ +.edit-theme--solarized_light .editor__inner .img,\n\ +.edit-theme--solarized_light .editor__inner .img-wrapper,\n\ +.edit-theme--solarized_light .editor__inner .imgref,\n\ +.edit-theme--solarized_light .editor__inner .cl-toc {\n\ + color: rgba(102,128,153,0.6);\n\ + background-color: rgba(102,128,153,0.075);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--solarized_light .editor__inner .cn-code {\n\ + color: #268BD2;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--solarized_light .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--solarized_light .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--solarized_light .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--solarized_light .editor__inner .linkref .cl-underlined-text {\n\ + color: #2AA198;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--solarized_light .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--solarized_light .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--solarized_light .editor__inner .email,\n\ +.edit-theme--solarized_light .editor__inner .cl-title,\n\ +.edit-theme--solarized_light .editor__inner .tag,\n\ +.edit-theme--solarized_light .editor__inner .latex,\n\ +.edit-theme--solarized_light .editor__inner .math,\n\ +.edit-theme--solarized_light .editor__inner .entity,\n\ +.edit-theme--solarized_light .editor__inner .pre [class*='language-'] {\n\ + color: #586E75;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_solarized_light(); \ No newline at end of file diff --git a/static/themes/edit-theme-spearmint.js b/static/themes/edit-theme-spearmint.js new file mode 100644 index 0000000..8c312ac --- /dev/null +++ b/static/themes/edit-theme-spearmint.js @@ -0,0 +1,72 @@ +function init_edit_theme_spearmint() { + const style = document.createElement('style'); + style.id = 'edit-theme-spearmint'; + style.type = 'text/css'; + style.innerHTML = "/* 默认字体颜色、光标颜色、背景颜色*/\n\ +.edit-theme--spearmint .editor__inner {\n\ + color: #719692;\n\ + caret-color: #719692;\n\ +}\n\ +.edit-theme--spearmint .editor {\n\ + background-color: #E1F0EE;\n\ +}\n\ +/* 标题颜色 */\n\ +.edit-theme--spearmint .editor__inner .cn-head,\n\ +.edit-theme--spearmint .editor-in-page-buttons .icon {\n\ + color: #199FA8;\n\ +}\n\ +/* 加粗颜色 */\n\ +.edit-theme--spearmint .editor__inner .cn-strong {\n\ + color: #69ADB5;\n\ +}\n\ +/* 信息块颜色 */\n\ +.edit-theme--spearmint .editor__inner .blockquote {\n\ + color: #25808A;\n\ +}\n\ +/* 源信息、md标记符号等非关键信息的颜色 */\n\ +.edit-theme--spearmint .editor__inner .cl,\n\ +.edit-theme--spearmint .editor__inner .hr,\n\ +.edit-theme--spearmint .editor__inner .link,\n\ +.edit-theme--spearmint .editor__inner .linkref, \n\ +.edit-theme--spearmint .editor__inner .linkdef .url {\n\ + color: rgba(102,128,153,0.6);\n\ +}\n\ +.edit-theme--spearmint .editor__inner .cn-toc, \n\ +.edit-theme--spearmint .editor__inner .code,\n\ +.edit-theme--spearmint .editor__inner .img,\n\ +.edit-theme--spearmint .editor__inner .img-wrapper,\n\ +.edit-theme--spearmint .editor__inner .imgref,\n\ +.edit-theme--spearmint .editor__inner .cl-toc {\n\ + color: rgba(102,128,153,0.6);\n\ + background-color: rgba(102,128,153,0.075);\n\ +}\n\ +/* 代码块颜色 */\n\ +.edit-theme--spearmint .editor__inner .cn-code {\n\ + color: #199FA8;\n\ +}\n\ +/* 链接颜色 */\n\ +.edit-theme--spearmint .editor__inner .img .cl-underlined-text,\n\ +.edit-theme--spearmint .editor__inner .imgref .cl-underlined-text,\n\ +.edit-theme--spearmint .editor__inner .link .cl-underlined-text,\n\ +.edit-theme--spearmint .editor__inner .linkref .cl-underlined-text {\n\ + color: #4CD7E0;\n\ +}\n\ +/* 图片原始链接背景颜色 */\n\ +.edit-theme--spearmint .editor__inner .img-wrapper .img {\n\ + background-color: transparent;\n\ +}\n\ +.edit-theme--spearmint .editor__inner .keyword {\n\ + color: #47596b;\n\ +}\n\ +.edit-theme--spearmint .editor__inner .email,\n\ +.edit-theme--spearmint .editor__inner .cl-title,\n\ +.edit-theme--spearmint .editor__inner .tag,\n\ +.edit-theme--spearmint .editor__inner .latex,\n\ +.edit-theme--spearmint .editor__inner .math,\n\ +.edit-theme--spearmint .editor__inner .entity,\n\ +.edit-theme--spearmint .editor__inner .pre [class*='language-'] {\n\ + color: #719692;\n\ +}"; + document.head.appendChild(style); +} +init_edit_theme_spearmint(); \ No newline at end of file diff --git a/static/themes/preview-theme-activeblue.js b/static/themes/preview-theme-activeblue.js new file mode 100644 index 0000000..6b79f2c --- /dev/null +++ b/static/themes/preview-theme-activeblue.js @@ -0,0 +1,216 @@ +function init_preview_theme_activeblue() { +const style = document.createElement('style'); +style.id = 'preview-theme-activeblue'; +style.type = 'text/css'; +style.innerHTML = "/** activeblue 灵动蓝\n \ +*/\n \ +.preview-theme--activeblue {\n \ + color: #333;\n \ + background-color: #fff;\n \ + font-family: -apple-system,system-ui,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif;\n \ +}\n \ +\n \ +/* 标题的通用设置 */\n \ +.preview-theme--activeblue h1,\n \ +.preview-theme--activeblue h2,\n \ +.preview-theme--activeblue h3,\n \ +.preview-theme--activeblue h4,\n \ +.preview-theme--activeblue h5,\n \ +.preview-theme--activeblue h6 {\n \ + padding: 30px 0;\n \ + margin: 0;\n \ + color: #135ce0;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--activeblue h1 {\n \ + position: relative;\n \ + margin-top: 30px;\n \ + margin-bottom: 10px;\n \ + text-align: center;\n \ +}\n \ +\n \ +/* 一级标题前缀,用来放背景图,支持透明度控制 */\n \ +.preview-theme--activeblue h1 .prefix {\n \ + display: inline-block;\n \ + top: 0;\n \ + width: 60px;\n \ + height: 60px;\n \ + background: url(https://imgs.qicoder.com/stackedit/ape_blue.svg);\n \ + background-size: 100% 100%;\n \ + opacity: .12;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--activeblue h1 .content {\n \ + font-size: 22px;\n \ + display: block;\n \ + margin-top: -36px;\n \ +}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--activeblue h2 {\n \ + position: relative;\n \ + font-size: 20px;\n \ +}\n \ +\n \ +/* 二级标题前缀,有兴趣加内容的可以魔改 */\n \ +.preview-theme--activeblue h2 .prefix {\n \ +\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--activeblue h2 .content {\n \ + border-left: 4px solid;\n \ + padding-left: 10px;\n \ +}\n \ +\n \ +/* 一二级标题之间间距控制一下 */\n \ +.preview-theme--activeblue h1 + h2 {\n \ + padding-top: 0;\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--activeblue h3 {\n \ + font-size: 16px;\n \ +}\n \ +\n \ +/* 段落 */\n \ +.preview-theme--activeblue p {\n \ + font-size: 16px;\n \ + line-height: 2;\n \ + font-weight: 400;\n \ +}\n \ +\n \ +/* 段落间距控制 */\n \ +.preview-theme--activeblue p+p {\n \ + margin-top: 16px;\n \ +}\n \ +\n \ +/* 无序列表 */\n \ +.preview-theme--activeblue ul>li ul>li {\n \ + list-style: circle;\n \ +}\n \ +\n \ +/* 无序列表内容行高 */\n \ +.preview-theme--activeblue li section {\n \ + line-height: 2;\n \ +}\n \ +\n \ +/* 引用 */\n \ +.preview-theme--activeblue blockquote {\n \ + border-left-color: #b2aec5 !important;\n \ + background: #fff9f9 !important;\n \ +}\n \ +\n \ +/* 引用文字 */\n \ +.preview-theme--activeblue blockquote p {\n \ + color: #666;\n \ + line-height: 2;\n \ +}\n \ +\n \ +/* 链接 */\n \ +.preview-theme--activeblue a {\n \ + color: #036aca;\n \ + border-bottom: 0;\n \ + font-weight: 400;\n \ + text-decoration: none;\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--activeblue strong {\n \ + background: linear-gradient(to right ,#3299d2,#efbdb5);\n \ + color: #fff;\n \ + font-weight: 400;\n \ + padding: 0 4px;\n \ + display: inline-block;\n \ + border-radius: 4px;\n \ + margin: 0 2px;\n \ + letter-spacing: 1px;\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--activeblue em strong {\n \ + color: #fff;\n \ +}\n \ +\n \ +/* 分隔线 */\n \ +.preview-theme--activeblue hr {\n \ + border-top: 1px solid #135ce0;\n \ +}\n \ +\n \ +/* 图片描述文字,隐藏了,如果需要,请删除display */\n \ +.preview-theme--activeblue figcaption {\n \ + display: none;\n \ + opacity: .6;\n \ + margin-top: 12px;\n \ + font-size: 12px;\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--activeblue p code,\n \ +.preview-theme--activeblue li code,\n \ +.preview-theme--activeblue table code {\n \ + background-color: rgba(0,0,0,.05);\n \ + color: #1394d8;\n \ + padding: 2px 6px;\n \ + word-break: normal;\n \ +}\n \ +\n \ +/* 表格 */\n \ +.preview-theme--activeblue table {\n \ + border-spacing: 0;\n \ +}\n \ +\n \ +/*\n \ +* 表格内的单元格\n \ +*/\n \ +.preview-theme--activeblue table tr th {\n \ + background-color: #d4f1ff;\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--activeblue .footnote-word {\n \ + color: #135ce0;\n \ + font-weight: 400;\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--activeblue .footnote-ref {\n \ + color: #5ba1e2;\n \ + font-weight: 400;\n \ +}\n \ +\n \ +/* 参考资料 */\n \ +.preview-theme--activeblue .footnotes-sep:before {\n \ + text-align: center;\n \ + color: #135ce0;\n \ + content: \"参考\";\n \ +}\n \ +\n \ +/* 参考编号 */\n \ +.preview-theme--activeblue .footnote-num {\n \ + color: #666;\n \ +}\n \ +\n \ +/* 参考文字 */\n \ +.preview-theme--activeblue .footnote-item p { \n \ + color: #999;\n \ + font-weight: 700;\n \ + font-style: italic;\n \ + font-size: 13px;\n \ +}\n \ +\n \ +/* 参考解释 */\n \ +.preview-theme--activeblue .footnote-item p em {\n \ + color: #3375e2;\n \ + font-style: normal;\n \ + margin-left: 4px;\n \ +}\n \ +.preview-theme--activeblue pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_activeblue(); diff --git a/static/themes/preview-theme-allblue.js b/static/themes/preview-theme-allblue.js new file mode 100644 index 0000000..2ddac13 --- /dev/null +++ b/static/themes/preview-theme-allblue.js @@ -0,0 +1,426 @@ +function init_preview_theme_allblue() { +const style = document.createElement('style'); +style.id = 'preview-theme-allblue'; +style.type = 'text/css'; +style.innerHTML = "/* 全栈蓝 */\n \ +\n \ +/* 全局属性\n \ +*/\n \ +.preview-theme--allblue {\n \ +line-height: 1.25;\n \ +color: #2b2b2b;\n \ +background-color: #fff;\n \ +font-family: Optima-Regular, Optima, PingFangTC-Light, PingFangSC-light, PingFangTC-light;\n \ +letter-spacing: 2px;\n \ +background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%);\n \ +background-size: 20px 20px;\n \ +background-position: center;\n \ +}\n \ +\n \ +/* 段落\n \ +*/\n \ +.preview-theme--allblue p {\n \ +color: #2b2b2b;\n \ +margin: 10px 0px;\n \ +letter-spacing: 2px;\n \ +font-size: 14px;\n \ +word-spacing: 2px;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--allblue h1 {\n \ +font-size: 25px;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--allblue h1 span {\n \ +display: inline-block;\n \ +font-weight: bold;\n \ +color: #40B8FA;\n \ +}\n \ +\n \ +/* 一级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--allblue h1:after {\n \ +position: unset;\n \ +display: unset;\n \ +border-bottom: unset;\n \ +}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--allblue h2 {\n \ +display:block;\n \ +border-bottom: 4px solid #40B8FA;\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--allblue h2 .content {\n \ +display: flex;\n \ +color: #40B8FA;\n \ +font-size: 20px;\n \ +margin-left: 25px;\n \ +}\n \ +\n \ +/* 二级标题前缀 */\n \ +.preview-theme--allblue h2 .prefix {\n \ +display: flex;\n \ +width: 20px;\n \ +height: 20px;\n \ +background-size: 20px 20px;\n \ +background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB00lEQVRYCe1Xy23DMAz1BB2jA+TSU2EBmSMzeIUM4WuHyKXWoWeP02sdS4CLJ4YW5ciKDUdICySAAMn68PHxiVSK4vn7Swy8fQ4vpbYH1ZyPORrOho2oz6r5UaU230r3Q84GG/uv4fUKhNKmJQC2BpgsTXcVbJTanAIAQASvS91/BBMZBjAOWwELzltQ35yPsElawEJbc8zQlwBpbE7Yuwan05azJfZNAYzjy8JwTCC9Tkx7dwDwGppAYwbg/XQ8K6gEokUMJPZvnooD0F1FlMJrW+dtsIGr3lWjNxj4mObNA96OAOCyn0Nl63fd73I2YhdX3h48A0g8TvGk8HEiQyeugf8MAJlNJqhbpN2VAdbOVW5PoFgNwNUJlGdt2iB/F0VBySkUFATMekJ/imUxAHjHhYOuTgwAlW/OljBGhY3vOsAhRF7xiwDI3A8vY57coh97mCFihIrPIgDwhAxIT8JSzexI75juwLB7Z6xkgA9iIGxMagBeoRhJ+rEe7NHDxrToy7NoHnpC6RdzI+WX98B0Ex8sv5OXIp3KyUR/cQgSZ2yaigIg5YLSMM6bLM1sjoXTLcU9p9g94FEKBF48ectx8hUFRbvr94g/JjMhe37OzsAvpzCHV7lWaToAAAAASUVORK5CYII=);\n \ +margin-bottom: -22px;\n \ +}\n \ +\n \ +/* 二级标题后缀 */\n \ +.preview-theme--allblue h2 .suffix {\n \ +display: flex;\n \ +box-sizing: border-box;\n \ +width: 200px;\n \ +height: 10px;\n \ +border-top-left-radius: 20px;\n \ +background: RGBA(64, 184, 250, .5);\n \ +color: rgb(255, 255, 255);\n \ +font-size: 16px;\n \ +letter-spacing: 0.544px;\n \ +justify-content: flex-end;\n \ +box-sizing: border-box !important;\n \ +overflow-wrap: break-word !important;\n \ +float: right;\n \ +margin-top: -10px;\n \ +}\n \ +\n \ +.preview-theme--allblue h2:after {\n \ +position: unset;\n \ +display: unset;\n \ +border-bottom: unset;\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--allblue h3 {\n \ +font-size: 17px;\n \ +font-weight: bold;\n \ +text-align: center;\n \ +position:relative;\n \ +margin-top: 20px;\n \ +margin-bottom: 20px;\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--allblue h3 .content {\n \ +border-bottom: 2px solid RGBA(79, 177, 249, .65);\n \ +color: #2b2b2b;\n \ +padding-bottom:2px\n \ +}\n \ +\n \ +.preview-theme--allblue h3 .content:before{\n \ +content:'';\n \ +width:30px;\n \ +height:30px;\n \ +display:block;\n \ +background-position:center;\n \ +background-size:30px;\n \ +margin:auto;\n \ +opacity:1;\n \ +background-repeat:no-repeat;\n \ +margin-bottom:-8px;\n \ +}\n \ +\n \ +/* 三级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--allblue h3:after {}\n \ +\n \ +.preview-theme--allblue h4 .content {\n \ +height:16px;\n \ +line-height:16px;\n \ +font-size: 16px;\n \ +}\n \ +\n \ +.preview-theme--allblue h4 .content:before{\n \ +content:'';\n \ +background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABXElEQVRYCe1WsRHCMAzMVHRcvAcz0KekZQ92iNMwCzPQ2SngxJ2MbMm2RCjDHRdb+X/L8kfJMOy/vQIbK3D08eB8fOF/o5yd7pZwwsWdX+92hY2M0YdrSmBZp41ydjrsGhOA47ArNBhuDhcU/1zncCnhzocHYuCehlNqiHONEDXg6OMThTRcxIpXrcC4xDPuvjSgVoMlYCG6Od5SAoIBLVqfRKwEjQHVmmogqRmcO1aAhNmwq90FMMlhoAaEJ0GAZKHqGtUbGZ1PMt4cbxzBIxkH2jc81mKQc1kkM6DQHxih1SN+SYI2IE0H7K7RBRRbQvPRBlRA0lStrQXmBmy/AbWapmzdsk5YAfBCIhcD8+LI7xFpA4J2jDx67WlQrDhuCdAGJBmwxRUXqwVrQqn8QgOqcWprmOMWA5rFNQRqQPgc03D+iqEGhA/Sv4prxL7nH1+SATUaO2avAK3AG91vsolsvFjsAAAAAElFTkSuQmCC);\n \ +display:inline-block;\n \ +width:16px;\n \ +height:16px;\n \ +background-size:100% ;\n \ +background-position:left bottom;\n \ +background-repeat:no-repeat;\n \ +width: 16px;\n \ +height: 15px;\n \ +line-height:15px;\n \ +margin-right:6px;\n \ +margin-bottom:-2px;\n \ +}\n \ +\n \ +/* 无序列表整体样式\n \ +* list-style-type: square|circle|disc;\n \ +*/\n \ +.preview-theme--allblue ul {\n \ +font-size: 15px; /*神奇逻辑,必须比li section的字体大才会在二级中生效*/\n \ +color: #595959;\n \ +list-style-type: circle;\n \ +}\n \ +\n \ +\n \ +/* 有序列表整体样式\n \ +* list-style-type: upper-roman|lower-greek|lower-alpha;\n \ +*/\n \ +.preview-theme--allblue ol {\n \ +font-size: 15px;\n \ +color: #595959;\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ +*/\n \ +.preview-theme--allblue li section {\n \ +font-size: 14px;\n \ +font-weight: normal;\n \ +color: #595959;\n \ +}\n \ +\n \ +/* 引用\n \ +* 左边缘颜色 border-left-color:black;\n \ +* 背景色 background:gray;\n \ +*/\n \ +.preview-theme--allblue blockquote::before {\n \ +content: \"❝\";\n \ +color: RGBA(64, 184, 250, .5);\n \ +font-size: 34px;\n \ +line-height: 1;\n \ +font-weight: 700;\n \ +}\n \ +\n \ +.preview-theme--allblue blockquote {\n \ +text-size-adjust: 100%;\n \ +line-height: 1.55em;\n \ +font-weight: 400;\n \ +border-radius: 6px;\n \ +color: #595959 !important;\n \ +font-style: normal;\n \ +text-align: left;\n \ +box-sizing: inherit;\n \ +border-left: none;\n \ +padding-bottom: 25px;\n \ +border: 1px solid RGBA(64, 184, 250, .4) !important;\n \ +background: RGBA(64, 184, 250, .1) !important;\n \ +}\n \ +\n \ +.preview-theme--allblue blockquote p {\n \ +color: #595959;\n \ +margin: 0px;\n \ +}\n \ +\n \ +.preview-theme--allblue blockquote::after {\n \ +content: \"❞\";\n \ +float: right;\n \ +line-height: 1;\n \ +color: RGBA(64, 184, 250, .5);\n \ +}\n \ +\n \ +/* 链接\n \ +* border-bottom: 1px solid #009688;\n \ +*/\n \ +.preview-theme--allblue a {\n \ +color: #40B8FA;\n \ +font-weight: normal;\n \ +border-bottom: 1px solid #3BAAFA;\n \ +}\n \ +\n \ +.preview-theme--allblue strong::before {\n \ +content: '「';\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--allblue strong {\n \ +color: #3594F7;\n \ +font-weight: bold;\n \ +}\n \ +\n \ +.preview-theme--allblue strong::after {\n \ +content: '」';\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--allblue em {\n \ +font-style: normal;\n \ +color: #3594F7;\n \ +font-weight:bold;\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--allblue em strong {\n \ +color: #3594F7;\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--allblue s {\n \ +color: #3594F7;\n \ +}\n \ +\n \ +/* 分隔线\n \ +* 粗细、样式和颜色\n \ +* border-top:1px solid #3e3e3e;\n \ +*/\n \ +.preview-theme--allblue hr {\n \ +height: 1px;\n \ +padding: 0;\n \ +border: none;\n \ +border-top: 2px solid #3BAAFA;\n \ +}\n \ +\n \ +/* 图片\n \ +* 宽度 width:80%;\n \ +* 居中 margin:0 auto;\n \ +* 居左 margin:0 0;\n \ +*/\n \ +.preview-theme--allblue img {\n \ +border-radius: 6px;\n \ +display: block;\n \ +margin: 20px auto;\n \ +object-fit: contain;\n \ +box-shadow:2px 4px 7px #999;\n \ +}\n \ +\n \ +/* 图片描述文字 */\n \ +.preview-theme--allblue figcaption {\n \ +text-align: center;\n \ +display: block;\n \ +font-size: 13px;\n \ +color: #2b2b2b;\n \ +}\n \ +\n \ +.preview-theme--allblue figcaption:before{\n \ +content:'';\n \ +background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEVHcExAuPtAuPpAuPtAuPpAuPtAvPxAuPokzOX5AAAAB3RSTlMAkDLqNegkoiUM7wAAAGBJREFUKM9jYBhcgMkBTUDVBE1BeDGqEtXychNUBeXlKEqACsrLQxB8lnCQQClCiWt5OYoSiAIkJVAF5eVBqAqAShTAAs7l5ShKWMwRAmAlSArASpAVgJUkCqIAscESHwCVVjMBK9JnbQAAAABJRU5ErkJggg==);\n \ +display:inline-block;\n \ +width:18px;\n \ +height:18px;\n \ +background-size:18px;\n \ +background-repeat:no-repeat;\n \ +background-position:center;\n \ +margin-right:5px;\n \ +margin-bottom:-5px;\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--allblue p code,\n \ +.preview-theme--allblue li code {\n \ +color: #3594F7;\n \ +background: RGBA(59, 170, 250, .1);\n \ +padding:0 2px;\n \ +border-radius:2px;\n \ +height:21px;\n \ +line-height:22px;\n \ +}\n \ +\n \ +/* 非微信代码块\n \ +* 代码块不换行 display:-webkit-box !important;\n \ +* 代码块换行 display:block;\n \ +*/\n \ +.preview-theme--allblue .code-snippet__fix {\n \ +background: #f7f7f7;\n \ +border-radius: 2px;\n \ +}\n \ +\n \ +.preview-theme--allblue pre code {\n \ +letter-spacing: 0px;\n \ +}\n \ +\n \ +/*\n \ +* 表格内的单元格\n \ +* 字体大小 font-size: 16px;\n \ +* 边框 border: 1px solid #ccc;\n \ +* 内边距 padding: 5px 10px;\n \ +*/\n \ +.preview-theme--allblue table tr th,\n \ +.preview-theme--allblue table tr td {\n \ +font-size: 14px;\n \ +color: #595959;\n \ +}\n \ +\n \ +.preview-theme--allblue .footnotes {\n \ +background: #F6EEFF;\n \ +padding: 20px 20px 20px 20px;\n \ +font-size: 14px;\n \ +border: 0.8px solid #DEC6FB;\n \ +border-radius: 6px;\n \ +border: 1px solid #DEC6FB;\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--allblue .footnote-word {\n \ +font-weight: normal;\n \ +color: #595959;\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--allblue .footnote-ref {\n \ +font-weight: normal;\n \ +color: #595959;\n \ +}\n \ +\n \ +/*脚注链接样式*/\n \ +.preview-theme--allblue .footnote-item em {\n \ +font-size: 14px;\n \ +color: #595959;\n \ +display: block;\n \ +}\n \ +\n \ +.preview-theme--allblue .footnotes{\n \ +background: RGBA(53, 148, 247, .4);\n \ +padding: 20px 20px 20px 20px;\n \ +font-size: 14px;\n \ +border-radius: 6px;\n \ +border: 1px solid RGBA(53, 148, 247, 1);\n \ +}\n \ +\n \ +.preview-theme--allblue .footnotes-sep {\n \ +border-top: unset;\n \ +}\n \ +\n \ +/* \"参考资料\"四个字\n \ +* 内容 content: \"参考资料\";\n \ +*/\n \ +.preview-theme--allblue .footnotes-sep:before {\n \ +content: 'Reference';\n \ +color: #595959;\n \ +letter-spacing: 1px;\n \ +border-bottom: 2px solid RGBA(64, 184, 250, 1);\n \ +display: inline;\n \ +background: linear-gradient(white 60%, RGBA(64, 184, 250, .4) 40%);\n \ +font-size: 20px;\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--allblue .footnote-num {}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--allblue .footnote-item p {\n \ +color: #595959;\n \ +font-weight: bold;\n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--allblue .footnote-item p em {\n \ +font-weight: normal;\n \ +}\n \ +\n \ +/* 行间公式\n \ +* 最大宽度 max-width: 300% !important;\n \ +*/\n \ +.preview-theme--allblue .katex--display svg {}\n \ +\n \ +/* 行内公式\n \ +*/\n \ +.preview-theme--allblue .katex--inline svg {}\n \ +\n \ +/* \n \ + */\n \ +.preview-theme--allblue pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}\n \ +\n \ +.preview-theme--allblue .language-mermaid {\n \ +letter-spacing: 0;\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_allblue(); diff --git a/static/themes/preview-theme-caoyuangreen.js b/static/themes/preview-theme-caoyuangreen.js new file mode 100644 index 0000000..6b49abd --- /dev/null +++ b/static/themes/preview-theme-caoyuangreen.js @@ -0,0 +1,382 @@ +function init_preview_theme_caoyuangreen() { +const style = document.createElement('style'); +style.id = 'preview-theme-caoyuangreen'; +style.type = 'text/css'; +style.innerHTML = "/* 草原绿 caoyuangreen\n \ +*/\n \ +.preview-theme--caoyuangreen {\n \ + line-height: 1.35;\n \ + color: #333;\n \ + background-color: #fff;\n \ + font-family: Optima-Regular, PingFangTC-light;\n \ + letter-spacing: 1.5px;\n \ +}\n \ +\n \ +/* 段落,下方未标注标签参数均同此处\n \ +*/\n \ +.preview-theme--caoyuangreen p {\n \ + color: #2b2b2b;\n \ + margin: 10px 0px;\n \ + letter-spacing: 2px;\n \ + font-size: 16px;\n \ + word-spacing: 2px;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--caoyuangreen h1 {\n \ + font-size: 25px;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--caoyuangreen h1 span {\n \ + display: inline-block;\n \ + font-weight: bold;\n \ + color: #4CAF50;\n \ +}\n \ +\n \ +/* 一级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--caoyuangreen h1:after {}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--caoyuangreen h2 {\n \ + display:block;\n \ + border-bottom: 4px solid #4CAF50;\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--caoyuangreen h2 .content {\n \ + display: flex;\n \ + color: #4CAF50;\n \ + font-size: 20px;\n \ +\n \ +}\n \ +\n \ +/* 二级标题前缀 */\n \ +.preview-theme--caoyuangreen h2 .prefix {\n \ +\n \ +}\n \ +\n \ +/* 二级标题后缀 */\n \ +.preview-theme--caoyuangreen h2 .suffix {\n \ + display: flex;\n \ + box-sizing: border-box;\n \ + width: 20px;\n \ + height: 10px;\n \ + border-top-left-radius: 20px;\n \ + border-top-right-radius: 20px;\n \ + background: RGBA(76, 175, 80, .5);\n \ + color: rgb(255, 255, 255);\n \ + font-size: 16px;\n \ + letter-spacing: 0.544px;\n \ + justify-content: flex-end;\n \ + box-sizing: border-box !important;\n \ + overflow-wrap: break-word !important;\n \ + float: right;\n \ + margin-top: -10px;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen h1:after, .preview-theme--caoyuangreen h2:after {\n \ + border-bottom: unset;\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--caoyuangreen h3 {\n \ + font-size: 17px;\n \ + font-weight: bold;\n \ + text-align: center;\n \ + position:relative;\n \ + margin-top: 20px;\n \ + margin-bottom: 20px;\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--caoyuangreen h3 .content {\n \ + color: #2b2b2b;\n \ + padding-bottom:2px\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen h3 .content:before{\n \ + content:'';\n \ + width:30px;\n \ + height:30px;\n \ + display:block;\n \ + background-image:url(https://imgs.qicoder.com/stackedit/grass-green.png);\n \ + background-position:center;\n \ + background-size:30px;\n \ + margin:auto;\n \ + opacity:1;\n \ + background-repeat:no-repeat;\n \ + margin-bottom:-8px;\n \ +}\n \ +\n \ +/* 三级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--caoyuangreen h3:after {}\n \ +\n \ +.preview-theme--caoyuangreen h4 .content {\n \ + height:16px;\n \ + line-height:16px;\n \ + font-size: 16px;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen h4 .content:before{\n \ +\n \ +}\n \ +\n \ +/* 无序列表整体样式\n \ +* list-style-type: square|circle|disc;\n \ +*/\n \ +.preview-theme--caoyuangreen ul {\n \ + font-size: 15px; /*神奇逻辑,必须比li section的字体大才会在二级中生效*/\n \ + color: #595959;\n \ + list-style-type: circle;\n \ +}\n \ +\n \ +\n \ +/* 有序列表整体样式\n \ +* list-style-type: upper-roman|lower-greek|lower-alpha;\n \ +*/\n \ +.preview-theme--caoyuangreen ol {\n \ + font-size: 15px;\n \ + color: #595959;\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ +*/\n \ +.preview-theme--caoyuangreen li section {\n \ + font-size: 16px;\n \ + font-weight: normal;\n \ + color: #595959;\n \ +}\n \ +\n \ +/* 引用\n \ +* 左边缘颜色 border-left-color:black;\n \ +* 背景色 background:gray;\n \ +*/\n \ +.preview-theme--caoyuangreen blockquote::before {\n \ + content: \"❝\";\n \ + color: #74b56d;\n \ + font-size: 34px;\n \ + line-height: 1;\n \ + font-weight: 700;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen blockquote {\n \ + text-size-adjust: 100%;\n \ + line-height: 1.55em;\n \ + font-weight: 400;\n \ + border-radius: 6px;\n \ + color: #595959 !important;\n \ + font-style: normal;\n \ + text-align: left;\n \ + box-sizing: inherit;\n \ + padding-bottom: 25px;\n \ + border-left: none !important;\n \ + border: 1px solid #1b900d !important;\n \ + background: #fff !important;\n \ +\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen blockquote p {\n \ + margin: 0px;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen blockquote::after {\n \ + content: \"❞\";\n \ + float: right;\n \ + color: #74b56d;\n \ +}\n \ +\n \ +/* 链接\n \ +* border-bottom: 1px solid #009688;\n \ +*/\n \ +.preview-theme--caoyuangreen a {\n \ + color: #399003;\n \ + font-weight: normal;\n \ + border-bottom: 1px solid #399003;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen strong::before {\n \ + content: '「';\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--caoyuangreen strong {\n \ + color: #399003;\n \ + font-weight: bold;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen strong::after {\n \ + content: '」';\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--caoyuangreen em {\n \ + font-style: normal;\n \ + color: #399003;\n \ + font-weight:bold;\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--caoyuangreen em strong {\n \ + color: #399003;\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--caoyuangreen del {\n \ + color: #399003;\n \ +}\n \ +\n \ +/* 分隔线\n \ +* 粗细、样式和颜色\n \ +* border-top:1px solid #3e3e3e;\n \ +*/\n \ +.preview-theme--caoyuangreen hr {\n \ + height: 1px;\n \ + padding: 0;\n \ + border: none;\n \ + border-top: 2px solid #399003;\n \ +}\n \ +\n \ +/* 图片\n \ +* 宽度 width:80%;\n \ +* 居中 margin:0 auto;\n \ +* 居左 margin:0 0;\n \ +*/\n \ +.preview-theme--caoyuangreen img {\n \ + border-radius: 6px;\n \ + display: block;\n \ + margin: 20px auto;\n \ + object-fit: contain;\n \ + box-shadow:2px 4px 7px #999;\n \ +}\n \ +\n \ +/* 图片描述文字 */\n \ +.preview-theme--caoyuangreen figcaption {\n \ + display: block;\n \ + font-size: 13px;\n \ + color: #2b2b2b;\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--caoyuangreen p code,\n \ +.preview-theme--caoyuangreen li code,\n \ +.preview-theme--caoyuangreen table code {\n \ + color: #0bb712;\n \ + background: rgba(127, 226, 159, 0.48);\n \ + display:inline-block;\n \ + padding:0 2px;\n \ + border-radius:2px;\n \ + height:21px;\n \ + line-height:22px;\n \ +}\n \ +\n \ +/* 非微信代码块\n \ +* 代码块不换行 display:-webkit-box !important;\n \ +* 代码块换行 display:block;\n \ +*/\n \ +.preview-theme--caoyuangreen .code-snippet__fix {\n \ + background: #f7f7f7;\n \ + border-radius: 2px;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen pre code {\n \ + letter-spacing: 0px;\n \ +}\n \ +\n \ +/*\n \ +* 表格内的单元格\n \ +* 字体大小 font-size: 16px;\n \ +* 边框 border: 1px solid #ccc;\n \ +* 内边距 padding: 5px 10px;\n \ +*/\n \ +.preview-theme--caoyuangreen table tr th,\n \ +.preview-theme--caoyuangreen table tr td {\n \ + font-size: 16px;\n \ + color: #595959;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen .footnotes {\n \ + background: #F6EEFF;\n \ + padding: 20px 20px 20px 20px;\n \ + font-size: 16px;\n \ + border: 0.8px solid #399003;\n \ + border-radius: 6px;\n \ + border: 1px solid #399003;\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--caoyuangreen .footnote-word {\n \ + font-weight: normal;\n \ + color: #595959;\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--caoyuangreen .footnote-ref {\n \ + font-weight: normal;\n \ + color: #595959;\n \ +}\n \ +\n \ +/*脚注链接样式*/\n \ +.preview-theme--caoyuangreen .footnote-item em {\n \ + font-size: 16px;\n \ + color: #595959;\n \ + display: block;\n \ +}\n \ +\n \ +.preview-theme--caoyuangreen .footnotes{\n \ + background: #fff;\n \ + padding: 20px 20px 20px 20px;\n \ + font-size: 16px;\n \ + border-radius: 6px;\n \ + border: 1px solid #4CAF50;\n \ +}\n \ +\n \ +/* \"参考资料\"四个字\n \ +* 内容 content: \"参考资料\";\n \ +*/\n \ +.preview-theme--caoyuangreen .footnotes-sep:before {\n \ + content: 'Reference';\n \ + color: #595959;\n \ + letter-spacing: 1px;\n \ + border-bottom: 2px solid #4CAF50;\n \ + display: inline;\n \ + font-size: 20px;\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--caoyuangreen .footnote-num {}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--caoyuangreen .footnote-item p {\n \ + color: #595959;\n \ + font-weight: bold;\n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--caoyuangreen .footnote-item p em {\n \ + font-weight: normal;\n \ +}\n \ +\n \ +/* 行间公式\n \ +* 最大宽度 max-width: 300% !important;\n \ +*/\n \ +.preview-theme--caoyuangreen .block-equation svg {}\n \ +\n \ +/* 行内公式\n \ +*/\n \ +.preview-theme--caoyuangreen .inline-equation svg {}\n \ +\n \ +/* 滑动图片\n \ + */\n \ +.preview-theme--caoyuangreen .imageflow-img {\n \ + display: inline-block;\n \ + width:100%;\n \ + margin-bottom: 0;\n \ +}\n \ +.preview-theme--caoyuangreen pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_caoyuangreen(); diff --git a/static/themes/preview-theme-jikebrack.js b/static/themes/preview-theme-jikebrack.js new file mode 100644 index 0000000..b5f0640 --- /dev/null +++ b/static/themes/preview-theme-jikebrack.js @@ -0,0 +1,273 @@ +function init_preview_theme_jikebrack() { +const style = document.createElement('style'); +style.id = 'preview-theme-jikebrack'; +style.type = 'text/css'; +style.innerHTML = "/*极客黑样式,实时生效*/\n \ +\n \ +/* 全局属性\n \ + */\n \ +.preview-theme--jikebrack {\n \ +color: #2b2b2b;\n \ +background-color: #fff;\n \ +}\n \ +\n \ +/* 段落\n \ + */\n \ +.preview-theme--jikebrack p {\n \ +box-sizing: border-box;\n \ +margin-bottom: 16px;\n \ +font-family: \"Helvetica Neue\", Helvetica, \"Segoe UI\", Arial, freesans, sans-serif;\n \ +font-size: 15px;\n \ +text-align: start;\n \ +white-space: normal;\n \ +text-size-adjust: auto;\n \ +line-height: 1.75em;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--jikebrack h1 {\n \ +margin-top: -0.46em;\n \ +margin-bottom: 0.1em;\n \ +border-bottom: 2px solid rgb(198, 196, 196);\n \ +box-sizing: border-box;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--jikebrack h1 .content {\n \ +padding-top: 5px;\n \ +padding-bottom: 5px;\n \ +color: rgb(160, 160, 160);\n \ +font-size: 13px;\n \ +line-height: 2;\n \ +box-sizing: border-box;\n \ +}\n \ +\n \ +/* 一级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--jikebrack h1:after {\n \ +}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--jikebrack h2 {\n \ +margin: 10px auto;\n \ +height: 40px;\n \ +background-color: rgb(251, 251, 251);\n \ +border-bottom: 1px solid rgb(246, 246, 246);\n \ +overflow: hidden;\n \ +box-sizing: border-box;\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--jikebrack h2 .content {\n \ +margin-left: -10px;\n \ +display: inline-block;\n \ +width: auto;\n \ +height: 40px;\n \ +background-color: rgb(33, 33, 34);\n \ +border-bottom-right-radius:100px;\n \ +color: rgb(255, 255, 255);\n \ +padding-right: 30px;\n \ +padding-left: 30px;\n \ +line-height: 40px;\n \ +font-size: 16px;\n \ +}\n \ +\n \ +/* 二级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--jikebrack h2:after {\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--jikebrack h3 {\n \ +margin: 20px auto 5px;\n \ +border-top: 1px solid rgb(221, 221, 221);\n \ +box-sizing: border-box;\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--jikebrack h3 .content {\n \ +margin-top: -1px;\n \ +padding-top: 6px;\n \ +padding-right: 5px;\n \ +padding-left: 5px;\n \ +font-size: 17px;\n \ +border-top: 2px solid rgb(33, 33, 34);\n \ +display: inline-block;\n \ +line-height: 1.1;\n \ +}\n \ +\n \ +/* 三级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--jikebrack h3:after {\n \ +}\n \ +\n \ +.preview-theme--jikebrack h4 {\n \ +margin: 10px auto -1px;\n \ +border-top: 1px solid rgb(221, 221, 221);\n \ +box-sizing: border-box;\n \ +}\n \ +\n \ +.preview-theme--jikebrack h4 .content {\n \ +margin-top: -1px;\n \ +padding-top: 6px;\n \ +padding-right: 5px;\n \ +padding-left: 5px;\n \ +font-size: 16px;\n \ +border-top: 2px solid rgb(33, 33, 34);\n \ +display: inline-block;\n \ +line-height: 1.1;\n \ +}\n \ +\n \ +/* 无序列表整体样式\n \ + * list-style-type: square|circle|disc;\n \ + */\n \ +.preview-theme--jikebrack ul {\n \ +}\n \ +\n \ +/* 有序列表整体样式\n \ + * list-style-type: upper-roman|lower-greek|lower-alpha;\n \ + */\n \ +.preview-theme--jikebrack ol {\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ + */\n \ +.preview-theme--jikebrack li section {\n \ +font-size: 15px;\n \ +font-family: \"Helvetica Neue\", Helvetica, \"Segoe UI\", Arial, freesans, sans-serif;\n \ +}\n \ +\n \ +/* 引用\n \ + * 左边缘颜色 border-left-color: black;\n \ + * 背景色 background: gray;\n \ + */\n \ +.preview-theme--jikebrack blockquote {\n \ +border-left-color: rgb(221, 221, 221) !important;\n \ +margin-top: 1.2em;\n \ +margin-bottom: 1.2em;\n \ +padding-right: 1em;\n \ +padding-left: 1em;\n \ +border-left-width: 4px;\n \ +color: rgb(119, 119, 119) !important;\n \ +quotes: none;\n \ +background: rgba(0, 0, 0, 0.05) !important;\n \ +}\n \ +\n \ +/* 引用文字 */\n \ +.preview-theme--jikebrack blockquote p {\n \ +margin: 0px;\n \ +font-size: 15px;\n \ +font-family: -apple-system-font, BlinkMacSystemFont, \"Helvetica Neue\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei UI\", \"Microsoft YaHei\", Arial, sans-serif;\n \ +color: rgb(119, 119, 119);\n \ +line-height: 1.75em;\n \ +}\n \ +\n \ +/* 链接 \n \ + * border-bottom: 1px solid #009688;\n \ + */\n \ +.preview-theme--jikebrack a {\n \ +color: rgb(239, 112, 96);\n \ +border-bottom: 1px solid rgb(239, 112, 96);\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--jikebrack strong {\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--jikebrack em {\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--jikebrack em strong {\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--jikebrack s {\n \ +}\n \ +\n \ +/* 分隔线\n \ + * 粗细、样式和颜色\n \ + * border-top: 1px solid #3e3e3e;\n \ + */\n \ +.preview-theme--jikebrack hr {\n \ +}\n \ +\n \ +/* 图片\n \ + * 宽度 width: 80%;\n \ + * 居中 margin: 0 auto;\n \ + * 居左 margin: 0 0;\n \ + */\n \ +.preview-theme--jikebrack img {\n \ +}\n \ +\n \ +/* 图片描述文字 */\n \ +.preview-theme--jikebrack figcaption {\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--jikebrack p code,.preview-theme--jikebrack li code {\n \ +color: rgb(239, 112, 96) !important;\n \ +background-color: rgba(27,31,35,.05) !important;\n \ +}\n \ +\n \ +/* 非微信代码块\n \ + * 代码块不换行 display: -webkit-box !important;\n \ + * 代码块换行 display: block;\n \ + */\n \ +.preview-theme--jikebrack pre code {\n \ +}\n \ +\n \ +/*\n \ + * 表格内的单元格\n \ + * 字体大小 font-size: 16px;\n \ + * 边框 border: 1px solid #ccc;\n \ + * 内边距 padding: 5px 10px;\n \ + */\n \ +.preview-theme--jikebrack table tr th,\n \ +.preview-theme--jikebrack table tr td {\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--jikebrack .footnote-word {\n \ +color: #ff3502;\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--jikebrack .footnote-ref {\n \ +color: rgb(239, 112, 96);\n \ +}\n \ +\n \ +/* \"参考资料\"四个字 \n \ + * 内容 content: \"参考资料\";\n \ + */\n \ +.preview-theme--jikebrack .footnotes-sep:before {\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--jikebrack .footnote-num {\n \ +}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--jikebrack .footnote-item p { \n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--jikebrack .footnote-item p em {\n \ +}\n \ +\n \ +/* 行间公式\n \ + * 最大宽度 max-width: 300% !important;\n \ + */\n \ +.preview-theme--jikebrack .block-equation svg {\n \ +}\n \ +\n \ +/* 行内公式\n \ + */\n \ +.preview-theme--jikebrack .inline-equation svg {\n \ +}\n \ +\n \ +.preview-theme--jikebrack pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_jikebrack(); diff --git a/static/themes/preview-theme-ningyezi.js b/static/themes/preview-theme-ningyezi.js new file mode 100644 index 0000000..6739277 --- /dev/null +++ b/static/themes/preview-theme-ningyezi.js @@ -0,0 +1,269 @@ +function init_preview_theme_ningyezi() { +const style = document.createElement('style'); +style.id = 'preview-theme-ningyezi'; +style.type = 'text/css'; +style.innerHTML = "/*凝夜紫 ningyezi\n \ +*/\n \ +.preview-theme--ningyezi {\n \ + line-height: 1.5;\n \ + font-family: Optima-Regular, Optima, PingFangTC-Light, PingFangSC-light, PingFangTC-light;\n \ + letter-spacing: 2px;\n \ + color: #2b2b2b;\n \ + background-color: #fff;\n \ + background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.05) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.05) 3%, rgba(0, 0, 0, 0) 3%);\n \ + background-size: 20px 20px;\n \ + background-position: center center;\n \ +}\n \ +\n \ +/* 段落,下方未标注标签参数均同此处\n \ + */\n \ +.preview-theme--ningyezi p {\n \ + margin: 10px 0px;\n \ + letter-spacing: 2px;\n \ + font-size: 14px;\n \ + word-spacing: 2px;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--ningyezi h1 {\n \ + font-size: 25px;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--ningyezi h1 .content {\n \ + display: inline-block;\n \ + font-weight: bold;\n \ + color: #773098;\n \ +}\n \ +\n \ +/* 一级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--ningyezi h1:after {}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--ningyezi h2 {\n \ + text-align: left;\n \ + margin: 20px 10px 0px 0px;\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--ningyezi h2 .content {\n \ + font-size: 18px;\n \ + font-weight: bold;\n \ + display: inline-block;\n \ + padding-left: 10px;\n \ + border-left: 5px solid #916dd5;\n \ +}\n \ +\n \ +/* 二级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--ningyezi h2:after {}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--ningyezi h3 {\n \ + font-size: 16px;\n \ + font-weight: bold;\n \ + text-align: center;\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--ningyezi h3 .content {\n \ + border-bottom: 2px solid #d89cf6;\n \ +}\n \ +\n \ +/* 三级标题修饰 请参考有实例的主题 */\n \ +.preview-theme--ningyezi h3:after {}\n \ +\n \ +/* 无序列表整体样式\n \ + * list-style-type: square|circle|disc;\n \ + */\n \ +.preview-theme--ningyezi ul {\n \ + font-size: 15px;\n \ + /*神奇逻辑,必须比li section的字体大才会在二级中生效*/\n \ + list-style-type: circle;\n \ +}\n \ +\n \ +\n \ +/* 有序列表整体样式\n \ + * list-style-type: upper-roman|lower-greek|lower-alpha;\n \ + */\n \ +.preview-theme--ningyezi ol {\n \ + font-size: 15px;\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ + */\n \ +.preview-theme--ningyezi li section {\n \ + font-size: 14px;\n \ + font-weight: normal;\n \ +}\n \ +\n \ +/* 引用\n \ + * 左边缘颜色 border-left-color:black;\n \ + * 背景色 background:gray;\n \ + */\n \ +.preview-theme--ningyezi blockquote {\n \ + color: rgba(0,0,0,0.5) !important;\n \ + border-left-color: #d89cf6 !important;\n \ + background: #f4eeff !important;\n \ +}\n \ +\n \ +/* 链接 \n \ + * border-bottom: 1px solid #009688;\n \ + */\n \ +.preview-theme--ningyezi a {\n \ + color: #916dd5;\n \ + font-weight: bolder;\n \ + border-bottom: 1px solid #916dd5;\n \ +}\n \ +\n \ +.preview-theme--ningyezi strong::before {\n \ + content: '「';\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--ningyezi strong {\n \ + color: #916dd5;\n \ + font-weight: bold;\n \ +}\n \ +\n \ +.preview-theme--ningyezi strong::after {\n \ + content: '」';\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--ningyezi em {\n \ + font-style: normal;\n \ + color: #916dd5;\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--ningyezi em strong {\n \ + color: #916dd5;\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--ningyezi del {\n \ + color: #916dd5;\n \ +}\n \ +\n \ +/* 分隔线\n \ + * 粗细、样式和颜色\n \ + */\n \ +.preview-theme--ningyezi hr {\n \ + height: 1px;\n \ + padding: 0;\n \ + border: none;\n \ + border-top: 2px solid #d9b8fa;\n \ +}\n \ +\n \ +/* 图片\n \ + * 宽度 width:80%;\n \ + * 居中 margin:0 auto;\n \ + * 居左 margin:0 0;\n \ + */\n \ +.preview-theme--ningyezi img {\n \ + border-radius: 6px;\n \ + display: block;\n \ + margin: 20px auto;\n \ + object-fit: contain;\n \ + box-shadow: 2px 4px 7px #999;\n \ +}\n \ +\n \ +/* 图片描述文字 */\n \ +.preview-theme--ningyezi figcaption {\n \ + display: block;\n \ + font-size: 13px;\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--ningyezi p code,\n \ +.preview-theme--ningyezi li code,\n \ +.preview-theme--ningyezi table code {\n \ + color: #916dd5;\n \ + font-weight: bolder;\n \ + background: none;\n \ +}\n \ +\n \ +/* 非微信代码块\n \ + * 代码块不换行 display:-webkit-box !important;\n \ + * 代码块换行 display:block;\n \ + */\n \ +.preview-theme--ningyezi .code-snippet__fix {\n \ + background: #f7f7f7;\n \ + border-radius: 2px;\n \ +}\n \ +\n \ +.preview-theme--ningyezi pre code {}\n \ +\n \ +/*\n \ + * 表格内的单元格\n \ + * 字体大小 font-size: 16px;\n \ + * 边框 border: 1px solid #ccc;\n \ + * 内边距 padding: 5px 10px;\n \ + */\n \ +.preview-theme--ningyezi table tr th,\n \ +.preview-theme--ningyezi table tr td {\n \ + font-size: 14px;\n \ +}\n \ +\n \ +.preview-theme--ningyezi .footnotes {\n \ + font-size: 14px;\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--ningyezi .footnote-word {\n \ + font-weight: normal;\n \ + color: #916dd5;\n \ + font-weight: bold;\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--ningyezi .footnote-ref {\n \ + font-weight: normal;\n \ + color: #916dd5;\n \ +}\n \ +\n \ +/*脚注链接样式*/\n \ +.preview-theme--ningyezi .footnote-item em {\n \ + font-size: 14px;\n \ + color: #916dd5;\n \ + display: block;\n \ +}\n \ +\n \ +/* \"参考资料\"四个字 \n \ + * 内容 content: \"参考资料\";\n \ + */\n \ +.preview-theme--ningyezi .footnotes-sep:before {\n \ + font-size: 20px;\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--ningyezi .footnote-num {\n \ + color: #916dd5;\n \ +}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--ningyezi .footnote-item p {\n \ + color: #916dd5;\n \ + font-weight: bold;\n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--ningyezi .footnote-item p em {\n \ + font-weight: normal;\n \ +}\n \ +\n \ +/* 行间公式\n \ + * 最大宽度 max-width: 300% !important;\n \ + */\n \ +.preview-theme--ningyezi .block-equation svg {}\n \ +\n \ +/* 行内公式\n \ + */\n \ +.preview-theme--ningyezi .inline-equation svg {}\n \ +.preview-theme--ningyezi pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_ningyezi(); diff --git a/static/themes/preview-theme-simplebrack.js b/static/themes/preview-theme-simplebrack.js new file mode 100644 index 0000000..69f471b --- /dev/null +++ b/static/themes/preview-theme-simplebrack.js @@ -0,0 +1,340 @@ +function init_preview_theme_simplebrack() { +const style = document.createElement('style'); +style.id = 'preview-theme-simplebrack'; +style.type = 'text/css'; +style.innerHTML = "/* 全局属性\n \ + * 页边距 padding: 30px;\n \ + * 全文字体 font-family: ptima-Regular;\n \ + * 英文换行 word-break: break-all;\n \ + */\n \ + .preview-theme--simplebrack {\n \ +font-size:14px;\n \ +padding:10px;\n \ +color: #2b2b2b;\n \ +background-color: #fff;\n \ +}\n \ +\n \ +/*图片下提示*/\n \ +.preview-theme--simplebrack figcaption{\n \ +font-size:12px;\n \ +}\n \ +.preview-theme--simplebrack .imageflow-caption{\n \ +font-size:12px;\n \ +}\n \ +\n \ +/* 段落,下方未标注标签参数均同此处\n \ + * 上边距 margin-top: 5px;\n \ + * 下边距 margin-bottom: 5px;\n \ + * 行高 line-height: 26px;\n \ + * 词间距 word-spacing: 3px;\n \ + * 字间距 letter-spacing: 3px;\n \ + * 对齐 text-align: left;\n \ + * 颜色 color: #3e3e3e;\n \ + * 字体大小 font-size: 16px;\n \ + * 首行缩进 text-indent: 2em;\n \ + */\n \ +.preview-theme--simplebrack p {\n \ +font-size:14px;\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--simplebrack h1 {\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--simplebrack h1 .content {\n \ +}\n \ +\n \ +/* 一级标题前缀 */\n \ +.preview-theme--simplebrack h1 .prefix {\n \ +}\n \ +\n \ +/* 一级标题后缀 */\n \ +.preview-theme--simplebrack h1 .suffix{\n \ +}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--simplebrack h2 {\n \ +text-align:center;\n \ +position:relative;\n \ +font-weight: bold;\n \ +color: black;\n \ +line-height: 1.1em;\n \ +padding-top: 12px;\n \ +padding-bottom: 12px;\n \ +margin:70px 30px 30px;\n \ +border: 1px solid #000;\n \ +}\n \ +\n \ +.preview-theme--simplebrack h2:before{\n \ +content: ' ';\n \ +float: left;\n \ +display: block;\n \ +width: 90%;\n \ +border-top: 1px solid #000;\n \ +height: 1px;\n \ +line-height: 1px;\n \ +margin-left: -5px;\n \ +margin-top: -17px;\n \ +}\n \ +.preview-theme--simplebrack h2:after{\n \ +content: ' ';\n \ +float: right;\n \ +display: block;\n \ +width: 90%;\n \ +border-bottom: 1px solid #000;\n \ +height: 1px;\n \ +line-height: 1px;\n \ +margin-right: -5px;\n \ +margin-top: 16px;\n \ +position: unset;\n \ +}\n \ +/* 二级标题内容 */\n \ +.preview-theme--simplebrack h2 .content {\n \ +display: block;\n \ +-webkit-box-reflect: below 0em -webkit-gradient(linear,left top,left bottom, from(rgba(0,0,0,0)),to(rgba(255,255,255,0.1)));\n \ +}\n \ +.preview-theme--simplebrack h2 strong {\n \ +}\n \ +/* 二级标题前缀 */\n \ +.preview-theme--simplebrack h2 .prefix {\n \ +display: block;\n \ +width: 3px;\n \ +margin: 0 0 0 5%;\n \ +height: 3px;\n \ +line-height: 3px;\n \ +overflow: hidden;\n \ +background-color: #000;\n \ +box-shadow:3px 0 #000,\n \ +0 3px #000,\n \ +-3px 0 #000,\n \ +0 -3px #000;\n \ +}\n \ +\n \ +/* 二级标题后缀 */\n \ +.preview-theme--simplebrack h2 .suffix {\n \ +display: block;\n \ +width: 3px;\n \ +margin: 0 0 0 95%;\n \ +height: 3px;\n \ +line-height: 3px;\n \ +overflow: hidden;\n \ +background-color: #000;\n \ +box-shadow:3px 0 #000,\n \ +0 3px #000,\n \ +-3px 0 #000,\n \ +0 -3px #000;\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--simplebrack h3 {\n \ +background-color:#000;\n \ +color:#fff;\n \ +padding:2px 10px;\n \ +width:fit-content;\n \ +font-size:17px;\n \ +margin:60px auto 10px;\n \ +}\n \ +.preview-theme--simplebrack h3 strong {\n \ +color:#fff;\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--simplebrack h3 .content {\n \ +}\n \ +\n \ +/* 三级标题前缀 */\n \ +.preview-theme--simplebrack h3 .prefix {\n \ +}\n \ +\n \ +/* 三级标题后缀 */\n \ +.preview-theme--simplebrack h3 .suffix {\n \ +}\n \ +\n \ +/* 无序列表整体样式\n \ + * list-style-type: square|circle|disc;\n \ + */\n \ +.preview-theme--simplebrack ul {\n \ +list-style-type: square;\n \ +}\n \ +/* 无序二级列表\n \ + */\n \ +.preview-theme--simplebrack ul li ul li{\n \ +list-style-type: circle;\n \ +}\n \ +\n \ +/* 有序列表整体样式\n \ + * list-style-type: upper-roman|lower-greek|lower-alpha;\n \ + */\n \ +.preview-theme--simplebrack ol {\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ + */\n \ +.preview-theme--simplebrack li section {\n \ +}\n \ +\n \ +/* 引用\n \ + * 左边缘颜色 border-left-color: black;\n \ + * 背景色 background: gray;\n \ + */\n \ +.preview-theme--simplebrack blockquote {\n \ +border-left: 3px solid rgba(0, 0, 0, 0.65) !important;\n \ +border-right: 1px solid rgba(0, 0, 0, 0.65) !important;\n \ +background: rgb(249, 249, 249) !important;\n \ +color: rgba(0,0,0,0.5) !important;\n \ +}\n \ +\n \ +/* 引用文字 */\n \ +.preview-theme--simplebrack blockquote p {\n \ +}\n \ +\n \ +/* 链接 \n \ + * border-bottom: 1px solid #009688;\n \ + */\n \ +.preview-theme--simplebrack a {\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--simplebrack strong {\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--simplebrack em {\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--simplebrack em strong {\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--simplebrack del {\n \ +}\n \ +\n \ +/* 分隔线\n \ + * 粗细、样式和颜色\n \ + * border-top: 1px solid #3e3e3e;\n \ + */\n \ +.preview-theme--simplebrack hr {\n \ +}\n \ +\n \ +/* 图片\n \ + * 宽度 width: 80%;\n \ + * 居中 margin: 0 auto;\n \ + * 居左 margin: 0 0;\n \ + */\n \ +.preview-theme--simplebrack img {\n \ +box-shadow: rgba(170, 170, 170, 0.48) 0px 0px 6px 0px;\n \ +border-radius:4px;\n \ +margin-top:10px;\n \ +}\n \ +/* 行内代码 */\n \ +.preview-theme--simplebrack p code, .preview-theme--simplebrack li code {\n \ +color:#ff6441;\n \ +background-color: rgba(27,31,35,.05) !important;\n \ +}\n \ +\n \ +/* 非微信代码块\n \ + * 代码块不换行 display: -webkit-box !important;\n \ + * 代码块换行 display: block;\n \ + */\n \ +.preview-theme--simplebrack pre.custom {\n \ +box-shadow: rgba(170, 170, 170, 0.48) 0px 0px 6px 0px;\n \ +max-width: 100%;\n \ +border-radius:4px;\n \ +margin: 10px auto 0 auto;\n \ +}\n \ +.preview-theme--simplebrack pre code {\n \ +}\n \ +\n \ +/*\n \ + * 表格内的单元格\n \ + * 字体大小 font-size: 16px;\n \ + * 边框 border: 1px solid #ccc;\n \ + * 内边距 padding: 5px 10px;\n \ + */\n \ +.preview-theme--simplebrack table tr th,\n \ +.preview-theme--simplebrack table tr td {\n \ +font-size:14px;\n \ +}\n \ +\n \ +/* 脚注文字 */\n \ +.preview-theme--simplebrack .footnote-word {\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--simplebrack .footnote-ref {\n \ +}\n \ +\n \ +/* \"参考资料\"四个字 \n \ + * 内容 content: \"参考资料\";\n \ + */\n \ +.preview-theme--simplebrack .footnotes-sep {\n \ +font-size: 14px;\n \ +color: #888;\n \ +border-top: 1px solid #eee;\n \ +padding: 30px 0 10px 0px;\n \ +background-color: transparent;\n \ +margin-bottom: 20px;\n \ +width: 100%;\n \ +}\n \ +.preview-theme--simplebrack .footnotes-sep:before {\n \ +content:'参考资料';\n \ +}\n \ +.preview-theme--simplebrack .footnotes{\n \ +border-left:5px solid #eee;\n \ +padding-left:10px;\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--simplebrack .footnote-num {\n \ +font-size:14px;\n \ +color:#999;\n \ +}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--simplebrack .footnote-item p { \n \ +font-size:14px;\n \ +color:#999;\n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--simplebrack .footnote-item p em {\n \ +font-size:14px;\n \ +color:#999;\n \ +}\n \ +\n \ +/* 行间公式\n \ + * 最大宽度 max-width: 300% !important;\n \ + */\n \ +.preview-theme--simplebrack .block-equation svg {\n \ +}\n \ +\n \ +/* 行内公式\n \ + */\n \ +.preview-theme--simplebrack .inline-equation svg {\n \ +}\n \ +/* 文章结尾 */\n \ +.preview-theme--simplebrack:after{\n \ +content:'- END -';\n \ +font-size:15px;\n \ +display:block;\n \ +text-align:center;\n \ +margin-top:50px;\n \ +color:#999;\n \ +border-bottom:1px solid #eee;\n \ +}\n \ +\n \ +/*滑动幻灯片*/\n \ +.preview-theme--simplebrack .imageflow-layer1 img{\n \ +margin:0;\n \ +box-shadow: none;\n \ +border-radius: 0;\n \ +}\n \ +.preview-theme--simplebrack pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_simplebrack(); diff --git a/static/themes/preview-theme-yanqihu.js b/static/themes/preview-theme-yanqihu.js new file mode 100644 index 0000000..d12163a --- /dev/null +++ b/static/themes/preview-theme-yanqihu.js @@ -0,0 +1,305 @@ +function init_preview_theme_yanqihu() { +const style = document.createElement('style'); +style.id = 'preview-theme-yanqihu'; +style.type = 'text/css'; +style.innerHTML = "/* 雁栖湖 yanqihu\n \ +*/\n \ +.preview-theme--yanqihu {\n \ + color: #2b2b2b;\n \ + background-color: #fff;\n \ + counter-reset: counterh1 counterh2 counterh3;\n \ +}\n \ +\n \ +/* 段落,下方未标注标签参数均同此处\n \ +*/\n \ +.preview-theme--yanqihu p {\n \ +}\n \ +\n \ +/* 一级标题 */\n \ +.preview-theme--yanqihu h1 {\n \ + line-height: 28px;\n \ + border-bottom: 1px solid rgb(37,132,181);\n \ +}\n \ +\n \ +.preview-theme--yanqihu h1:before {\n \ + background: rgb(37,132,181);\n \ + color: white;\n \ + counter-increment: counterh1;\n \ + content: 'Part'counter(counterh1); \n \ + padding: 2px 8px;\n \ +}\n \ +\n \ +/* 一级标题内容 */\n \ +.preview-theme--yanqihu h1 .content {\n \ + color: rgb(37,132,181);\n \ + margin-left: 8px;\n \ + font-size: 20px;\n \ +}\n \ +\n \ +/* 一级标题前缀 */\n \ +.preview-theme--yanqihu h1 .prefix {\n \ +}\n \ +\n \ +/* 一级标题后缀 */\n \ +.preview-theme--yanqihu h1 .suffix {\n \ +}\n \ +\n \ +/* 二级标题 */\n \ +.preview-theme--yanqihu h2 {\n \ +}\n \ +\n \ +/* 二级标题内容 */\n \ +.preview-theme--yanqihu h2 .content {\n \ + font-size: 18px;\n \ + border-bottom: 4px solid rgb(37,132,181);\n \ + padding: 2px 4px;\n \ + color: rgb(37,132,181);\n \ +}\n \ +\n \ +/* 二级标题前缀 */\n \ +.preview-theme--yanqihu h2 .prefix {\n \ + display: inline-block;\n \ +}\n \ +\n \ +.preview-theme--yanqihu h2 .prefix:before {\n \ + counter-increment: counterh2;\n \ + content: counter(counterh2); \n \ + color:rgb(159,205,208);\n \ + border-bottom: 4px solid rgb(159,205,208);\n \ + font-size: 18px;\n \ + padding: 2px 4px;\n \ +}\n \ +\n \ +/* 二级标题后缀 */\n \ +.preview-theme--yanqihu h2 .suffix {\n \ +}\n \ +\n \ +.preview-theme--yanqihu h1:after, .preview-theme--yanqihu h2:after {\n \ + border-bottom: unset;\n \ +}\n \ +\n \ +/* 三级标题 */\n \ +.preview-theme--yanqihu h3 {\n \ +}\n \ +\n \ +/* 三级标题内容 */\n \ +.preview-theme--yanqihu h3 .content {\n \ + font-size: 16px;\n \ + border-bottom: 1px solid rgb(37,132,181);\n \ + padding: 2px 10px;\n \ + color: rgb(37,132,181);\n \ +}\n \ +\n \ +/* 三级标题前缀 */\n \ +.preview-theme--yanqihu h3 .prefix {\n \ + display:inline-block;\n \ + background:linear-gradient(45deg, transparent 48%, rgb(37,132,181) 48%, \n \ + rgb(37,132,181) 52%, transparent 52%);\n \ + width:24px;\n \ + height:24px;\n \ + margin-bottom: -7px;\n \ +}\n \ +\n \ +/* 三级标题后缀 */\n \ +.preview-theme--yanqihu h3 .suffix {\n \ +}\n \ +\n \ +/* 无序列表整体样式\n \ +* list-style-type: square|circle|disc;\n \ +*/\n \ +.preview-theme--yanqihu ul {\n \ +}\n \ +\n \ +/* 有序列表整体样式\n \ +* list-style-type: upper-roman|lower-greek|lower-alpha;\n \ +*/\n \ +.preview-theme--yanqihu ol {\n \ +}\n \ +\n \ +/* 列表内容,不要设置li\n \ +*/\n \ +.preview-theme--yanqihu li section {\n \ +}\n \ +\n \ +/* 一级引用\n \ +* 左边缘颜色 border-left-color: black;\n \ +* 背景色 background: gray;\n \ +*/\n \ +.preview-theme--yanqihu blockquote {\n \ + color: rgba(0,0,0,0.5) !important;\n \ + border: 1px dashed rgb(37,132,181) !important;\n \ + background: transparent !important;\n \ +}\n \ +\n \ +/* 一级引用文字 */\n \ +.preview-theme--yanqihu blockquote p {\n \ +}\n \ +\n \ +/* 二级引用\n \ +*/\n \ +.preview-theme--yanqihu .multiquote-2 {\n \ + border: 1px dashed rgb(248,99,77);\n \ + box-shadow: none;\n \ +}\n \ +\n \ +.preview-theme--yanqihu .multiquote-2 blockquote {\n \ + margin: 0;\n \ +}\n \ +\n \ +/* 二级引用文字 */\n \ +.preview-theme--yanqihu .multiquote-2 p {\n \ +}\n \ +\n \ +.preview-theme--yanqihu .multiquote-2 strong {\n \ + color:rgb(248,99,77);\n \ +}\n \ +\n \ +.preview-theme--yanqihu .multiquote-2 a {\n \ + color:rgb(248,99,77);\n \ + border-bottom: 1px solid rgb(248,99,77);\n \ +}\n \ +\n \ +/* 三级引用\n \ +*/\n \ +.preview-theme--yanqihu .multiquote-3 {\n \ +}\n \ +\n \ +/* 三级引用文字 */\n \ +.preview-theme--yanqihu .multiquote-3 p {\n \ +}\n \ +\n \ +/* 链接 \n \ +* border-bottom: 1px solid #009688;\n \ +*/\n \ +.preview-theme--yanqihu a {\n \ + color:rgb(37,132,181);\n \ + border-bottom: 1px solid rgb(37,132,181);\n \ +}\n \ +\n \ +/* 加粗 */\n \ +.preview-theme--yanqihu strong {\n \ + color: rgb(37,132,181);\n \ +}\n \ +\n \ +/* 斜体 */\n \ +.preview-theme--yanqihu em {\n \ + color: rgb(37,132,181);\n \ +}\n \ +\n \ +/* 加粗斜体 */\n \ +.preview-theme--yanqihu em strong {\n \ + color: rgb(37,132,181);\n \ +}\n \ +\n \ +/* 删除线 */\n \ +.preview-theme--yanqihu del {\n \ +}\n \ +\n \ +/* 分隔线\n \ +* 粗细、样式和颜色\n \ +* border-top: 1px solid #3e3e3e;\n \ +*/\n \ +.preview-theme--yanqihu hr {\n \ + border-top: 1px solid rgb(37,132,181);\n \ +}\n \ +\n \ +/* 图片\n \ +* 宽度 width: 80%;\n \ +* 居中 margin: 0 auto;\n \ +* 居左 margin: 0 0;\n \ +*/\n \ +.preview-theme--yanqihu img {\n \ +}\n \ +\n \ +/* 图片描述文字 */\n \ +.preview-theme--yanqihu figcaption {\n \ +}\n \ +\n \ +/* 行内代码 */\n \ +.preview-theme--yanqihu p code,\n \ +.preview-theme--yanqihu li code,\n \ +.preview-theme--yanqihu table code {\n \ + background-color: rgba(0,0,0,.05);\n \ +}\n \ +\n \ +/* \n \ +* 代码块不换行 display: -webkit-box !important;\n \ +* 代码块换行 display: block;\n \ +*/\n \ +.preview-theme--yanqihu pre code {\n \ +}\n \ +\n \ +/*\n \ +* 表格内的单元格\n \ +* 字体大小 font-size: 16px;\n \ +* 边框 border: 1px solid #ccc;\n \ +* 内边距 padding: 5px 10px;\n \ +*/\n \ +.preview-theme--yanqihu table tr th {\n \ + border: 1px solid rgb(248,99,77);\n \ + background-color: rgb(235,114, 80);\n \ + color: #f8f8f8;\n \ + border-bottom: 0;\n \ + border: 1px solid rgb(245,203,174);\n \ +}\n \ +\n \ +.preview-theme--yanqihu table tr td {\n \ + border: 1px solid rgb(245,203,174);\n \ +}\n \ +/* \n \ +* 某一列表格列宽控制\n \ +* n 可以修改为具体数字,不修改时表示所有列\n \ +* 最小列宽 min-width: 85px;\n \ +*/\n \ +.preview-theme--yanqihu table tr th:nth-of-type(n),\n \ +.preview-theme--yanqihu table tr td:nth-of-type(n){\n \ +}\n \ +\n \ +.preview-theme--yanqihu table tr:nth-of-type(2n) {\n \ + background-color: rgb(248,222,203);\n \ +}\n \ +/* 脚注文字 */\n \ +.preview-theme--yanqihu .footnote-word {\n \ + color:rgb(37,132,181);\n \ +}\n \ +\n \ +/* 脚注上标 */\n \ +.preview-theme--yanqihu .footnote-ref {\n \ + color:rgb(37,132,181);\n \ +}\n \ +\n \ +/* \"参考资料\"四个字 \n \ +* 内容 content: \"参考资料\";\n \ +*/\n \ +.preview-theme--yanqihu .footnotes-sep:before {\n \ +}\n \ +\n \ +/* 参考资料编号 */\n \ +.preview-theme--yanqihu .footnote-num {\n \ +}\n \ +\n \ +/* 参考资料文字 */\n \ +.preview-theme--yanqihu .footnote-item p { \n \ +}\n \ +\n \ +/* 参考资料解释 */\n \ +.preview-theme--yanqihu .footnote-item p em {\n \ +}\n \ +\n \ +/* 行间公式\n \ +* 最大宽度 max-width: 300% !important;\n \ +*/\n \ +.preview-theme--yanqihu .block-equation svg {\n \ +}\n \ +\n \ +/* 行内公式\n \ +*/\n \ +.preview-theme--yanqihu .inline-equation svg { \n \ +}\n \ +.preview-theme--yanqihu pre>code {\n \ +background-color: #333;\n \ +color: rgba(255,255,255,0.75);\n \ +}"; +document.head.appendChild(style); +} +init_preview_theme_yanqihu(); diff --git a/test/unit/.eslintrc b/test/unit/.eslintrc new file mode 100644 index 0000000..9213c3f --- /dev/null +++ b/test/unit/.eslintrc @@ -0,0 +1,8 @@ +{ + "env": { + "jest": true + }, + "extends": [ + "../../.eslintrc.js" + ] +} diff --git a/test/unit/jest.conf.js b/test/unit/jest.conf.js new file mode 100644 index 0000000..1420d11 --- /dev/null +++ b/test/unit/jest.conf.js @@ -0,0 +1,33 @@ +const path = require('path'); + +module.exports = { + rootDir: path.resolve(__dirname, '../../'), + moduleFileExtensions: [ + 'js', + 'json', + 'vue', + ], + moduleNameMapper: { + '\\.(css|scss)$': 'identity-obj-proxy', + '^!raw-loader!': 'identity-obj-proxy', + '^worker-loader!\\./templateWorker\\.js$': '/test/unit/mocks/templateWorkerMock', + }, + transform: { + '^.+\\.js$': '/node_modules/babel-jest', + '.*\\.(vue)$': '/node_modules/vue-jest', + '.*\\.(yml|html|md)$': 'jest-raw-loader', + }, + snapshotSerializers: ['/node_modules/jest-serializer-vue'], + setupFiles: [ + '/test/unit/setup', + ], + coverageDirectory: '/test/unit/coverage', + collectCoverageFrom: [ + 'src/**/*.{js,vue}', + '!src/main.js', + '!**/node_modules/**', + ], + globals: { + NODE_ENV: 'production', + }, +}; diff --git a/test/unit/mocks/cryptoMock.js b/test/unit/mocks/cryptoMock.js new file mode 100644 index 0000000..c4d8a92 --- /dev/null +++ b/test/unit/mocks/cryptoMock.js @@ -0,0 +1,7 @@ +window.crypto = { + getRandomValues(array) { + for (let i = 0; i < array.length; i += 1) { + array[i] = Math.floor(Math.random() * 1000000); + } + }, +}; diff --git a/test/unit/mocks/localStorageMock.js b/test/unit/mocks/localStorageMock.js new file mode 100644 index 0000000..4247a6e --- /dev/null +++ b/test/unit/mocks/localStorageMock.js @@ -0,0 +1,9 @@ +const store = {}; +window.localStorage = { + getItem(key) { + return store[key] || null; + }, + setItem(key, value) { + store[key] = value.toString(); + }, +}; diff --git a/test/unit/mocks/mutationObserverMock.js b/test/unit/mocks/mutationObserverMock.js new file mode 100644 index 0000000..6d55983 --- /dev/null +++ b/test/unit/mocks/mutationObserverMock.js @@ -0,0 +1,6 @@ +/* eslint-disable class-methods-use-this */ +class MutationObserver { + observe() { + } +} +window.MutationObserver = MutationObserver; diff --git a/test/unit/mocks/templateWorkerMock.js b/test/unit/mocks/templateWorkerMock.js new file mode 100644 index 0000000..86059f3 --- /dev/null +++ b/test/unit/mocks/templateWorkerMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub'; diff --git a/test/unit/setup.js b/test/unit/setup.js new file mode 100644 index 0000000..b25a35e --- /dev/null +++ b/test/unit/setup.js @@ -0,0 +1,5 @@ +import Vue from 'vue'; +import './mocks/cryptoMock'; +import './mocks/mutationObserverMock'; + +Vue.config.productionTip = false; diff --git a/test/unit/specs/components/ButtonBar.spec.js b/test/unit/specs/components/ButtonBar.spec.js new file mode 100644 index 0000000..a8900ee --- /dev/null +++ b/test/unit/specs/components/ButtonBar.spec.js @@ -0,0 +1,47 @@ +import ButtonBar from '../../../../src/components/ButtonBar'; +import store from '../../../../src/store'; +import specUtils from '../specUtils'; + +describe('ButtonBar.vue', () => { + it('should toggle the navigation bar', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--navigation-bar-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].showNavigationBar, + 'toggleNavigationBar', + )); + + it('should toggle the side preview', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--side-preview-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].showSidePreview, + 'toggleSidePreview', + )); + + it('should toggle the editor', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--editor-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].showEditor, + 'toggleEditor', + )); + + it('should toggle the focus mode', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--focus-mode-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].focusMode, + 'toggleFocusMode', + )); + + it('should toggle the scroll sync', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--scroll-sync-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].scrollSync, + 'toggleScrollSync', + )); + + it('should toggle the status bar', async () => specUtils.checkToggler( + ButtonBar, + wrapper => wrapper.find('.button-bar__button--status-bar-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].showStatusBar, + 'toggleStatusBar', + )); +}); diff --git a/test/unit/specs/components/ContextMenu.spec.js b/test/unit/specs/components/ContextMenu.spec.js new file mode 100644 index 0000000..982e19e --- /dev/null +++ b/test/unit/specs/components/ContextMenu.spec.js @@ -0,0 +1,32 @@ +import { shallowMount } from '@vue/test-utils'; +import ContextMenu from '../../../../src/components/ContextMenu'; +import store from '../../../../src/store'; +import '../specUtils'; + +const mount = () => shallowMount(ContextMenu, { store }); + +describe('ContextMenu.vue', () => { + const name = 'Name'; + const makeOptions = () => ({ + coordinates: { + left: 0, + top: 0, + }, + items: [{ name }], + }); + + it('should open/close itself', async () => { + const wrapper = mount(); + expect(wrapper.contains('.context-menu__item')).toEqual(false); + setTimeout(() => wrapper.find('.context-menu__item').trigger('click'), 1); + const item = await store.dispatch('contextMenu/open', makeOptions()); + expect(item.name).toEqual(name); + }); + + it('should cancel itself', async () => { + const wrapper = mount(); + setTimeout(() => wrapper.trigger('click'), 1); + const item = await store.dispatch('contextMenu/open', makeOptions()); + expect(item).toEqual(null); + }); +}); diff --git a/test/unit/specs/components/Explorer.spec.js b/test/unit/specs/components/Explorer.spec.js new file mode 100644 index 0000000..1cd1099 --- /dev/null +++ b/test/unit/specs/components/Explorer.spec.js @@ -0,0 +1,194 @@ +import { shallowMount } from '@vue/test-utils'; +import Explorer from '../../../../src/components/Explorer'; +import store from '../../../../src/store'; +import workspaceSvc from '../../../../src/services/workspaceSvc'; +import specUtils from '../specUtils'; + +const mount = () => shallowMount(Explorer, { store }); +const select = (id) => { + store.commit('explorer/setSelectedId', id); + expect(store.getters['explorer/selectedNode'].item.id).toEqual(id); +}; +const ensureExists = file => expect(store.getters.allItemsById).toHaveProperty(file.id); +const ensureNotExists = file => expect(store.getters.allItemsById).not.toHaveProperty(file.id); +const refreshItem = item => store.getters.allItemsById[item.id]; + +describe('Explorer.vue', () => { + it('should create new file in the root folder', async () => { + expect(store.state.explorer.newChildNode.isNil).toBeTruthy(); + const wrapper = mount(); + wrapper.find('.side-title__button--new-file').trigger('click'); + expect(store.state.explorer.newChildNode.isNil).toBeFalsy(); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'file', + parentId: null, + }); + }); + + it('should create new file in a folder', async () => { + const folder = await workspaceSvc.storeItem({ type: 'folder' }); + const wrapper = mount(); + select(folder.id); + wrapper.find('.side-title__button--new-file').trigger('click'); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'file', + parentId: folder.id, + }); + }); + + it('should not create new files in the trash folder', async () => { + const wrapper = mount(); + select('trash'); + wrapper.find('.side-title__button--new-file').trigger('click'); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'file', + parentId: null, + }); + }); + + it('should create new folders in the root folder', async () => { + expect(store.state.explorer.newChildNode.isNil).toBeTruthy(); + const wrapper = mount(); + wrapper.find('.side-title__button--new-folder').trigger('click'); + expect(store.state.explorer.newChildNode.isNil).toBeFalsy(); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'folder', + parentId: null, + }); + }); + + it('should create new folders in a folder', async () => { + const folder = await workspaceSvc.storeItem({ type: 'folder' }); + const wrapper = mount(); + select(folder.id); + wrapper.find('.side-title__button--new-folder').trigger('click'); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'folder', + parentId: folder.id, + }); + }); + + it('should not create new folders in the trash folder', async () => { + const wrapper = mount(); + select('trash'); + wrapper.find('.side-title__button--new-folder').trigger('click'); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'folder', + parentId: null, + }); + }); + + it('should not create new folders in the temp folder', async () => { + const wrapper = mount(); + select('temp'); + wrapper.find('.side-title__button--new-folder').trigger('click'); + expect(store.state.explorer.newChildNode.item).toMatchObject({ + type: 'folder', + parentId: null, + }); + }); + + it('should move file to the trash folder on delete', async () => { + const file = await workspaceSvc.createFile({}, true); + expect(file.parentId).toEqual(null); + const wrapper = mount(); + select(file.id); + wrapper.find('.side-title__button--delete').trigger('click'); + ensureExists(file); + expect(refreshItem(file).parentId).toEqual('trash'); + await specUtils.expectBadge('removeFile'); + }); + + it('should not delete the trash folder', async () => { + const wrapper = mount(); + select('trash'); + wrapper.find('.side-title__button--delete').trigger('click'); + await specUtils.resolveModal('trashDeletion'); + await specUtils.expectBadge('removeFile', false); + }); + + it('should not delete file in the trash folder', async () => { + const file = await workspaceSvc.createFile({ parentId: 'trash' }, true); + const wrapper = mount(); + select(file.id); + wrapper.find('.side-title__button--delete').trigger('click'); + await specUtils.resolveModal('trashDeletion'); + ensureExists(file); + await specUtils.expectBadge('removeFile', false); + }); + + it('should delete the temp folder after confirmation', async () => { + const file = await workspaceSvc.createFile({ parentId: 'temp' }, true); + const wrapper = mount(); + select('temp'); + wrapper.find('.side-title__button--delete').trigger('click'); + await specUtils.resolveModal('tempFolderDeletion'); + ensureNotExists(file); + await specUtils.expectBadge('removeFolder'); + }); + + it('should delete temp file after confirmation', async () => { + const file = await workspaceSvc.createFile({ parentId: 'temp' }, true); + const wrapper = mount(); + select(file.id); + wrapper.find('.side-title__button--delete').trigger('click'); + ensureExists(file); + await specUtils.resolveModal('tempFileDeletion'); + ensureNotExists(file); + await specUtils.expectBadge('removeFile'); + }); + + it('should delete folder after confirmation', async () => { + const folder = await workspaceSvc.storeItem({ type: 'folder' }); + const file = await workspaceSvc.createFile({ parentId: folder.id }, true); + const wrapper = mount(); + select(folder.id); + wrapper.find('.side-title__button--delete').trigger('click'); + await specUtils.resolveModal('folderDeletion'); + ensureNotExists(folder); + // Make sure file has been moved to Trash + ensureExists(file); + expect(refreshItem(file).parentId).toEqual('trash'); + await specUtils.expectBadge('removeFolder'); + }); + + it('should rename file', async () => { + const file = await workspaceSvc.createFile({}, true); + const wrapper = mount(); + select(file.id); + wrapper.find('.side-title__button--rename').trigger('click'); + expect(store.getters['explorer/editingNode'].item.id).toEqual(file.id); + }); + + it('should rename folder', async () => { + const folder = await workspaceSvc.storeItem({ type: 'folder' }); + const wrapper = mount(); + select(folder.id); + wrapper.find('.side-title__button--rename').trigger('click'); + expect(store.getters['explorer/editingNode'].item.id).toEqual(folder.id); + }); + + it('should not rename the trash folder', async () => { + const wrapper = mount(); + select('trash'); + wrapper.find('.side-title__button--rename').trigger('click'); + expect(store.getters['explorer/editingNode'].isNil).toBeTruthy(); + }); + + it('should not rename the temp folder', async () => { + const wrapper = mount(); + select('temp'); + wrapper.find('.side-title__button--rename').trigger('click'); + expect(store.getters['explorer/editingNode'].isNil).toBeTruthy(); + }); + + it('should close itself', async () => { + store.dispatch('data/toggleExplorer', true); + specUtils.checkToggler( + Explorer, + wrapper => wrapper.find('.side-title__button--close').trigger('click'), + () => store.getters['data/layoutSettings'].showExplorer, + 'toggleExplorer', + ); + }); +}); diff --git a/test/unit/specs/components/ExplorerNode.spec.js b/test/unit/specs/components/ExplorerNode.spec.js new file mode 100644 index 0000000..5793bfc --- /dev/null +++ b/test/unit/specs/components/ExplorerNode.spec.js @@ -0,0 +1,307 @@ +import { shallowMount } from '@vue/test-utils'; +import ExplorerNode from '../../../../src/components/ExplorerNode'; +import store from '../../../../src/store'; +import workspaceSvc from '../../../../src/services/workspaceSvc'; +import explorerSvc from '../../../../src/services/explorerSvc'; +import specUtils from '../specUtils'; + +const makeFileNode = async () => { + const file = await workspaceSvc.createFile({}, true); + const node = store.getters['explorer/nodeMap'][file.id]; + expect(node.item.id).toEqual(file.id); + return node; +}; + +const makeFolderNode = async () => { + const folder = await workspaceSvc.storeItem({ type: 'folder' }); + const node = store.getters['explorer/nodeMap'][folder.id]; + expect(node.item.id).toEqual(folder.id); + return node; +}; + +const mount = node => shallowMount(ExplorerNode, { + store, + propsData: { node, depth: 1 }, +}); +const mountAndSelect = (node) => { + const wrapper = mount(node); + wrapper.find('.explorer-node__item').trigger('click'); + expect(store.getters['explorer/selectedNode'].item.id).toEqual(node.item.id); + expect(wrapper.classes()).toContain('explorer-node--selected'); + return wrapper; +}; + +const dragAndDrop = (sourceItem, targetItem) => { + const sourceNode = store.getters['explorer/nodeMap'][sourceItem.id]; + mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart', { + dataTransfer: { setData: () => {} }, + }); + expect(store.state.explorer.dragSourceId).toEqual(sourceItem.id); + const targetNode = store.getters['explorer/nodeMap'][targetItem.id]; + const wrapper = mount(targetNode); + wrapper.trigger('dragenter'); + expect(store.state.explorer.dragTargetId).toEqual(targetItem.id); + wrapper.trigger('drop'); + const expectedParentId = targetItem.type === 'file' ? targetItem.parentId : targetItem.id; + expect(store.getters['explorer/selectedNode'].item.parentId).toEqual(expectedParentId); +}; + +describe('ExplorerNode.vue', () => { + const modifiedName = 'Name'; + + it('should open file on select after a timeout', async () => { + const node = await makeFileNode(); + mountAndSelect(node); + expect(store.getters['file/current'].id).not.toEqual(node.item.id); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(store.getters['file/current'].id).toEqual(node.item.id); + await specUtils.expectBadge('switchFile'); + }); + + it('should not open already open file', async () => { + const node = await makeFileNode(); + store.commit('file/setCurrentId', node.item.id); + mountAndSelect(node); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(store.getters['file/current'].id).toEqual(node.item.id); + await specUtils.expectBadge('switchFile', false); + }); + + it('should open folder on select after a timeout', async () => { + const node = await makeFolderNode(); + const wrapper = mountAndSelect(node); + expect(wrapper.classes()).not.toContain('explorer-node--open'); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(wrapper.classes()).toContain('explorer-node--open'); + }); + + it('should open folder on new child', async () => { + const node = await makeFolderNode(); + const wrapper = mountAndSelect(node); + // Close the folder + wrapper.find('.explorer-node__item').trigger('click'); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(wrapper.classes()).not.toContain('explorer-node--open'); + explorerSvc.newItem(); + expect(wrapper.classes()).toContain('explorer-node--open'); + }); + + it('should create new file in a folder', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('New file'); + expect(wrapper.contains('.explorer-node__new-child')).toBe(true); + store.commit('explorer/setNewItemName', modifiedName); + wrapper.find('.explorer-node__new-child .text-input').trigger('blur'); + await new Promise(resolve => setTimeout(resolve, 1)); + expect(store.getters['explorer/selectedNode'].item).toMatchObject({ + name: modifiedName, + type: 'file', + parentId: node.item.id, + }); + expect(wrapper.contains('.explorer-node__new-child')).toBe(false); + await specUtils.expectBadge('createFile'); + }); + + it('should cancel file creation on escape', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('New file'); + expect(wrapper.contains('.explorer-node__new-child')).toBe(true); + store.commit('explorer/setNewItemName', modifiedName); + wrapper.find('.explorer-node__new-child .text-input').trigger('keydown', { + keyCode: 27, + }); + await new Promise(resolve => setTimeout(resolve, 1)); + expect(store.getters['explorer/selectedNode'].item).not.toMatchObject({ + name: 'modifiedName', + type: 'file', + parentId: node.item.id, + }); + expect(wrapper.contains('.explorer-node__new-child')).toBe(false); + await specUtils.expectBadge('createFile', false); + }); + + it('should not create new file in a file', async () => { + const node = await makeFileNode(); + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('New file').disabled).toBe(true); + }); + + it('should not create new file in the trash folder', async () => { + const node = store.getters['explorer/nodeMap'].trash; + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('New file').disabled).toBe(true); + }); + + it('should create new folder in folder', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('New folder'); + expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(true); + store.commit('explorer/setNewItemName', modifiedName); + wrapper.find('.explorer-node__new-child--folder .text-input').trigger('blur'); + await new Promise(resolve => setTimeout(resolve, 1)); + expect(store.getters['explorer/selectedNode'].item).toMatchObject({ + name: modifiedName, + type: 'folder', + parentId: node.item.id, + }); + expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(false); + await specUtils.expectBadge('createFolder'); + }); + + it('should cancel folder creation on escape', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('New folder'); + expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(true); + store.commit('explorer/setNewItemName', modifiedName); + wrapper.find('.explorer-node__new-child--folder .text-input').trigger('keydown', { + keyCode: 27, + }); + await new Promise(resolve => setTimeout(resolve, 1)); + expect(store.getters['explorer/selectedNode'].item).not.toMatchObject({ + name: modifiedName, + type: 'folder', + parentId: node.item.id, + }); + expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(false); + await specUtils.expectBadge('createFolder', false); + }); + + it('should not create new folder in a file', async () => { + const node = await makeFileNode(); + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true); + }); + + it('should not create new folder in the trash folder', async () => { + const node = store.getters['explorer/nodeMap'].trash; + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true); + }); + + it('should not create new folder in the temp folder', async () => { + const node = store.getters['explorer/nodeMap'].temp; + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true); + }); + + it('should rename file', async () => { + const node = await makeFileNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('Rename'); + expect(wrapper.contains('.explorer-node__item-editor')).toBe(true); + wrapper.setData({ editingValue: modifiedName }); + wrapper.find('.explorer-node__item-editor .text-input').trigger('blur'); + expect(store.getters['explorer/selectedNode'].item.name).toEqual(modifiedName); + await specUtils.expectBadge('renameFile'); + }); + + it('should cancel rename file on escape', async () => { + const node = await makeFileNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('Rename'); + expect(wrapper.contains('.explorer-node__item-editor')).toBe(true); + wrapper.setData({ editingValue: modifiedName }); + wrapper.find('.explorer-node__item-editor .text-input').trigger('keydown', { + keyCode: 27, + }); + expect(store.getters['explorer/selectedNode'].item.name).not.toEqual(modifiedName); + await specUtils.expectBadge('renameFile', false); + }); + + it('should rename folder', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('Rename'); + expect(wrapper.contains('.explorer-node__item-editor')).toBe(true); + wrapper.setData({ editingValue: modifiedName }); + wrapper.find('.explorer-node__item-editor .text-input').trigger('blur'); + expect(store.getters['explorer/selectedNode'].item.name).toEqual(modifiedName); + await specUtils.expectBadge('renameFolder'); + }); + + it('should cancel rename folder on escape', async () => { + const node = await makeFolderNode(); + const wrapper = mount(node); + wrapper.trigger('contextmenu'); + await specUtils.resolveContextMenu('Rename'); + expect(wrapper.contains('.explorer-node__item-editor')).toBe(true); + wrapper.setData({ editingValue: modifiedName }); + wrapper.find('.explorer-node__item-editor .text-input').trigger('keydown', { + keyCode: 27, + }); + expect(store.getters['explorer/selectedNode'].item.name).not.toEqual(modifiedName); + await specUtils.expectBadge('renameFolder', false); + }); + + it('should not rename the trash folder', async () => { + const node = store.getters['explorer/nodeMap'].trash; + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('Rename').disabled).toBe(true); + }); + + it('should not rename the temp folder', async () => { + const node = store.getters['explorer/nodeMap'].temp; + mount(node).trigger('contextmenu'); + expect(specUtils.getContextMenuItem('Rename').disabled).toBe(true); + }); + + it('should move file into a folder', async () => { + const sourceItem = await workspaceSvc.createFile({}, true); + const targetItem = await workspaceSvc.storeItem({ type: 'folder' }); + dragAndDrop(sourceItem, targetItem); + await specUtils.expectBadge('moveFile'); + }); + + it('should move folder into a folder', async () => { + const sourceItem = await workspaceSvc.storeItem({ type: 'folder' }); + const targetItem = await workspaceSvc.storeItem({ type: 'folder' }); + dragAndDrop(sourceItem, targetItem); + await specUtils.expectBadge('moveFolder'); + }); + + it('should move file into a file parent folder', async () => { + const targetItem = await workspaceSvc.storeItem({ type: 'folder' }); + const file = await workspaceSvc.createFile({ parentId: targetItem.id }, true); + const sourceItem = await workspaceSvc.createFile({}, true); + dragAndDrop(sourceItem, file); + await specUtils.expectBadge('moveFile'); + }); + + it('should not move the trash folder', async () => { + const sourceNode = store.getters['explorer/nodeMap'].trash; + mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart'); + expect(store.state.explorer.dragSourceId).not.toEqual('trash'); + }); + + it('should not move the temp folder', async () => { + const sourceNode = store.getters['explorer/nodeMap'].temp; + mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart'); + expect(store.state.explorer.dragSourceId).not.toEqual('temp'); + }); + + it('should not move file to the temp folder', async () => { + const targetNode = store.getters['explorer/nodeMap'].temp; + const wrapper = mount(targetNode); + wrapper.trigger('dragenter'); + expect(store.state.explorer.dragTargetId).not.toEqual('temp'); + }); + + it('should not move file to a file in the temp folder', async () => { + const file = await workspaceSvc.createFile({ parentId: 'temp' }, true); + const targetNode = store.getters['explorer/nodeMap'][file.id]; + const wrapper = mount(targetNode); + wrapper.trigger('dragenter'); + expect(store.state.explorer.dragTargetId).not.toEqual(file.id); + }); +}); diff --git a/test/unit/specs/components/NavigationBar.spec.js b/test/unit/specs/components/NavigationBar.spec.js new file mode 100644 index 0000000..5573df0 --- /dev/null +++ b/test/unit/specs/components/NavigationBar.spec.js @@ -0,0 +1,19 @@ +import NavigationBar from '../../../../src/components/NavigationBar'; +import store from '../../../../src/store'; +import specUtils from '../specUtils'; + +describe('NavigationBar.vue', () => { + it('should toggle the explorer', async () => specUtils.checkToggler( + NavigationBar, + wrapper => wrapper.find('.navigation-bar__button--explorer-toggler').trigger('click'), + () => store.getters['data/layoutSettings'].showExplorer, + 'toggleExplorer', + )); + + it('should toggle the side bar', async () => specUtils.checkToggler( + NavigationBar, + wrapper => wrapper.find('.navigation-bar__button--stackedit').trigger('click'), + () => store.getters['data/layoutSettings'].showSideBar, + 'toggleSideBar', + )); +}); diff --git a/test/unit/specs/components/Notification.spec.js b/test/unit/specs/components/Notification.spec.js new file mode 100644 index 0000000..4ac3cf3 --- /dev/null +++ b/test/unit/specs/components/Notification.spec.js @@ -0,0 +1,38 @@ +import { shallowMount } from '@vue/test-utils'; +import Notification from '../../../../src/components/Notification'; +import store from '../../../../src/store'; +import '../specUtils'; + +const mount = () => shallowMount(Notification, { store }); + +describe('Notification.vue', () => { + it('should autoclose itself', async () => { + const wrapper = mount(); + expect(wrapper.contains('.notification__item')).toBe(false); + store.dispatch('notification/showItem', { + type: 'info', + content: 'Test', + timeout: 10, + }); + expect(wrapper.contains('.notification__item')).toBe(true); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(wrapper.contains('.notification__item')).toBe(false); + }); + + it('should show messages from top to bottom', async () => { + const wrapper = mount(); + store.dispatch('notification/info', 'Test 1'); + store.dispatch('notification/info', 'Test 2'); + const items = wrapper.findAll('.notification__item'); + expect(items.length).toEqual(2); + expect(items.at(0).text()).toMatch(/Test 1/); + expect(items.at(1).text()).toMatch(/Test 2/); + }); + + it('should not open the same message twice', async () => { + const wrapper = mount(); + store.dispatch('notification/info', 'Test'); + store.dispatch('notification/info', 'Test'); + expect(wrapper.findAll('.notification__item').length).toEqual(1); + }); +}); diff --git a/test/unit/specs/specUtils.js b/test/unit/specs/specUtils.js new file mode 100644 index 0000000..fbf308c --- /dev/null +++ b/test/unit/specs/specUtils.js @@ -0,0 +1,58 @@ +import { shallowMount } from '@vue/test-utils'; +import store from '../../../src/store'; +import utils from '../../../src/services/utils'; +import '../../../src/icons'; +import '../../../src/components/common/vueGlobals'; + +const clone = object => JSON.parse(JSON.stringify(object)); + +const deepAssign = (target, origin) => { + Object.entries(origin).forEach(([key, value]) => { + const type = Object.prototype.toString.call(value); + if (type === '[object Object]' && Object.keys(value).length) { + deepAssign(target[key], value); + } else { + target[key] = value; + } + }); +}; + +const freshState = clone(store.state); + +beforeEach(() => { + // Restore store state before each test + deepAssign(store.state, clone(freshState)); +}); + +export default { + async checkToggler(Component, toggler, checker, featureId) { + const wrapper = shallowMount(Component, { store }); + const valueBefore = checker(); + toggler(wrapper); + const valueAfter = checker(); + expect(valueAfter).toEqual(!valueBefore); + await this.expectBadge(featureId); + }, + async resolveModal(type) { + const config = store.getters['modal/config']; + expect(config).toBeTruthy(); + expect(config.type).toEqual(type); + config.resolve(); + await new Promise(resolve => setTimeout(resolve, 1)); + }, + getContextMenuItem(name) { + return utils.someResult(store.state.contextMenu.items, item => item.name === name && item); + }, + async resolveContextMenu(name) { + const item = this.getContextMenuItem(name); + expect(item).toBeTruthy(); + store.state.contextMenu.resolve(item); + await new Promise(resolve => setTimeout(resolve, 1)); + }, + async expectBadge(featureId, isEarned = true) { + await new Promise(resolve => setTimeout(resolve, 1)); + expect(store.getters['data/allBadges'].filter(badge => badge.featureId === featureId)[0]).toMatchObject({ + isEarned, + }); + }, +};