Enhance/more ns plugin api (#4828)

* improve(plugin): WIP add settings schema

* improve(plugin): add identity for settings modal

* improve(plugin): WIP add settings input

* fix(ui): scrollbar overlay of modal panel content

* improve(plugin): WIP add more render types of setting item

* improve(plugin): WIP polish settings items

* improve(plugin): WIP settings list of plugins

* improve(plugin): more settings types & polish releated ui

* fix(plugin): sometimes disable plugin not work

* improve(plugin): polish ui of plugin settings

* fix(dev): warning of lint

* improve(plugin): add api of settings changed

* chore: build libs core

* fix(ui): width of settings panel wrap

* improve(plugin): separate layouts data from settings aio file

* imporve(plugin): container size of single plugin settings

* fix: add missing state

* improve(plugin): add Git ns

* improve(plugin): git related api

* improve(api): type of git result

* chore: build libs core

* fix(dev): kondo lint

* fix(plugin): use cdn sdk when js entry

* chore: build libs core

* fix(plugin): env condition

* improve(plugin): add UI ns

* fix(api): arguments of datascript query

* enhance(api): manageable message instance of UI tools

* enhance(api): WIP add experiments api

* enhance(api): WIP add resources state of plugin

* improve(plugin): add status of loading script resources

* improve(plugin): more opts for script loader

* improve(plugin): WIP add fenced code renderer hook

* improve(plugin): fenced code renderer hook

* fix(plugin): resource root path of plugin fs location

* imporve(plugin): support local files for loading scripts

* improve(plugin): types of expirements api

* fix: typo of class

* enhance(api): add namespace related apis

* enhance(api): add linked refrences related apis

* enhance(plugin): add sample links to related api comments

* improve(plugin): add db changed hook & optimize strategy of caller for hooks

* improve(plugin): compatible commands registration for old sdk

* improve(plugin): collect user sdk version for plugin local

* improve(plugin): add internal callable apis for user sdk

* chore(plugin): missing files & bump libs version

* improve(plugin): compatiable for old sdk about hook messaging optimization

* improve(plugin): db hook optimization for old sdk

* enhance(ux): auto focus searchbar when open plugins list

* improve(plugin): api of a hook from specific block changed event

* improve(plugin): api of db block change hook

* improve(plugin): add show bracket user config of api

* improve(plugin): api of db block change hook

* fix(api): toggle collapsed of block

* improve(api): try to init grpah with git before exec git commands

* improve(plugin): attributes of sandbox container

* improve(dev): support register command with keybinding

* improve(plugin): add api of register shortcut command

* fix(plugin): reubild slash commands when new command registration

* fix(dev): lint

* improve(dev): lint script of libs codebase

* chore(dev): remove useless codes

* improve(plugin):sanitize path string of plugin repo value

* fix(plugin): rebuild commands list when unregister a plugin

* fix(ui): overflow width of query result table

* chore: rebuild libs core

* improve(plugin): add assets related apis

* chore: rebuild libs core

* improve(plugin): support replace state of into block in page api

* improve(plugin): prepend/append child block in page

* improve(plugin): polished exceptions message of plugin update/install

* fix(plugin): update settings within gui

* improve(ux): debounce change event of input for plugin settings gui

* chore: rebuild libs core

* enhance(plugin): catch exception of hook plugin
This commit is contained in:
Charlie
2022-04-21 18:43:16 +08:00
committed by GitHub
parent a87e5ea0fa
commit 79bc33e1e3
35 changed files with 3444 additions and 937 deletions

View File

@@ -0,0 +1,67 @@
import { LSPluginUser } from '../LSPlugin.user'
import { PluginLocal } from '../LSPlugin.core'
import { safeSnakeCase } from '../helpers'
/**
* Some experiment features
*/
export class LSPluginExperiments {
constructor(private ctx: LSPluginUser) {}
get React(): unknown {
return this.ensureHostScope().React
}
get ReactDOM(): unknown {
return this.ensureHostScope().ReactDOM
}
get pluginLocal(): PluginLocal {
return this.ensureHostScope().LSPluginCore.ensurePlugin(
this.ctx.baseInfo.id
)
}
private invokeExperMethod(type: string, ...args: Array<any>) {
const host = this.ensureHostScope()
type = safeSnakeCase(type)?.toLowerCase()
return host.logseq.api['exper_' + type]?.apply(host, args)
}
async loadScripts(...scripts: Array<string>) {
scripts = scripts.map((it) => {
if (!it?.startsWith('http')) {
return this.ctx.resolveResourceFullUrl(it)
}
return it
})
scripts.unshift(this.ctx.baseInfo.id)
await this.invokeExperMethod('loadScripts', ...scripts)
}
registerFencedCodeRenderer(
type: string,
opts: {
edit?: boolean
before?: () => Promise<void>
subs?: Array<string>
render: (props: { content: string }) => any
}
) {
return this.ensureHostScope().logseq.api.exper_register_fenced_code_renderer(
this.ctx.baseInfo.id,
type,
opts
)
}
ensureHostScope(): any {
if (window === top) {
throw new Error('Can not access host scope!')
}
return top
}
}

View File

@@ -1,15 +1,15 @@
import { LSPluginUser } from '../LSPlugin.user'
export interface IAsyncStorage {
getItem (key: string): Promise<string | undefined>
getItem(key: string): Promise<string | undefined>
setItem (key: string, value: string): Promise<void>
setItem(key: string, value: string): Promise<void>
removeItem (key: string): Promise<void>
removeItem(key: string): Promise<void>
hasItem (key: string): Promise<boolean>
hasItem(key: string): Promise<boolean>
clear (): Promise<void>
clear(): Promise<void>
}
/**
@@ -19,14 +19,12 @@ class LSPluginFileStorage implements IAsyncStorage {
/**
* @param ctx
*/
constructor (
private ctx: LSPluginUser
) {}
constructor(private ctx: LSPluginUser) {}
/**
* plugin id
*/
get ctxId () {
get ctxId() {
return this.ctx.baseInfo.id
}
@@ -34,54 +32,52 @@ class LSPluginFileStorage implements IAsyncStorage {
* @param key A string as file name that support nested directory
* @param value Storage value
*/
setItem (key: string, value: string): Promise<void> {
setItem(key: string, value: string): Promise<void> {
return this.ctx.caller.callAsync(`api:call`, {
method: 'write-plugin-storage-file',
args: [this.ctxId, key, value]
args: [this.ctxId, key, value],
})
}
/**
* @param key
*/
getItem (key: string): Promise<string | undefined> {
getItem(key: string): Promise<string | undefined> {
return this.ctx.caller.callAsync(`api:call`, {
method: 'read-plugin-storage-file',
args: [this.ctxId, key]
args: [this.ctxId, key],
})
}
/**
* @param key
*/
removeItem (key: string): Promise<void> {
removeItem(key: string): Promise<void> {
return this.ctx.caller.call(`api:call`, {
method: 'unlink-plugin-storage-file',
args: [this.ctxId, key]
args: [this.ctxId, key],
})
}
/**
* Clears the storage
*/
clear (): Promise<void> {
clear(): Promise<void> {
return this.ctx.caller.call(`api:call`, {
method: 'clear-plugin-storage-files',
args: [this.ctxId]
args: [this.ctxId],
})
}
/**
* @param key
*/
hasItem (key: string): Promise<boolean> {
hasItem(key: string): Promise<boolean> {
return this.ctx.caller.callAsync(`api:call`, {
method: 'exist-plugin-storage-file',
args: [this.ctxId, key]
args: [this.ctxId, key],
})
}
}
export {
LSPluginFileStorage
}
export { LSPluginFileStorage }