From 7c2eccd6f1eb828f5f1a9be4553b7d575cf472df Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 14 Jun 2022 15:11:07 +0800 Subject: [PATCH 01/51] Style tweaks --- src/main/frontend/components/header.cljs | 2 +- src/main/frontend/components/header.css | 7 ++++++- yarn.lock | 5 ----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index 3b51005276..61bfb71f19 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -283,7 +283,7 @@ {:on-click #(route-handler/redirect! {:to :repo-add})} (ui/icon "folder-plus") (when-not config/mobile? - [:strong {:style {:margin-top (if electron-mac? 0 2)}} + [:span.ml-1 {:style {:margin-top (if electron-mac? 0 2)}} (t :on-boarding/add-graph)])]) (when config/publishing? diff --git a/src/main/frontend/components/header.css b/src/main/frontend/components/header.css index 00167fe031..9b08566a0d 100644 --- a/src/main/frontend/components/header.css +++ b/src/main/frontend/components/header.css @@ -201,7 +201,12 @@ } .button.icon { - @apply w-8 h-8 text-lg p-1; + @apply w-8 h-8 p-1; +} + +.button.icon.add-graph-btn { + width: unset; + margin: 0 6px; } .is-mac.is-electron :is(.cp__header, .cp__right-sidebar-topbar) :is(button, .button, a) { diff --git a/yarn.lock b/yarn.lock index 6dd1eb236f..2afe9ba250 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6806,11 +6806,6 @@ react-grid-layout@0.16.6: react-draggable "3.x" react-resizable "1.x" -react-icon-base@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" - integrity sha512-9wwKJa2LB8ujtJB5MAXYYEM7JfYThZTj0YnfGxzLLWkifaLIGc7iTde2EpJ7ka5MjneRHnlxbIn5VV9k2WjUVA== - react-icon-base@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.2.tgz#a17101dad9c1192652356096860a9ab43a0766c7" From 6cd7b1a5a58bf34e056067f99dd2e6cb0e76e027 Mon Sep 17 00:00:00 2001 From: queeup Date: Tue, 14 Jun 2022 01:09:44 +0300 Subject: [PATCH 02/51] fix: update Turkish translation --- src/main/frontend/dicts.cljc | 1 + src/main/frontend/modules/shortcut/dicts.cljc | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/frontend/dicts.cljc b/src/main/frontend/dicts.cljc index 029312aa28..9480261c87 100644 --- a/src/main/frontend/dicts.cljc +++ b/src/main/frontend/dicts.cljc @@ -3606,6 +3606,7 @@ :settings-page/tab-version-control "Sürüm denetimi" :settings-page/tab-advanced "Gelişmiş" :settings-page/plugin-system "Eklenti sistemi" + :settings-page/enable-flashcards "Bilgi kartları" :settings-page/network-proxy "Ağ ara sunucusu" :logseq "Logseq" :on "AÇIK" diff --git a/src/main/frontend/modules/shortcut/dicts.cljc b/src/main/frontend/modules/shortcut/dicts.cljc index c48695ab4d..7d8a5653b0 100644 --- a/src/main/frontend/modules/shortcut/dicts.cljc +++ b/src/main/frontend/modules/shortcut/dicts.cljc @@ -971,6 +971,7 @@ :command.date-picker/next-week "Tarih seçici: Sonraki haftayı seç" :command.pdf/previous-page "Geçerli pdf belgesinin önceki sayfası" :command.pdf/next-page "Geçerli pdf belgesinin sonraki sayfası" + :command.pdf/close "Geçerli pdf görüntüleyiciyi kapat" :command.auto-complete/complete "Otomatik tamamlama: Seçili öğeyi seç" :command.auto-complete/prev "Otomatik tamamlama: Önceki öğeyi seç" :command.auto-complete/next "Otomatik tamamlama: Sonraki öğeyi seç" @@ -994,6 +995,7 @@ :command.editor/strike-through "Üstü çizili" :command.editor/clear-block "Tüm blok içeriğini sil" :command.editor/kill-line-before "İmleç konumundan önceki satırı sil" + :command.editor/copy-embed "Geçerli bloğu işaret eden bir blok eklemesi kopyala" :command.editor/kill-line-after "İmleç konumundan sonraki satırı sil" :command.editor/beginning-of-block "İmleci bir bloğun başına taşı" :command.editor/end-of-block "İmleci bir bloğun sonuna taşı" @@ -1191,4 +1193,4 @@ :command.editor/copy-text "선택한 영역을 텍스트로 복사" :command.pdf/close "PDF 닫기" } -}) \ No newline at end of file +}) From 3e0c4ba3d8577f531ea56b0556cc3d71878c5326 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 14 Jun 2022 15:44:39 +0800 Subject: [PATCH 03/51] fix: non-consecutive blocks move --- src/main/frontend/modules/outliner/core.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/frontend/modules/outliner/core.cljs b/src/main/frontend/modules/outliner/core.cljs index d09add141f..5313a30d29 100644 --- a/src/main/frontend/modules/outliner/core.cljs +++ b/src/main/frontend/modules/outliner/core.cljs @@ -515,7 +515,9 @@ top-level-blocks-ids (set (map :db/id top-level-blocks)) right-block (get-right-sibling (:db/id (last top-level-blocks)))] (when (and right-block - (not (contains? top-level-blocks-ids (:db/id right-block)))) + (not (contains? top-level-blocks-ids (:db/id right-block))) + (not= (:db/id (last top-level-blocks)) + (:db/id (:block/left right-block)))) {:db/id (:db/id right-block) :block/left (loop [block (:block/left right-block)] (if (contains? top-level-blocks-ids (:db/id block)) From 7c8ae98911f032eb320dacc06429ddd680beb54b Mon Sep 17 00:00:00 2001 From: llcc Date: Tue, 14 Jun 2022 18:22:40 +0800 Subject: [PATCH 04/51] fix save issues after iOS app re-installation (#5697) * fix save issues after iOS app re-installation * fix: ios installation id updates when switching graphs * fix duplicated file-paths in db Co-authored-by: Tienson Qin --- src/main/frontend/db.cljs | 6 ++ src/main/frontend/db/model.cljs | 15 ++++ src/main/frontend/fs/capacitor_fs.cljs | 17 ++-- src/main/frontend/handler.cljs | 6 +- src/main/frontend/handler/events.cljs | 107 +++++++++++++++++++++---- src/main/frontend/handler/repo.cljs | 4 +- src/main/frontend/mobile/core.cljs | 8 +- src/main/frontend/mobile/util.cljs | 8 +- src/main/frontend/state.cljs | 4 +- 9 files changed, 138 insertions(+), 37 deletions(-) diff --git a/src/main/frontend/db.cljs b/src/main/frontend/db.cljs index 86240b0e0f..93563c04a9 100644 --- a/src/main/frontend/db.cljs +++ b/src/main/frontend/db.cljs @@ -144,6 +144,12 @@ (when-let [conn (get-db repo false)] (repo-listen-to-tx! repo conn))) +(defn relisten-and-persist! + [repo] + (when-let [conn (get-db repo false)] + (d/unlisten! conn :persistence) + (listen-and-persist! repo))) + (defn start-db-conn! ([repo] (start-db-conn! repo {})) diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 4f0dbad5dd..fd078b3b18 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -170,6 +170,21 @@ ;; (sort-by last) (reverse)))) +(defn get-files-v2 + [repo] + (when-let [db (conn/get-db repo)] + (->> (d/q + '[:find ?file ?path + ;; ?modified-at + :where + [?file :file/path ?path] + ;; [?file :file/last-modified-at ?modified-at] + ] + db) + (seq) + ;; (sort-by last) + (reverse)))) + (defn get-files-blocks [repo-url paths] (let [paths (set paths) diff --git a/src/main/frontend/fs/capacitor_fs.cljs b/src/main/frontend/fs/capacitor_fs.cljs index df7e60b937..906e7349d7 100644 --- a/src/main/frontend/fs/capacitor_fs.cljs +++ b/src/main/frontend/fs/capacitor_fs.cljs @@ -2,15 +2,15 @@ (:require ["@capacitor/filesystem" :refer [Encoding Filesystem]] [cljs-bean.core :as bean] [clojure.string :as string] + [frontend.db :as db] + [frontend.encrypt :as encrypt] [frontend.fs.protocol :as protocol] [frontend.mobile.util :as mobile-util] + [frontend.state :as state] [frontend.util :as util] [lambdaisland.glogi :as log] [promesa.core :as p] - [rum.core :as rum] - [frontend.state :as state] - [frontend.db :as db] - [frontend.encrypt :as encrypt])) + [rum.core :as rum])) (when (mobile-util/native-ios?) (defn iOS-ensure-documents! @@ -184,11 +184,6 @@ [path localDocumentsPath] (string/includes? path localDocumentsPath)) -(defn- iCloud-container-path? - "Check whether `path' is logseq's iCloud container path on iOS" - [path] - (string/includes? path "iCloud~com~logseq~logseq")) - (rum/defc instruction [] [:div.instruction @@ -283,10 +278,10 @@ _ (when (mobile-util/native-ios?) (cond (not (or (local-container-path? path localDocumentsPath) - (iCloud-container-path? path))) + (mobile-util/iCloud-container-path? path))) (state/pub-event! [:modal/show-instruction]) - (iCloud-container-path? path) + (mobile-util/iCloud-container-path? path) (mobile-util/sync-icloud-repo path) :else nil)) diff --git a/src/main/frontend/handler.cljs b/src/main/frontend/handler.cljs index 3a773fd6c9..46022d2b49 100644 --- a/src/main/frontend/handler.cljs +++ b/src/main/frontend/handler.cljs @@ -19,7 +19,6 @@ [frontend.handler.ui :as ui-handler] [frontend.handler.user :as user-handler] [frontend.extensions.srs :as srs] - [frontend.mobile.core :as mobile] [frontend.mobile.util :as mobile-util] [frontend.idb :as idb] [frontend.modules.instrumentation.core :as instrument] @@ -111,7 +110,8 @@ (watch-for-date!) (file-handler/watch-for-current-graph-dir!) - (state/pub-event! [:graph/ready (state/get-current-repo)]))) + (state/pub-event! [:graph/ready (state/get-current-repo)]) + (state/pub-event! [:graph/restored (state/get-current-repo)]))) (p/catch (fn [error] (log/error :exception error))))) @@ -184,8 +184,6 @@ (instrument/init) (set-network-watcher!) - (mobile/init!) - (util/indexeddb-check? (fn [_error] (notification/show! "Sorry, it seems that your browser doesn't support IndexedDB, we recommend to use latest Chrome(Chromium) or Firefox(Non-private mode)." :error false) diff --git a/src/main/frontend/handler/events.cljs b/src/main/frontend/handler/events.cljs index 9610fdb1ba..b377dc5d07 100644 --- a/src/main/frontend/handler/events.cljs +++ b/src/main/frontend/handler/events.cljs @@ -1,8 +1,10 @@ (ns frontend.handler.events (:refer-clojure :exclude [run!]) - (:require [clojure.core.async :as async] + (:require ["@capacitor/filesystem" :refer [Directory Filesystem]] + [clojure.core.async :as async] [clojure.set :as set] [clojure.string :as string] + [datascript.core :as d] [frontend.commands :as commands] [frontend.components.diff :as diff] [frontend.components.encryption :as encryption] @@ -13,7 +15,9 @@ [frontend.config :as config] [frontend.context.i18n :refer [t]] [frontend.db :as db] - [logseq.db.schema :as db-schema] + [frontend.db.conn :as conn] + [frontend.db.model :as db-model] + [frontend.db.persist :as db-persist] [frontend.encrypt :as encrypt] [frontend.extensions.srs :as srs] [frontend.fs :as fs] @@ -32,15 +36,18 @@ [frontend.handler.search :as search-handler] [frontend.handler.ui :as ui-handler] [frontend.handler.web.nfs :as nfs-handler] + [frontend.mobile.core :as mobile] [frontend.mobile.util :as mobile-util] [frontend.modules.instrumentation.posthog :as posthog] [frontend.modules.outliner.file :as outliner-file] [frontend.modules.shortcut.core :as st] + [frontend.search :as search-db] [frontend.state :as state] [frontend.ui :as ui] [frontend.util :as util] [frontend.util.persist-var :as persist-var] [goog.dom :as gdom] + [logseq.db.schema :as db-schema] [promesa.core :as p] [rum.core :as rum])) @@ -63,19 +70,25 @@ (sync/sync-start) )) -(defn- graph-switch [graph] - (state/set-current-repo! graph) - ;; load config - (common-handler/reset-config! graph nil) - (st/refresh!) - (when-not (= :draw (state/get-current-route)) - (route-handler/redirect-to-home!)) - (when-let [dir-name (config/get-repo-dir graph)] - (fs/watch-dir! dir-name)) - (srs/update-cards-due-count!) - (state/pub-event! [:graph/ready graph]) +(defn- graph-switch + ([graph] + (graph-switch graph false)) + ([graph skip-ios-check?] + (if (and (mobile-util/native-ios?) (not skip-ios-check?)) + (state/pub-event! [:validate-appId graph-switch graph]) + (do + (state/set-current-repo! graph) + ;; load config + (common-handler/reset-config! graph nil) + (st/refresh!) + (when-not (= :draw (state/get-current-route)) + (route-handler/redirect-to-home!)) + (when-let [dir-name (config/get-repo-dir graph)] + (fs/watch-dir! dir-name)) + (srs/update-cards-due-count!) + (state/pub-event! [:graph/ready graph]) - (file-sync-stop-when-switch-graph)) + (file-sync-stop-when-switch-graph))))) (def persist-db-noti-m {:before #(notification/show! @@ -330,6 +343,60 @@ (when-let [right-sidebar-node (gdom/getElementByClass "sidebar-item-list")] (set! (.. right-sidebar-node -style -paddingBottom) "150px"))))) +(defn update-file-path [deprecated-repo current-repo deprecated-app-id current-app-id] + (let [files (db-model/get-files-v2 deprecated-repo) + conn (conn/get-db deprecated-repo false) + tx (mapv (fn [[id path]] + (let [new-path (string/replace path deprecated-app-id current-app-id)] + {:db/id id + :file/path new-path})) + files)] + (d/transact! conn tx) + (reset! conn/conns + (update-keys @conn/conns + (fn [key] (if (string/includes? key deprecated-repo) + (string/replace key deprecated-repo current-repo) + key)))))) + +(defn get-ios-app-id + [repo-url] + (when repo-url + (let [app-id (-> (first (string/split repo-url "/Documents")) + (string/split "/") + last)] + app-id))) + +(defmethod handle :validate-appId [[_ graph-switch-f graph]] + (when-let [deprecated-repo (or graph (state/get-current-repo))] + ;; Installation is will not be changed for iCloud + (if (mobile-util/iCloud-container-path? deprecated-repo) + (when graph-switch-f (graph-switch-f graph true)) + (p/let [deprecated-app-id (get-ios-app-id deprecated-repo) + current-document-url (.getUri Filesystem #js {:path "" + :directory (.-Documents Directory)}) + current-app-id (-> (js->clj current-document-url :keywordize-keys true) + get-ios-app-id)] + (if (= deprecated-app-id current-app-id) + (when graph-switch-f (graph-switch-f graph true)) + (do + (.unwatch mobile-util/fs-watcher) + (let [current-repo (string/replace deprecated-repo deprecated-app-id current-app-id) + current-repo-dir (config/get-repo-dir current-repo)] + (try + (update-file-path deprecated-repo current-repo deprecated-app-id current-app-id) + (db-persist/delete-graph! deprecated-repo) + (search-db/remove-db! deprecated-repo) + (state/delete-repo! {:url deprecated-repo}) + (state/add-repo! {:url current-repo :nfs? true}) + (catch :default e + (js/console.error e))) + (state/set-current-repo! current-repo) + (db/relisten-and-persist! current-repo) + (db/persist-if-idle! current-repo) + (file-handler/restore-config! current-repo false) + (.watch mobile-util/fs-watcher #js {:path current-repo-dir}) + (when graph-switch-f (graph-switch-f current-repo true))))))))) + (defmethod handle :plugin/consume-updates [[_ id pending? updated?]] (let [downloading? (:plugin/updates-downloading? @state/state)] @@ -433,6 +500,8 @@ template {:target page})))))) +(defmethod handle :graph/restored [[_ _graph]] + (mobile/init!)) (defmethod handle :graph/dir-gone [[_ dir]] (state/pub-event! [:notification/show {:content (str "The directory " dir " has been renamed or deleted, the editor will be disabled for this graph, you can unlink the graph.") @@ -466,3 +535,13 @@ :error error}]))))) (recur)) chan)) + +(comment + (let [{:keys [deprecated-app-id current-app-id]} {:deprecated-app-id "AFDADF9A-7466-4ED8-B74F-AAAA0D4565B9", :current-app-id "7563518E-0EFD-4AD2-8577-10CFFD6E4596"}] + (def deprecated-app-id deprecated-app-id) + (def current-app-id current-app-id)) + (def deprecated-repo (state/get-current-repo)) + (def new-repo (string/replace deprecated-repo deprecated-app-id current-app-id)) + + (update-file-path deprecated-repo new-repo deprecated-app-id current-app-id) + ) diff --git a/src/main/frontend/handler/repo.cljs b/src/main/frontend/handler/repo.cljs index 3da9c1eada..089558a651 100644 --- a/src/main/frontend/handler/repo.cljs +++ b/src/main/frontend/handler/repo.cljs @@ -336,7 +336,9 @@ (db-persist/delete-graph! url) (search/remove-db! url) (state/delete-repo! repo) - (when graph-exists? (ipc/ipc "graphUnlinked" repo))))] + (when graph-exists? (ipc/ipc "graphUnlinked" repo)) + (when (= (state/get-current-repo) url) + (state/set-current-repo! (:url (first (state/get-repos)))))))] (when (or (config/local-db? url) (= url "local")) (p/let [_ (idb/clear-local-db! url)] ; clear file handles (delete-db-f))))) diff --git a/src/main/frontend/mobile/core.cljs b/src/main/frontend/mobile/core.cljs index 010e00d78e..64a963db51 100644 --- a/src/main/frontend/mobile/core.cljs +++ b/src/main/frontend/mobile/core.cljs @@ -2,7 +2,7 @@ (:require ["@capacitor/app" :refer [^js App]] ["@capacitor/keyboard" :refer [^js Keyboard]] [clojure.string :as string] - [frontend.fs.capacitor-fs :as fs] + [frontend.fs.capacitor-fs :as mobile-fs] [frontend.handler.editor :as editor-handler] [frontend.mobile.deeplink :as deeplink] [frontend.mobile.intent :as intent] @@ -20,8 +20,10 @@ (defn- ios-init "Initialize iOS-specified event listeners" [] - (let [path (fs/iOS-ensure-documents!)] + (let [path (mobile-fs/iOS-ensure-documents!)] (println "iOS container path: " path)) + + (state/pub-event! [:validate-appId]) (.addEventListener js/window "load" @@ -29,7 +31,7 @@ (when @*url (js/setTimeout #(deeplink/deeplink @*url) 1000)))) - + (mobile-util/check-ios-zoomed-display) (.removeAllListeners mobile-util/file-sync) diff --git a/src/main/frontend/mobile/util.cljs b/src/main/frontend/mobile/util.cljs index 4f623043ab..b9cec6c3e8 100644 --- a/src/main/frontend/mobile/util.cljs +++ b/src/main/frontend/mobile/util.cljs @@ -92,4 +92,10 @@ #(js->clj % :keywordize-keys true))] (when (:isZoomed is-zoomed?) (let [^js cl (.-classList js/document.documentElement)] - (.add cl "is-zoomed-native-ios"))))) \ No newline at end of file + (.add cl "is-zoomed-native-ios"))))) + +(defn iCloud-container-path? + "Check whether `path' is logseq's iCloud container path on iOS" + [path] + (string/includes? path "iCloud~com~logseq~logseq")) + diff --git a/src/main/frontend/state.cljs b/src/main/frontend/state.cljs index 1fbf58933b..12dd2cee3c 100644 --- a/src/main/frontend/state.cljs +++ b/src/main/frontend/state.cljs @@ -530,9 +530,7 @@ (->> (remove #(= (:url repo) (:url %)) repos) - (util/distinct-by :url)))) - (when (= (get-current-repo) (:url repo)) - (set-current-repo! (:url (first (get-repos)))))) + (util/distinct-by :url))))) (defn set-timestamp-block! [value] From 1af776a845636803e522a5f4c8c6a49611d03230 Mon Sep 17 00:00:00 2001 From: llcc Date: Tue, 14 Jun 2022 18:51:32 +0800 Subject: [PATCH 05/51] remove iCloud sync swift codes (#5698) --- ios/App/App/DownloadiCloudFiles.m | 13 --- ios/App/App/DownloadiCloudFiles.swift | 109 ------------------------- src/main/frontend/fs/capacitor_fs.cljs | 14 +--- src/main/frontend/mobile/util.cljs | 9 -- 4 files changed, 4 insertions(+), 141 deletions(-) delete mode 100644 ios/App/App/DownloadiCloudFiles.m delete mode 100644 ios/App/App/DownloadiCloudFiles.swift diff --git a/ios/App/App/DownloadiCloudFiles.m b/ios/App/App/DownloadiCloudFiles.m deleted file mode 100644 index 39cb95e30b..0000000000 --- a/ios/App/App/DownloadiCloudFiles.m +++ /dev/null @@ -1,13 +0,0 @@ -// -// DownloadiCloudFiles.m -// Logseq -// -// Created by leizhe on 2021/12/29. -// - -#import -#import - -CAP_PLUGIN(DownloadiCloudFiles, "DownloadiCloudFiles", - CAP_PLUGIN_METHOD(syncGraph, CAPPluginReturnPromise); - ) diff --git a/ios/App/App/DownloadiCloudFiles.swift b/ios/App/App/DownloadiCloudFiles.swift deleted file mode 100644 index 62f43aab9e..0000000000 --- a/ios/App/App/DownloadiCloudFiles.swift +++ /dev/null @@ -1,109 +0,0 @@ -// -// DownloadiCloudFiles.swift -// Logseq -// -// Created by leizhe on 2021/12/29. -// - -import Foundation -import Capacitor - -@objc(DownloadiCloudFiles) -public class DownloadiCloudFiles: CAPPlugin, UIDocumentPickerDelegate { - - public var _call: CAPPluginCall? = nil - - let fileManager = FileManager.default - var filesNeededToDownload = Set() - let extensions = [ - "md", - "org", - "css", - "edn", - "excalidraw" - ] - - var containerUrl: URL? { - return fileManager.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") - } - - var isDirectory: ObjCBool = false - var downloaded = false - - @objc func syncGraph(_ call: CAPPluginCall) { - - guard let graph = call.options["graph"] as? String else { - call.reject("Missing graph name") - return - } - - let ignores = [".git", ".trash", "bak", ".recycle"] - - if let url = self.containerUrl?.appendingPathComponent(graph) { - do { - downloaded = try self.downloadAllFilesFromCloud(at: url, ignorePattern: ignores) - handleDownloadFolderLoop() - } catch { - print(error.localizedDescription) - } - } - call.resolve(["success": downloaded]) - } - - func appendUndownloadedFile(at url: URL){ - var lastPathComponent = url.lastPathComponent - lastPathComponent.removeFirst() - let dirPath = url.deletingLastPathComponent().path - let filePath = dirPath + "/" + lastPathComponent.replacingOccurrences(of: ".icloud", with: "") - let neededToHandle = !extensions.allSatisfy{ !filePath.hasSuffix($0) } - - if neededToHandle { - filesNeededToDownload.insert(filePath) - } - } - - func downloadAllFilesFromCloud(at url: URL, ignorePattern ignores: [String] = []) throws -> Bool { - - let files = try fileManager.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: []) - - for file in files { - if file.pathExtension.lowercased() == "icloud" { - do { - try fileManager.startDownloadingUbiquitousItem(at: file) - appendUndownloadedFile(at: file) - } catch { - print("Unexpected error: \(error).") - } - - } else { - if fileManager.fileExists(atPath: file.path, isDirectory:&isDirectory) { - if isDirectory.boolValue && !ignores.contains(file.lastPathComponent) { - if try downloadAllFilesFromCloud(at: file, ignorePattern: ignores) { - downloaded = true - } - } - } - } - } - - return downloaded - } - - - func handleDownloadFolder() { - for file in filesNeededToDownload { - if fileManager.fileExists(atPath: file) { - filesNeededToDownload.remove(file) - } - } - } - - func handleDownloadFolderLoop () { - while !filesNeededToDownload.isEmpty { - let count = filesNeededToDownload.count - let interval = min(Double(count) * 0.1, 2) - Thread.sleep(forTimeInterval: interval) - handleDownloadFolder() - } - } -} diff --git a/src/main/frontend/fs/capacitor_fs.cljs b/src/main/frontend/fs/capacitor_fs.cljs index 906e7349d7..41922c20e4 100644 --- a/src/main/frontend/fs/capacitor_fs.cljs +++ b/src/main/frontend/fs/capacitor_fs.cljs @@ -275,16 +275,10 @@ {:keys [path localDocumentsPath]} (p/chain (.pickFolder mobile-util/folder-picker) #(js->clj % :keywordize-keys true)) - _ (when (mobile-util/native-ios?) - (cond - (not (or (local-container-path? path localDocumentsPath) - (mobile-util/iCloud-container-path? path))) - (state/pub-event! [:modal/show-instruction]) - - (mobile-util/iCloud-container-path? path) - (mobile-util/sync-icloud-repo path) - - :else nil)) + _ (when (and (mobile-util/native-ios?) + (not (or (local-container-path? path localDocumentsPath) + (mobile-util/iCloud-container-path? path)))) + (state/pub-event! [:modal/show-instruction])) files (readdir path) files (js->clj files :keywordize-keys true)] (into [] (concat [{:path path}] files)))) diff --git a/src/main/frontend/mobile/util.cljs b/src/main/frontend/mobile/util.cljs index b9cec6c3e8..4c062ff00b 100644 --- a/src/main/frontend/mobile/util.cljs +++ b/src/main/frontend/mobile/util.cljs @@ -23,7 +23,6 @@ (defonce folder-picker (registerPlugin "FolderPicker")) (when (native-ios?) - (defonce download-icloud-files (registerPlugin "DownloadiCloudFiles")) (defonce ios-utils (registerPlugin "Utils")) (defonce ios-file-container (registerPlugin "FileContainer")) (defonce file-sync (registerPlugin "FileSync"))) @@ -32,14 +31,6 @@ (when (native-platform?) (defonce fs-watcher (registerPlugin "FsWatcher"))) -(defn sync-icloud-repo [repo-dir] - (let [repo-name (-> (string/split repo-dir "Documents/") - last - string/trim - js/decodeURI)] - (.syncGraph download-icloud-files - (clj->js {:graph repo-name})))) - (defn hide-splash [] (.hide SplashScreen)) From c907a956377a98b325de59099508b89ba514987f Mon Sep 17 00:00:00 2001 From: Allan Chain <36528777+AllanChain@users.noreply.github.com> Date: Tue, 14 Jun 2022 22:29:16 +0800 Subject: [PATCH 06/51] fix: trim spaces when sanitizing page name (#5699) * fix: trim spaces when sanitizing page name * narrow the fix down to PDF only --- src/main/frontend/extensions/pdf/assets.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/frontend/extensions/pdf/assets.cljs b/src/main/frontend/extensions/pdf/assets.cljs index 4ba7bc3259..697b58e3e0 100644 --- a/src/main/frontend/extensions/pdf/assets.cljs +++ b/src/main/frontend/extensions/pdf/assets.cljs @@ -152,6 +152,7 @@ (defn resolve-ref-page [pdf-current] (let [page-name (:key pdf-current) + page-name (string/trim page-name) page-name (str "hls__" page-name) page (db-model/get-page page-name) url (:url pdf-current) From a88a3c04050e307bd32536b8c739bd7b1aca94d3 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 15 Jun 2022 15:38:40 +0800 Subject: [PATCH 07/51] fix: outliner core failed tests --- .../frontend/modules/outliner/core_test.cljs | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/test/frontend/modules/outliner/core_test.cljs b/src/test/frontend/modules/outliner/core_test.cljs index ec42ed6d20..58d127e4df 100644 --- a/src/test/frontend/modules/outliner/core_test.cljs +++ b/src/test/frontend/modules/outliner/core_test.cljs @@ -416,7 +416,9 @@ (defn transact-random-tree! [] (let [tree (gen-safe-tree)] - (transact-tree! tree))) + (if (seq tree) + (transact-tree! tree) + (transact-random-tree!)))) (defn get-datoms [] @@ -425,13 +427,9 @@ (defn get-random-block [] (let [datoms (->> (get-datoms) - (remove (fn [datom] (= 1 (:e datom)))))] - (if (seq datoms) - (let [id (:e (gen/generate (gen/elements datoms)))] - (db/pull test-db '[*] id)) - (do - (transact-random-tree!) - (get-random-block))))) + (remove (fn [datom] (= 1 (:e datom))))) + id (:e (gen/generate (gen/elements datoms)))] + (db/pull test-db '[*] id))) (defn get-random-successive-blocks [] @@ -458,9 +456,6 @@ (set/union old (set (map :block/uuid blocks))))) (insert-blocks! blocks (get-random-block))) (let [total (get-blocks-count)] - ;; (when (not= total (count @*random-blocks)) - ;; (defonce wrong-db (db/get-db test-db)) - ;; (defonce random-blocks @*random-blocks)) (is (= total (count @*random-blocks)))))))) (deftest ^:long random-deletes @@ -518,16 +513,17 @@ *random-blocks (atom c1)] (dotimes [_i 100] ;; (prn "Random move indent/outdent: " i) - (let [blocks (gen-blocks)] + (let [new-blocks (gen-blocks)] (swap! *random-blocks (fn [old] - (set/union old (set (map :block/uuid blocks))))) - (insert-blocks! blocks (get-random-block))) - (let [blocks (get-random-successive-blocks)] - (when (seq blocks) - (outliner-tx/transact! {:graph test-db} - (outliner-core/indent-outdent-blocks! blocks (gen/generate gen/boolean))) - (let [total (get-blocks-count)] - (is (= total (count @*random-blocks)))))))))) + (set/union old (set (map :block/uuid new-blocks))))) + (insert-blocks! new-blocks (get-random-block)) + (let [blocks (get-random-successive-blocks) + indent? (gen/generate gen/boolean)] + (when (seq blocks) + (outliner-tx/transact! {:graph test-db} + (outliner-core/indent-outdent-blocks! blocks indent?)) + (let [total (get-blocks-count)] + (is (= total (count @*random-blocks))))))))))) (deftest ^:long random-mixed-ops (testing "Random mixed operations" From 58bf6ee6404d905b1df82b4a2c6b8e71fbf7c9a8 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 15 Jun 2022 15:47:23 +0800 Subject: [PATCH 08/51] fix: random block could be empty --- src/test/frontend/modules/outliner/core_test.cljs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/frontend/modules/outliner/core_test.cljs b/src/test/frontend/modules/outliner/core_test.cljs index 58d127e4df..bd412d4877 100644 --- a/src/test/frontend/modules/outliner/core_test.cljs +++ b/src/test/frontend/modules/outliner/core_test.cljs @@ -427,9 +427,13 @@ (defn get-random-block [] (let [datoms (->> (get-datoms) - (remove (fn [datom] (= 1 (:e datom))))) - id (:e (gen/generate (gen/elements datoms)))] - (db/pull test-db '[*] id))) + (remove (fn [datom] (= 1 (:e datom)))))] + (if (seq datoms) + (let [id (:e (gen/generate (gen/elements datoms)))] + (db/pull test-db '[*] id)) + (do + (transact-random-tree!) + (get-random-block))))) (defn get-random-successive-blocks [] From 0f62bc22e9acfb058967bd46f673d67665705d1a Mon Sep 17 00:00:00 2001 From: Andelf Date: Wed, 15 Jun 2022 17:12:27 +0800 Subject: [PATCH 09/51] fix(encryption): allow enter key when prompt passwd --- src/main/frontend/components/encryption.cljs | 34 +++++++++++--------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/frontend/components/encryption.cljs b/src/main/frontend/components/encryption.cljs index 3a59279d46..ccc61656fe 100644 --- a/src/main/frontend/components/encryption.cljs +++ b/src/main/frontend/components/encryption.cljs @@ -135,7 +135,20 @@ (rum/local false ::loading) [state _repo-url db-encrypted-secret close-fn] (let [secret (::secret state) - loading (::loading state)] + loading (::loading state) + on-click-fn (fn [] + (reset! loading true) + (let [value @secret] + (when-not (string/blank? value) ; TODO: length or other checks + (let [repo (state/get-current-repo)] + (p/do! + (-> (e/decrypt-with-passphrase value db-encrypted-secret) + (p/then (fn [keys] + (e/save-key-pair! repo keys) + (close-fn true) + (state/set-state! :encryption/graph-parsing? false))) + (p/catch #(notification/show! "The password is not matched." :warning true)) + (p/finally #(reset! loading false))))))))] [:div [:div.sm:flex.sm:items-start [:div.mt-3.text-center.sm:mt-0.sm:text-left @@ -146,25 +159,16 @@ {:type "password" :auto-focus true :on-change (fn [e] - (reset! secret (util/evalue e)))}] + (reset! secret (util/evalue e))) + :on-key-down (fn [e] + (when (= (.-key e) "Enter") + (on-click-fn)))}] [:div.mt-5.sm:mt-4.sm:flex.sm:flex-row-reverse [:span.flex.w-full.rounded-md.shadow-sm.sm:ml-3.sm:w-auto [:button.inline-flex.justify-center.w-full.rounded-md.border.border-transparent.px-4.py-2.bg-indigo-600.text-base.leading-6.font-medium.text-white.shadow-sm.hover:bg-indigo-500.focus:outline-none.focus:border-indigo-700.focus:shadow-outline-indigo.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5 {:type "button" - :on-click (fn [] - (reset! loading true) - (let [value @secret] - (when-not (string/blank? value) ; TODO: length or other checks - (let [repo (state/get-current-repo)] - (p/do! - (-> (e/decrypt-with-passphrase value db-encrypted-secret) - (p/then (fn [keys] - (e/save-key-pair! repo keys) - (close-fn true) - (state/set-state! :encryption/graph-parsing? false))) - (p/catch #(notification/show! "The password is not matched." :warning true)) - (p/finally #(reset! loading false))))))))} + :on-click on-click-fn} (if @loading (ui/loading "Decrypting") "Decrypt")]]]])) (defn encryption-input-secret-dialog From 2aa50f6199a7c417e96a3c9dd8ca028767e30522 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 30 May 2022 22:00:34 +0800 Subject: [PATCH 10/51] feat(plugin): WIP request api --- libs/src/LSPlugin.ts | 19 +++++++++++++++++++ libs/src/modules/LSPlugin.Experiments.ts | 15 ++++++++++++++- src/main/logseq/api.cljs | 8 ++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/libs/src/LSPlugin.ts b/libs/src/LSPlugin.ts index a93664d450..9207e0938f 100644 --- a/libs/src/LSPlugin.ts +++ b/libs/src/LSPlugin.ts @@ -5,6 +5,8 @@ import { LSPluginCaller } from './LSPlugin.caller' import { LSPluginExperiments } from './modules/LSPlugin.Experiments' import { LSPluginFileStorage } from './modules/LSPlugin.Storage' +export type WithOptional = Omit & Partial>; + export type PluginLocalIdentity = string export type ThemeMode = 'light' | 'dark' @@ -114,6 +116,23 @@ export type IDatom = [e: number, a: string, v: any, t: number, added: boolean] export type IGitResult = { stdout: string; stderr: string; exitCode: number } +export type IRequestOptions = { + url: string + headers: Record + method: 'GET' | 'POST' | 'PUT' | 'DELETE' + data: any + timeout: number + dataType: 'json' | 'text' | 'base64' | 'arraybuffer' + success: (result: R) => void + fail: (err: any) => void + final: () => void +} + +export type IRequestTask = { + abort: () => void + promise: Promise +} + export interface AppUserInfo { [key: string]: any } diff --git a/libs/src/modules/LSPlugin.Experiments.ts b/libs/src/modules/LSPlugin.Experiments.ts index b1bea9af7e..55c75eb297 100644 --- a/libs/src/modules/LSPlugin.Experiments.ts +++ b/libs/src/modules/LSPlugin.Experiments.ts @@ -1,4 +1,4 @@ -import { LSPluginUser } from '../LSPlugin.user' +import { IRequestOptions, IRequestTask, LSPluginUser, WithOptional } from '../LSPlugin.user' import { PluginLocal } from '../LSPlugin.core' import { safeSnakeCase } from '../helpers' @@ -80,6 +80,19 @@ export class LSPluginExperiments { ) } + request(options: WithOptional, keyof Omit>): IRequestTask { + const pid = this.ctx.baseInfo.id + const reqID = this.invokeExperMethod('request', pid, options) + + // TODO: impl + const task = { + abort: (() => reqID), + promise: Promise.resolve(null) + } + + return task + } + ensureHostScope(): any { if (window === top) { throw new Error('Can not access host scope!') diff --git a/src/main/logseq/api.cljs b/src/main/logseq/api.cljs index a8812aa61e..5620a74f59 100644 --- a/src/main/logseq/api.cljs +++ b/src/main/logseq/api.cljs @@ -808,6 +808,14 @@ (plugin-handler/register-extensions-enhancer (keyword pid) type {:enhancer enhancer}))) +(defn ^:export exper_request + [pid options] + nil) + +(defn ^:export exper_abort_request + [req-id] + nil) + ;; helpers (defn ^:export query_element_by_id [id] From a9c02b87fd5b321fb510c4894557ced6660c8234 Mon Sep 17 00:00:00 2001 From: charlie Date: Tue, 31 May 2022 11:53:07 +0800 Subject: [PATCH 11/51] improve(plugin): update types --- libs/src/LSPlugin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/src/LSPlugin.ts b/libs/src/LSPlugin.ts index 9207e0938f..ecee174420 100644 --- a/libs/src/LSPlugin.ts +++ b/libs/src/LSPlugin.ts @@ -119,8 +119,8 @@ export type IGitResult = { stdout: string; stderr: string; exitCode: number } export type IRequestOptions = { url: string headers: Record - method: 'GET' | 'POST' | 'PUT' | 'DELETE' - data: any + method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' + data: Object | ArrayBuffer timeout: number dataType: 'json' | 'text' | 'base64' | 'arraybuffer' success: (result: R) => void From 5e67a0f6523f20243a575412ac74e712a28e3f62 Mon Sep 17 00:00:00 2001 From: charlie Date: Tue, 31 May 2022 14:15:06 +0800 Subject: [PATCH 12/51] improve(ui): add cursor pointer to plugin thumb link element --- src/main/frontend/components/plugins.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/plugins.cljs b/src/main/frontend/components/plugins.cljs index 4f18908093..db3848c56d 100644 --- a/src/main/frontend/components/plugins.cljs +++ b/src/main/frontend/components/plugins.cljs @@ -278,7 +278,7 @@ :updating installing-or-updating? :has-new-version new-version}])} - [:div.l.link-block + [:div.l.link-block.cursor-pointer {:on-click #(plugin-handler/open-readme! url item (if repo remote-readme-display local-markdown-display))} (if (and icon (not (string/blank? icon))) From 3b0e1c58a392a303218328544d96feb00bb66c69 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 6 Jun 2022 23:21:05 +0800 Subject: [PATCH 13/51] improve(plugin): WIP api of http request --- libs/src/LSPlugin.caller.ts | 2 +- libs/src/LSPlugin.ts | 19 ++--------------- libs/src/LSPlugin.user.ts | 11 ++++++++-- libs/src/modules/LSPlugin.Experiments.ts | 17 ++------------- src/electron/electron/handler.cljs | 27 ++++++++++++++++++++++++ src/main/frontend/handler/plugin.cljs | 9 ++++++++ src/main/logseq/api.cljs | 12 +++++++++-- 7 files changed, 60 insertions(+), 37 deletions(-) diff --git a/libs/src/LSPlugin.caller.ts b/libs/src/LSPlugin.caller.ts index cf607ed06f..8d57550593 100644 --- a/libs/src/LSPlugin.caller.ts +++ b/libs/src/LSPlugin.caller.ts @@ -281,7 +281,7 @@ class LSPluginCaller extends EventEmitter { }) this._call = async (...args: any) => { - // parent all will get message before handshaked + // parent all will get message before handshake await refChild.call(LSPMSGFn(pl.id), { type: args[0], payload: Object.assign(args[1] || {}, { diff --git a/libs/src/LSPlugin.ts b/libs/src/LSPlugin.ts index ecee174420..c874c43d3f 100644 --- a/libs/src/LSPlugin.ts +++ b/libs/src/LSPlugin.ts @@ -4,6 +4,7 @@ import EventEmitter from 'eventemitter3' import { LSPluginCaller } from './LSPlugin.caller' import { LSPluginExperiments } from './modules/LSPlugin.Experiments' import { LSPluginFileStorage } from './modules/LSPlugin.Storage' +import { LSPluginRequest } from './modules/LSPlugin.Request' export type WithOptional = Omit & Partial>; @@ -116,23 +117,6 @@ export type IDatom = [e: number, a: string, v: any, t: number, added: boolean] export type IGitResult = { stdout: string; stderr: string; exitCode: number } -export type IRequestOptions = { - url: string - headers: Record - method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' - data: Object | ArrayBuffer - timeout: number - dataType: 'json' | 'text' | 'base64' | 'arraybuffer' - success: (result: R) => void - fail: (err: any) => void - final: () => void -} - -export type IRequestTask = { - abort: () => void - promise: Promise -} - export interface AppUserInfo { [key: string]: any } @@ -967,6 +951,7 @@ export interface ILSPluginUser extends EventEmitter { Git: IGitProxy UI: IUIProxy + Request: LSPluginRequest FileStorage: LSPluginFileStorage Experiments: LSPluginExperiments } diff --git a/libs/src/LSPlugin.user.ts b/libs/src/LSPlugin.user.ts index 6dcd3ae967..cb86e22cb6 100644 --- a/libs/src/LSPlugin.user.ts +++ b/libs/src/LSPlugin.user.ts @@ -39,6 +39,7 @@ import * as CSS from 'csstype' import EventEmitter from 'eventemitter3' import { LSPluginFileStorage } from './modules/LSPlugin.Storage' import { LSPluginExperiments } from './modules/LSPlugin.Experiments' +import { LSPluginRequest } from './modules/LSPlugin.Request' declare global { interface Window { @@ -318,8 +319,7 @@ const KEY_MAIN_UI = 0 */ export class LSPluginUser extends EventEmitter - implements ILSPluginUser -{ + implements ILSPluginUser { // @ts-ignore private _version: string = LIB_VERSION private _debugTag: string = '' @@ -333,6 +333,7 @@ export class LSPluginUser private _ui = new Map() private _mFileStorage: LSPluginFileStorage + private _mRequest: LSPluginRequest private _mExperiments: LSPluginExperiments /** @@ -673,6 +674,12 @@ export class LSPluginUser return m } + get Request(): LSPluginRequest { + let m = this._mRequest + if (!m) m = this._mRequest = new LSPluginRequest(this) + return m + } + get Experiments(): LSPluginExperiments { let m = this._mExperiments if (!m) m = this._mExperiments = new LSPluginExperiments(this) diff --git a/libs/src/modules/LSPlugin.Experiments.ts b/libs/src/modules/LSPlugin.Experiments.ts index 55c75eb297..4e32bf370c 100644 --- a/libs/src/modules/LSPlugin.Experiments.ts +++ b/libs/src/modules/LSPlugin.Experiments.ts @@ -1,4 +1,4 @@ -import { IRequestOptions, IRequestTask, LSPluginUser, WithOptional } from '../LSPlugin.user' +import { LSPluginUser } from '../LSPlugin.user' import { PluginLocal } from '../LSPlugin.core' import { safeSnakeCase } from '../helpers' @@ -24,7 +24,7 @@ export class LSPluginExperiments { ) } - private invokeExperMethod(type: string, ...args: Array) { + public invokeExperMethod(type: string, ...args: Array) { const host = this.ensureHostScope() type = safeSnakeCase(type)?.toLowerCase() return host.logseq.api['exper_' + type]?.apply(host, args) @@ -80,19 +80,6 @@ export class LSPluginExperiments { ) } - request(options: WithOptional, keyof Omit>): IRequestTask { - const pid = this.ctx.baseInfo.id - const reqID = this.invokeExperMethod('request', pid, options) - - // TODO: impl - const task = { - abort: (() => reqID), - promise: Promise.resolve(null) - } - - return task - } - ensureHostScope(): any { if (window === top) { throw new Error('Can not access host scope!') diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index f128561f9f..e7fc5ea1fe 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -368,6 +368,33 @@ (defmethod handle :uninstallMarketPlugin [_ [_ id]] (plugin/uninstall! id)) +(defmethod handle :httpRequest [_ [_ _req-id opts]] + (let [{:keys [url method dataType data headers]} opts] + (when-let [[method type] (and (not (string/blank? url)) + [(keyword (string/upper-case (or method "GET"))) + (keyword (string/lower-case (or dataType "json")))])] + (-> (utils/fetch url + (-> {:method method + :headers (and headers (bean/->js headers))} + (merge (when (and (not (contains? #{:GET :HEAD} method)) data) + ;; TODO: support type of arrayBuffer + {:body (js/JSON.stringify (bean/->js data))})))) + (p/then (fn [^js res] + (case type + :json + (.json res) + + :arraybuffer + (.arrayBuffer res) + + :base64 + (-> (.buffer res) + (p/then #(.toString % "base64"))) + + :text + (.text res)))) + (p/catch identity))))) + (defmethod handle :quitAndInstall [] (.quitAndInstall autoUpdater)) diff --git a/src/main/frontend/handler/plugin.cljs b/src/main/frontend/handler/plugin.cljs index 02585c9697..dbc1aba13f 100644 --- a/src/main/frontend/handler/plugin.cljs +++ b/src/main/frontend/handler/plugin.cljs @@ -531,6 +531,15 @@ (into {} (map (fn [v] [(keyword (:id v)) v]) plugins))) (state/pub-event! [:plugin/consume-updates])))) +(defn call-plugin + [^js pl type payload] + (when pl + (.call (.-caller pl) (name type) (bean/->js payload)))) + +(defn request-callback + [^js pl req-id payload] + (call-plugin pl :#lsp#request#callback {:requestId req-id :payload payload})) + ;; components (rum/defc lsp-indicator < rum/reactive [] diff --git a/src/main/logseq/api.cljs b/src/main/logseq/api.cljs index 5620a74f59..e377e3d58b 100644 --- a/src/main/logseq/api.cljs +++ b/src/main/logseq/api.cljs @@ -808,9 +808,17 @@ (plugin-handler/register-extensions-enhancer (keyword pid) type {:enhancer enhancer}))) +(defonce *request-k (volatile! 0)) + (defn ^:export exper_request - [pid options] - nil) + [pid ^js options] + (when-let [^js _pl (plugin-handler/get-plugin-inst pid)] + (let [req-id (vreset! *request-k (inc @*request-k)) + req-cb #(plugin-handler/request-callback _pl req-id %)] + (-> (ipc/ipc :httpRequest req-id options) + (p/then #(req-cb %)) + (p/catch #(req-cb %))) + req-id))) (defn ^:export exper_abort_request [req-id] From a134267c395accbf62e8705a0919d94dfac9c74a Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 6 Jun 2022 23:21:43 +0800 Subject: [PATCH 14/51] chore(libs): update dependencies --- libs/package.json | 20 +-- libs/yarn.lock | 328 +++++++++++++++------------------------------- 2 files changed, 118 insertions(+), 230 deletions(-) diff --git a/libs/package.json b/libs/package.json index 0ad0b4254a..15a450b359 100644 --- a/libs/package.json +++ b/libs/package.json @@ -15,9 +15,9 @@ "fix": "prettier --write \"src/**/*.{ts, js}\"" }, "dependencies": { - "csstype": "3.0.8", - "debug": "4.3.1", - "dompurify": "2.3.1", + "csstype": "3.1.0", + "debug": "4.3.4", + "dompurify": "2.3.8", "eventemitter3": "4.0.7", "fast-deep-equal": "3.1.3", "lodash-es": "4.17.21", @@ -26,14 +26,14 @@ }, "devDependencies": { "@types/debug": "^4.1.5", - "@types/dompurify": "^2.2.1", - "@types/lodash-es": "^4.17.4", + "@types/dompurify": "2.3.3", + "@types/lodash-es": "4.17.6", "prettier": "^2.6.2", "prettier-config-standard": "^5.0.0", - "ts-loader": "^8.0.17", - "typescript": "^4.2.2", - "webpack": "^5.24.3", - "webpack-bundle-analyzer": "^4.4.0", - "webpack-cli": "^4.5.0" + "ts-loader": "9.3.0", + "typescript": "4.7.3", + "webpack": "5.73.0", + "webpack-bundle-analyzer": "4.5.0", + "webpack-cli": "4.9.2" } } diff --git a/libs/yarn.lock b/libs/yarn.lock index 63350b01b5..24cac4217d 100644 --- a/libs/yarn.lock +++ b/libs/yarn.lock @@ -19,17 +19,17 @@ dependencies: "@types/ms" "*" -"@types/dompurify@^2.2.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.2.3.tgz#6e89677a07902ac1b6821c345f34bd85da239b08" - integrity sha512-CLtc2mZK8+axmrz1JqtpklO/Kvn38arGc8o1l3UVopZaXXuer9ONdZwJ/9f226GrhRLtUmLr9WrvZsRSNpS8og== +"@types/dompurify@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.3.3.tgz#c24c92f698f77ed9cc9d9fa7888f90cf2bfaa23f" + integrity sha512-nnVQSgRVuZ/843oAfhA25eRSNzUFcBPk/LOiw5gm8mD9/X7CNcbRkQu/OsjCewO8+VIYfPxUnXvPEVGenw14+w== dependencies: "@types/trusted-types" "*" -"@types/eslint-scope@^3.7.0": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" - integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== dependencies: "@types/eslint" "*" "@types/estree" "*" @@ -42,20 +42,25 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.50": +"@types/estree@*": version "0.0.50" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + "@types/json-schema@*", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -"@types/lodash-es@^4.17.4": - version "4.17.4" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.4.tgz#b2e440d2bf8a93584a9fd798452ec497986c9b97" - integrity sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ== +"@types/lodash-es@4.17.6": + version "4.17.6" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0" + integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg== dependencies: "@types/lodash" "*" @@ -200,22 +205,22 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa" - integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ== +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== -"@webpack-cli/info@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b" - integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w== +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== dependencies: envinfo "^7.7.3" -"@webpack-cli/serve@^1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec" - integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw== +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -264,11 +269,6 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - braces@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -331,31 +331,26 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.1, colorette@^1.3.0: +colorette@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== +colorette@^2.0.14: + version "2.0.17" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" + integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commander@^7.0.0: +commander@^7.0.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -365,22 +360,22 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -csstype@3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== +csstype@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -dompurify@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.1.tgz#a47059ca21fd1212d3c8f71fdea6943b8bfbdf6a" - integrity sha512-xGWt+NHAQS+4tpgbOAI08yxW0Pr256Gu/FNE2frZVTbgrBUn8M7tz7/ktS/LZ2MHeGqz6topj0/xY+y8R5FBFw== +dompurify@2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" + integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== dot-case@^3.0.4: version "3.0.4" @@ -400,24 +395,10 @@ electron-to-chromium@^1.3.811: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.814.tgz#418fad80c3276a46103ca72a21a8290620d83c4a" integrity sha512-0mH03cyjh6OzMlmjauGg0TLd87ErIJqWiYxMcOLKf5w6p0YEOl7DJAj7BDlXEFmCguY5CQaKVOiMjAMODO2XDw== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -enhanced-resolve@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enhanced-resolve@^5.8.0: - version "5.8.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" - integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -427,17 +408,10 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -es-module-lexer@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" - integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== escalade@^3.1.1: version "3.1.1" @@ -544,6 +518,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -581,11 +560,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -615,11 +589,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -639,23 +608,16 @@ jest-worker@^27.0.2: merge-stream "^2.0.0" supports-color "^8.0.0" -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -666,15 +628,6 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -706,14 +659,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -749,11 +694,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -867,21 +807,11 @@ prettier@^2.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - process@^0.11.1: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -894,19 +824,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - 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" - rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -939,11 +856,6 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - schema-utils@^3.0.0, schema-utils@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" @@ -1026,13 +938,6 @@ source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -1052,11 +957,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - tapable@^2.1.1, tapable@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" @@ -1095,14 +995,13 @@ totalist@^1.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== -ts-loader@^8.0.17: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" - integrity sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag== +ts-loader@9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f" + integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== dependencies: chalk "^4.1.0" - enhanced-resolve "^4.0.0" - loader-utils "^2.0.0" + enhanced-resolve "^5.0.0" micromatch "^4.0.0" semver "^7.3.4" @@ -1111,10 +1010,10 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -typescript@^4.2.2: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== uri-js@^4.2.2: version "4.4.1" @@ -1123,11 +1022,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" @@ -1135,51 +1029,45 @@ util@^0.10.3: dependencies: inherits "2.0.3" -v8-compile-cache@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -watchpack@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" - integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -webpack-bundle-analyzer@^4.4.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz#39898cf6200178240910d629705f0f3493f7d666" - integrity sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ== +webpack-bundle-analyzer@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: acorn "^8.0.4" acorn-walk "^8.0.0" chalk "^4.1.0" - commander "^6.2.0" + commander "^7.2.0" gzip-size "^6.0.0" lodash "^4.17.20" opener "^1.5.2" sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^4.5.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1" - integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw== +webpack-cli@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.0.4" - "@webpack-cli/info" "^1.3.0" - "@webpack-cli/serve" "^1.5.2" - colorette "^1.2.1" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" commander "^7.0.0" execa "^5.0.0" fastest-levenshtein "^1.0.12" import-local "^3.0.2" interpret "^2.2.0" rechoir "^0.7.0" - v8-compile-cache "^2.2.0" webpack-merge "^5.7.3" webpack-merge@^5.7.3: @@ -1190,18 +1078,18 @@ webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d" - integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw== +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.24.3: - version "5.51.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.51.1.tgz#41bebf38dccab9a89487b16dbe95c22e147aac57" - integrity sha512-xsn3lwqEKoFvqn4JQggPSRxE4dhsRcysWTqYABAZlmavcoTmwlOb9b1N36Inbt/eIispSkuHa80/FJkDTPos1A== +webpack@5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" @@ -1209,21 +1097,21 @@ webpack@^5.24.3: acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.0" - es-module-lexer "^0.7.1" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" - json-parse-better-errors "^1.0.2" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.2.0" - webpack-sources "^3.2.0" + watchpack "^2.3.1" + webpack-sources "^3.2.3" which@^2.0.1: version "2.0.2" From 98ea0148ffd5d0a51db7736a89852832c22e37e5 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 6 Jun 2022 23:22:15 +0800 Subject: [PATCH 15/51] improve(plugin): WIP api of http request --- libs/src/modules/LSPlugin.Request.ts | 107 +++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 libs/src/modules/LSPlugin.Request.ts diff --git a/libs/src/modules/LSPlugin.Request.ts b/libs/src/modules/LSPlugin.Request.ts new file mode 100644 index 0000000000..0a12052c8d --- /dev/null +++ b/libs/src/modules/LSPlugin.Request.ts @@ -0,0 +1,107 @@ +import { LSPluginUser, WithOptional } from '../LSPlugin.user' +import { EventEmitter } from 'eventemitter3' + +export type IRequestOptions = { + url: string + headers: Record + method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' + data: Object | ArrayBuffer + timeout: number + dataType: 'json' | 'text' | 'base64' | 'arraybuffer' + success: (result: R) => void + fail: (err: any) => void + final: () => void +} + +export type RequestTaskID = string | number + +const CLIENT_MSG_CALLBACK = '#lsp#request#callback' +const genTaskCallbackType = (id: RequestTaskID) => `task_callback_${id}` + +/** + * Request task + */ +export class LSPluginRequestTask { + private readonly _promise: Promise + private _aborted: boolean = false + + constructor( + private _client: LSPluginRequest, + private _requestId: RequestTaskID + ) { + + this._promise = new Promise((resolve, reject) => { + if (!this._requestId) { + return reject(null) + } + + // task result listener + this._client.once( + genTaskCallbackType(this._requestId), + (e) => { + resolve(e) + } + ) + }) + } + + abort() { + if (this._aborted) return + + // TODO: impl + } + + get promise(): Promise { + return this._promise + } + + get client(): LSPluginRequest { + return this._client + } + + get requestId(): RequestTaskID { + return this._requestId + } +} + +/** + * A simple request client + */ +export class LSPluginRequest extends EventEmitter { + constructor(private ctx: LSPluginUser) { + super() + + // request callback listener + this.ctx.caller.on( + CLIENT_MSG_CALLBACK, + (e: any) => { + const reqId = e?.requestId + if (!reqId) return + + this.emit(genTaskCallbackType(reqId), e?.payload) + } + ) + } + + static createRequestTask( + client: LSPluginRequest, + requestID: RequestTaskID + ) { + return new LSPluginRequestTask( + client, requestID + ) + } + + _request(options: WithOptional, keyof Omit>): LSPluginRequestTask { + const pid = this.ctx.baseInfo.id + const reqID = this.ctx.Experiments.invokeExperMethod('request', pid, options) + + // TODO: impl + const task = LSPluginRequest.createRequestTask( + this.ctx.Request, + reqID + ) + + return task + } +} \ No newline at end of file From 7b2ce59787c25ae056cc3b9cbffb7dc5287249a9 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 13 Jun 2022 11:58:14 +0800 Subject: [PATCH 16/51] improve(plugin): types of request api --- libs/src/modules/LSPlugin.Request.ts | 29 ++++++++++++++++++++++------ src/electron/electron/handler.cljs | 4 ++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/libs/src/modules/LSPlugin.Request.ts b/libs/src/modules/LSPlugin.Request.ts index 0a12052c8d..7868954812 100644 --- a/libs/src/modules/LSPlugin.Request.ts +++ b/libs/src/modules/LSPlugin.Request.ts @@ -7,7 +7,7 @@ export type IRequestOptions = { method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' data: Object | ArrayBuffer timeout: number - dataType: 'json' | 'text' | 'base64' | 'arraybuffer' + returnType: 'json' | 'text' | 'base64' | 'arraybuffer' success: (result: R) => void fail: (err: any) => void final: () => void @@ -27,7 +27,8 @@ export class LSPluginRequestTask { constructor( private _client: LSPluginRequest, - private _requestId: RequestTaskID + private _requestId: RequestTaskID, + private _requestOptions: Partial = {} ) { this._promise = new Promise((resolve, reject) => { @@ -39,10 +40,24 @@ export class LSPluginRequestTask { this._client.once( genTaskCallbackType(this._requestId), (e) => { + // handle error resolve(e) } ) }) + + const { success, fail, final } = this._requestOptions + + this._promise + .then((res) => { + success?.(res) + }) + .catch((e) => { + fail?.(e) + }) + .finally(() => { + final?.() + }) } abort() { @@ -85,21 +100,23 @@ export class LSPluginRequest extends EventEmitter { static createRequestTask( client: LSPluginRequest, - requestID: RequestTaskID + requestID: RequestTaskID, + requestOptions: Partial ) { return new LSPluginRequestTask( - client, requestID + client, requestID, requestOptions ) } _request(options: WithOptional, keyof Omit>): LSPluginRequestTask { const pid = this.ctx.baseInfo.id - const reqID = this.ctx.Experiments.invokeExperMethod('request', pid, options) + const { success, fail, final, ...requestOptions } = options + const reqID = this.ctx.Experiments.invokeExperMethod('request', pid, requestOptions) // TODO: impl const task = LSPluginRequest.createRequestTask( this.ctx.Request, - reqID + reqID, { success, fail, final } ) return task diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index e7fc5ea1fe..707b65569c 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -369,10 +369,10 @@ (plugin/uninstall! id)) (defmethod handle :httpRequest [_ [_ _req-id opts]] - (let [{:keys [url method dataType data headers]} opts] + (let [{:keys [url method data returnType headers]} opts] (when-let [[method type] (and (not (string/blank? url)) [(keyword (string/upper-case (or method "GET"))) - (keyword (string/lower-case (or dataType "json")))])] + (keyword (string/lower-case (or returnType "json")))])] (-> (utils/fetch url (-> {:method method :headers (and headers (bean/->js headers))} From e4b71a4ccf5347c8278b89d4ed2c0e505785bf55 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 13 Jun 2022 16:14:55 +0800 Subject: [PATCH 17/51] improve(plugin): support abortable controller of request api --- libs/src/modules/LSPlugin.Request.ts | 39 +++++++++++++++++++++------- resources/package.json | 3 ++- src/electron/electron/handler.cljs | 23 +++++++++++++--- src/main/logseq/api.cljs | 4 +-- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/libs/src/modules/LSPlugin.Request.ts b/libs/src/modules/LSPlugin.Request.ts index 7868954812..b2ba039e98 100644 --- a/libs/src/modules/LSPlugin.Request.ts +++ b/libs/src/modules/LSPlugin.Request.ts @@ -3,6 +3,7 @@ import { EventEmitter } from 'eventemitter3' export type IRequestOptions = { url: string + abortable: boolean headers: Record method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' data: Object | ArrayBuffer @@ -40,8 +41,11 @@ export class LSPluginRequestTask { this._client.once( genTaskCallbackType(this._requestId), (e) => { - // handle error - resolve(e) + if (e && e instanceof Error) { + reject(e) + } else { + resolve(e) + } } ) }) @@ -61,9 +65,17 @@ export class LSPluginRequestTask { } abort() { - if (this._aborted) return + if ( + !this._requestOptions.abortable || + this._aborted + ) return - // TODO: impl + this._client.ctx._execCallableAPI( + 'http_request_abort', + this._requestId + ) + + this._aborted = true } get promise(): Promise { @@ -83,7 +95,7 @@ export class LSPluginRequestTask { * A simple request client */ export class LSPluginRequest extends EventEmitter { - constructor(private ctx: LSPluginUser) { + constructor(private _ctx: LSPluginUser) { super() // request callback listener @@ -108,17 +120,26 @@ export class LSPluginRequest extends EventEmitter { ) } - _request(options: WithOptional, keyof Omit>): LSPluginRequestTask { + async _request, keyof Omit>>(options: T): + Promise ? LSPluginRequestTask : R> { const pid = this.ctx.baseInfo.id const { success, fail, final, ...requestOptions } = options const reqID = this.ctx.Experiments.invokeExperMethod('request', pid, requestOptions) - // TODO: impl const task = LSPluginRequest.createRequestTask( this.ctx.Request, - reqID, { success, fail, final } + reqID, options ) - return task + if (!requestOptions.abortable) { + return task.promise + } + + return task as any + } + + get ctx(): LSPluginUser { + return this._ctx } } \ No newline at end of file diff --git a/resources/package.json b/resources/package.json index 1a4bf7213c..2c13a3f115 100644 --- a/resources/package.json +++ b/resources/package.json @@ -37,7 +37,8 @@ "@sentry/electron": "2.5.1", "posthog-js": "1.10.2", "@logseq/rsapi": "0.0.20", - "electron-deeplink": "1.0.10" + "electron-deeplink": "1.0.10", + "abort-controller": "3.0.0" }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.57", diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index 707b65569c..3c1adccd4b 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -8,6 +8,7 @@ ["os" :as os] ["diff-match-patch" :as google-diff] ["/electron/utils" :as js-utils] + ["abort-controller" :as AbortController] [electron.fs-watcher :as watcher] [electron.configs :as cfgs] [promesa.core :as p] @@ -368,8 +369,10 @@ (defmethod handle :uninstallMarketPlugin [_ [_ id]] (plugin/uninstall! id)) +(def *request-abort-signals (atom {})) + (defmethod handle :httpRequest [_ [_ _req-id opts]] - (let [{:keys [url method data returnType headers]} opts] + (let [{:keys [url abortable method data returnType headers]} opts] (when-let [[method type] (and (not (string/blank? url)) [(keyword (string/upper-case (or method "GET"))) (keyword (string/lower-case (or returnType "json")))])] @@ -378,7 +381,11 @@ :headers (and headers (bean/->js headers))} (merge (when (and (not (contains? #{:GET :HEAD} method)) data) ;; TODO: support type of arrayBuffer - {:body (js/JSON.stringify (bean/->js data))})))) + {:body (js/JSON.stringify (bean/->js data))}) + + (when-let [^js controller (and abortable (AbortController.))] + (swap! *request-abort-signals assoc _req-id controller) + {:signal (.-signal controller)})))) (p/then (fn [^js res] (case type :json @@ -393,7 +400,17 @@ :text (.text res)))) - (p/catch identity))))) + (p/catch + (fn [^js e] + ;; TODO: handle special cases + (throw e))) + (p/finally + (fn [] + (swap! *request-abort-signals dissoc _req-id))))))) + +(defmethod handle :httpRequestAbort [_ [_ _req-id]] + (when-let [^js controller (get @*request-abort-signals _req-id)] + (.abort controller))) (defmethod handle :quitAndInstall [] (.quitAndInstall autoUpdater)) diff --git a/src/main/logseq/api.cljs b/src/main/logseq/api.cljs index e377e3d58b..0dd75c62bf 100644 --- a/src/main/logseq/api.cljs +++ b/src/main/logseq/api.cljs @@ -820,9 +820,9 @@ (p/catch #(req-cb %))) req-id))) -(defn ^:export exper_abort_request +(defn ^:export http_request_abort [req-id] - nil) + (ipc/ipc :httpRequestAbort req-id)) ;; helpers (defn ^:export query_element_by_id From f3bedb200eca6e1e8f035a80a90f57eb2f456bb2 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 13 Jun 2022 17:40:09 +0800 Subject: [PATCH 18/51] improve(plugin): add theme changed hook --- libs/src/LSPlugin.core.ts | 6 +++--- libs/src/LSPlugin.ts | 1 + resources/js/lsplugin.core.js | 2 +- resources/js/lsplugin.core.js.LICENSE.txt | 2 +- src/main/frontend/handler/plugin.cljs | 3 ++- src/main/frontend/ui.cljs | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libs/src/LSPlugin.core.ts b/libs/src/LSPlugin.core.ts index 69ece824b9..2da1f5da5c 100644 --- a/libs/src/LSPlugin.core.ts +++ b/libs/src/LSPlugin.core.ts @@ -1126,7 +1126,7 @@ class LSPluginCore | 'registered' | 'error' | 'unregistered' - | 'theme-changed' + | 'themes-changed' | 'theme-selected' | 'reset-custom-theme' | 'settings-changed' @@ -1510,7 +1510,7 @@ class LSPluginCore } themes.push(opt) - this.emit('theme-changed', this.themes, { id, ...opt }) + this.emit('themes-changed', this.themes, { id, ...opt }) } async selectTheme( @@ -1571,7 +1571,7 @@ class LSPluginCore } this._registeredThemes.delete(id) - this.emit('theme-changed', this.themes, { id }) + this.emit('themes-changed', this.themes, { id }) if (effect && this._currentTheme?.pid === id) { this._currentTheme.eject() this._currentTheme = null diff --git a/libs/src/LSPlugin.ts b/libs/src/LSPlugin.ts index c874c43d3f..79df97694c 100644 --- a/libs/src/LSPlugin.ts +++ b/libs/src/LSPlugin.ts @@ -410,6 +410,7 @@ export interface IAppProxy { // hook events onCurrentGraphChanged: IUserHook onThemeModeChanged: IUserHook<{ mode: 'dark' | 'light' }> + onThemeChanged: IUserHook> onBlockRendererSlotted: IUserSlotHook<{ uuid: BlockUUID }> /** diff --git a/resources/js/lsplugin.core.js b/resources/js/lsplugin.core.js index e1abc0f0d1..a4c621253c 100644 --- a/resources/js/lsplugin.core.js +++ b/resources/js/lsplugin.core.js @@ -1,2 +1,2 @@ /*! For license information please see lsplugin.core.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.LSPlugin=t():e.LSPlugin=t()}(self,(function(){return(()=>{var e={227:(e,t,n)=>{var r=n(155);t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&void 0!==r&&"env"in r&&(e=r.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(447)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},447:(e,t,n)=>{e.exports=function(e){function t(e){let n,i=null;function o(...e){if(!o.enabled)return;const r=o,i=Number(new Date),s=i-(n||i);r.diff=s,r.prev=n,r.curr=i,n=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let a=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((n,i)=>{if("%%"===n)return"%";a++;const o=t.formatters[i];if("function"==typeof o){const t=e[a];n=o.call(r,t),e.splice(a,1),a--}return n})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=r,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null===i?t.enabled(e):i,set:e=>{i=e}}),"function"==typeof t.init&&t.init(o),o}function r(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function i(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names.map(i),...t.skips.map(i).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t1?n-1:0),i=1;i/gm),U=s(/^data-[\-\w.\u00B7-\uFFFF]/),$=s(/^aria-[\-\w]+$/),z=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),B=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function q(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:G(),n=function(t){return e(t)};if(n.version="2.3.1",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var r=t.document,i=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,c=t.Node,l=t.Element,u=t.NodeFilter,d=t.NamedNodeMap,x=void 0===d?t.NamedNodeMap||t.MozNamedAttrMap:d,Z=t.Text,K=t.Comment,V=t.DOMParser,Y=t.trustedTypes,X=l.prototype,Q=O(X,"cloneNode"),ee=O(X,"nextSibling"),te=O(X,"childNodes"),ne=O(X,"parentNode");if("function"==typeof a){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var ie=J(Y,r),oe=ie&&De?ie.createHTML(""):"",se=i,ae=se.implementation,ce=se.createNodeIterator,le=se.createDocumentFragment,ue=se.getElementsByTagName,de=r.importNode,he={};try{he=C(i).documentMode?i.documentMode:{}}catch(e){}var pe={};n.isSupported="function"==typeof ne&&ae&&void 0!==ae.createHTMLDocument&&9!==he;var fe=D,ge=N,me=U,ye=$,_e=H,ve=B,be=z,we=null,xe=S({},[].concat(q(A),q(E),q(j),q(k),q(I))),Se=null,Ce=S({},[].concat(q(F),q(P),q(R),q(M))),Oe=null,Ae=null,Ee=!0,je=!0,Te=!1,ke=!1,Le=!1,Ie=!1,Fe=!1,Pe=!1,Re=!1,Me=!0,De=!1,Ne=!0,Ue=!0,$e=!1,ze={},He=null,Be=S({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),We=null,qe=S({},["audio","video","img","source","image","track"]),Ge=null,Je=S({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ze="http://www.w3.org/1998/Math/MathML",Ke="http://www.w3.org/2000/svg",Ve="http://www.w3.org/1999/xhtml",Ye=Ve,Xe=!1,Qe=null,et=i.createElement("form"),tt=function(e){Qe&&Qe===e||(e&&"object"===(void 0===e?"undefined":W(e))||(e={}),e=C(e),we="ALLOWED_TAGS"in e?S({},e.ALLOWED_TAGS):xe,Se="ALLOWED_ATTR"in e?S({},e.ALLOWED_ATTR):Ce,Ge="ADD_URI_SAFE_ATTR"in e?S(C(Je),e.ADD_URI_SAFE_ATTR):Je,We="ADD_DATA_URI_TAGS"in e?S(C(qe),e.ADD_DATA_URI_TAGS):qe,He="FORBID_CONTENTS"in e?S({},e.FORBID_CONTENTS):Be,Oe="FORBID_TAGS"in e?S({},e.FORBID_TAGS):{},Ae="FORBID_ATTR"in e?S({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,Ee=!1!==e.ALLOW_ARIA_ATTR,je=!1!==e.ALLOW_DATA_ATTR,Te=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ke=e.SAFE_FOR_TEMPLATES||!1,Le=e.WHOLE_DOCUMENT||!1,Pe=e.RETURN_DOM||!1,Re=e.RETURN_DOM_FRAGMENT||!1,Me=!1!==e.RETURN_DOM_IMPORT,De=e.RETURN_TRUSTED_TYPE||!1,Fe=e.FORCE_BODY||!1,Ne=!1!==e.SANITIZE_DOM,Ue=!1!==e.KEEP_CONTENT,$e=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ve,ke&&(je=!1),Re&&(Pe=!0),ze&&(we=S({},[].concat(q(I))),Se=[],!0===ze.html&&(S(we,A),S(Se,F)),!0===ze.svg&&(S(we,E),S(Se,P),S(Se,M)),!0===ze.svgFilters&&(S(we,j),S(Se,P),S(Se,M)),!0===ze.mathMl&&(S(we,k),S(Se,R),S(Se,M))),e.ADD_TAGS&&(we===xe&&(we=C(we)),S(we,e.ADD_TAGS)),e.ADD_ATTR&&(Se===Ce&&(Se=C(Se)),S(Se,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&S(Ge,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(He===Be&&(He=C(He)),S(He,e.FORBID_CONTENTS)),Ue&&(we["#text"]=!0),Le&&S(we,["html","head","body"]),we.table&&(S(we,["tbody"]),delete Oe.tbody),o&&o(e),Qe=e)},nt=S({},["mi","mo","mn","ms","mtext"]),rt=S({},["foreignobject","desc","title","annotation-xml"]),it=S({},E);S(it,j),S(it,T);var ot=S({},k);S(ot,L);var st=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Ve,tagName:"template"});var n=g(e.tagName),r=g(t.tagName);if(e.namespaceURI===Ke)return t.namespaceURI===Ve?"svg"===n:t.namespaceURI===Ze?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(it[n]);if(e.namespaceURI===Ze)return t.namespaceURI===Ve?"math"===n:t.namespaceURI===Ke?"math"===n&&rt[r]:Boolean(ot[n]);if(e.namespaceURI===Ve){if(t.namespaceURI===Ke&&!rt[r])return!1;if(t.namespaceURI===Ze&&!nt[r])return!1;var i=S({},["title","style","font","a","script"]);return!ot[n]&&(i[n]||!it[n])}return!1},at=function(e){f(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=oe}catch(t){e.remove()}}},ct=function(e,t){try{f(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Se[e])if(Pe||Re)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},lt=function(e){var t=void 0,n=void 0;if(Fe)e=""+e;else{var r=m(e,/^[\r\n\t ]+/);n=r&&r[0]}var o=ie?ie.createHTML(e):e;if(Ye===Ve)try{t=(new V).parseFromString(o,"text/html")}catch(e){}if(!t||!t.documentElement){t=ae.createDocument(Ye,"template",null);try{t.documentElement.innerHTML=Xe?"":o}catch(e){}}var s=t.body||t.documentElement;return e&&n&&s.insertBefore(i.createTextNode(n),s.childNodes[0]||null),Ye===Ve?ue.call(t,Le?"html":"body")[0]:Le?t.documentElement:s},ut=function(e){return ce.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,null,!1)},dt=function(e){return!(e instanceof Z||e instanceof K||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof x&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)},ht=function(e){return"object"===(void 0===c?"undefined":W(c))?e instanceof c:e&&"object"===(void 0===e?"undefined":W(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},pt=function(e,t,r){pe[e]&&h(pe[e],(function(e){e.call(n,t,r,Qe)}))},ft=function(e){var t=void 0;if(pt("beforeSanitizeElements",e,null),dt(e))return at(e),!0;if(m(e.nodeName,/[\u0080-\uFFFF]/))return at(e),!0;var r=g(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:r,allowedTags:we}),!ht(e.firstElementChild)&&(!ht(e.content)||!ht(e.content.firstElementChild))&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return at(e),!0;if("select"===r&&b(/