mirror of
https://github.com/logseq/logseq.git
synced 2026-05-01 01:16:27 +00:00
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:
67
libs/src/modules/LSPlugin.Experiments.ts
Normal file
67
libs/src/modules/LSPlugin.Experiments.ts
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user