[mod] client/simple: client plugins (#5406)

* [mod] client/simple: client plugins

Defines a new interface for client side *"plugins"* that coexist with server
side plugin system. Each plugin (e.g., `InfiniteScroll`) extends the base
`ts Plugin`. Client side plugins are independent and lazy‑loaded via `router.ts`
when their `load()` conditions are met. On each navigation request, all
applicable plugins are instanced.

Since these are client side plugins, we can only invoke them once DOM is fully
loaded. E.g. `Calculator` will not render a new `answer` block until fully
loaded and executed.

For some plugins, we might want to handle its availability in `settings.yml`
and toggle in UI, like we do for server side plugins. In that case, we extend
`py Plugin` instancing only the information and then checking client side if
[`settings.plugins`](https://github.com/inetol/searxng/blob/1ad832b1dc33f3f388da361ff2459b05dc86a164/client/simple/src/js/toolkit.ts#L134)
array has the plugin id.

* [mod] client/simple: rebuild static
This commit is contained in:
Ivan Gabaldon
2025-12-02 10:18:00 +00:00
committed by GitHub
parent ab8224c939
commit fb089ae297
92 changed files with 962 additions and 881 deletions
+70 -61
View File
@@ -1,107 +1,116 @@
{
"_chunk.min.js": {
"file": "js/chunk.min.js",
"name": "chunk"
"_13gvpunf.min.js": {
"file": "chunk/13gvpunf.min.js",
"name": "assertelement"
},
"node_modules/ol/ol.css": {
"file": "css/ol.min.css",
"name": "ol.css",
"names": [
"ol.css"
],
"src": "node_modules/ol/ol.css",
"isEntry": true
"_gZqIRpW1.min.js": {
"file": "chunk/gZqIRpW1.min.js",
"name": "getelement",
"imports": [
"_13gvpunf.min.js"
]
},
"src/js/core/index.ts": {
"file": "js/searxng.core.min.js",
"name": "searxng.core",
"src": "src/js/core/index.ts",
"src/js/index.ts": {
"file": "sxng-core.min.js",
"name": "core",
"src": "src/js/index.ts",
"isEntry": true,
"dynamicImports": [
"src/js/plugin/MapView.ts",
"src/js/plugin/InfiniteScroll.ts",
"src/js/plugin/Calculator.ts",
"src/js/main/keyboard.ts",
"src/js/main/search.ts",
"src/js/main/autocomplete.ts",
"src/js/main/mapresult.ts",
"src/js/main/results.ts",
"src/js/main/infinite_scroll.ts",
"src/js/main/preferences.ts"
]
},
"src/js/main/autocomplete.ts": {
"file": "js/autocomplete.min.js",
"file": "chunk/KPZlR0ib.min.js",
"name": "autocomplete",
"src": "src/js/main/autocomplete.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
]
},
"src/js/main/infinite_scroll.ts": {
"file": "js/infinite_scroll.min.js",
"name": "infinite_scroll",
"src": "src/js/main/infinite_scroll.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
"src/js/index.ts",
"_13gvpunf.min.js"
]
},
"src/js/main/keyboard.ts": {
"file": "js/keyboard.min.js",
"file": "chunk/Db5v-hxx.min.js",
"name": "keyboard",
"src": "src/js/main/keyboard.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
]
},
"src/js/main/mapresult.ts": {
"file": "js/mapresult.min.js",
"name": "mapresult",
"src": "src/js/main/mapresult.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
],
"dynamicImports": [
"src/js/pkg/ol.ts"
"src/js/index.ts",
"_13gvpunf.min.js"
]
},
"src/js/main/preferences.ts": {
"file": "js/preferences.min.js",
"file": "chunk/CyyZ9XJS.min.js",
"name": "preferences",
"src": "src/js/main/preferences.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
"src/js/index.ts",
"_13gvpunf.min.js"
]
},
"src/js/main/results.ts": {
"file": "js/results.min.js",
"file": "chunk/Q2SRo2ED.min.js",
"name": "results",
"src": "src/js/main/results.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
"src/js/index.ts",
"_13gvpunf.min.js"
]
},
"src/js/main/search.ts": {
"file": "js/search.min.js",
"file": "chunk/DxJxX49r.min.js",
"name": "search",
"src": "src/js/main/search.ts",
"isDynamicEntry": true,
"imports": [
"src/js/core/index.ts"
"src/js/index.ts",
"_13gvpunf.min.js",
"_gZqIRpW1.min.js"
]
},
"src/js/pkg/ol.ts": {
"file": "js/ol.min.js",
"name": "ol",
"src": "src/js/pkg/ol.ts",
"isEntry": true
"src/js/plugin/Calculator.ts": {
"file": "chunk/CHkLfdMs.min.js",
"name": "calculator",
"src": "src/js/plugin/Calculator.ts",
"isDynamicEntry": true,
"imports": [
"src/js/index.ts",
"_13gvpunf.min.js",
"_gZqIRpW1.min.js"
]
},
"src/js/plugin/InfiniteScroll.ts": {
"file": "chunk/DBO1tjH7.min.js",
"name": "infinitescroll",
"src": "src/js/plugin/InfiniteScroll.ts",
"isDynamicEntry": true,
"imports": [
"src/js/index.ts",
"_13gvpunf.min.js",
"_gZqIRpW1.min.js"
]
},
"src/js/plugin/MapView.ts": {
"file": "chunk/BAcZkB_P.min.js",
"name": "mapview",
"src": "src/js/plugin/MapView.ts",
"isDynamicEntry": true,
"imports": [
"src/js/index.ts"
]
},
"src/less/rss.less": {
"file": "css/rss.min.css",
"name": "rss.css",
"file": "sxng-rss.min.css",
"name": "rss",
"names": [
"rss.css"
],
@@ -109,19 +118,19 @@
"isEntry": true
},
"src/less/style-ltr.less": {
"file": "css/searxng-ltr.min.css",
"name": "searxng-ltr.css",
"file": "sxng-ltr.min.css",
"name": "ltr",
"names": [
"searxng-ltr.css"
"ltr.css"
],
"src": "src/less/style-ltr.less",
"isEntry": true
},
"src/less/style-rtl.less": {
"file": "css/searxng-rtl.min.css",
"name": "searxng-rtl.css",
"file": "sxng-rtl.min.css",
"name": "rtl",
"names": [
"searxng-rtl.css"
"rtl.css"
],
"src": "src/less/style-rtl.less",
"isEntry": true