diff options
| author | dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> | 2026-01-09 11:15:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-09 11:15:14 +0100 |
| commit | a684b91fe7024800436f2e0880e658ada852f42d (patch) | |
| tree | 7da1ba9e8e0a4a276db4b5a3cd7880ae5f36050a /searx/static/themes/simple/sxng-core.min.js.map | |
| parent | 27d965234a1d10df7d2499e7ce5a0dbffbd60d64 (diff) | |
[upd] web-client (simple): Bump vite from 8.0.0-beta.5 to 8.0.0-beta.7 in /client/simple (#5649)
* [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.5 to 8.0.0-beta.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.7/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-version: 8.0.0-beta.7
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* [fix] themes: rebuild static
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
Diffstat (limited to 'searx/static/themes/simple/sxng-core.min.js.map')
| -rw-r--r-- | searx/static/themes/simple/sxng-core.min.js.map | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/searx/static/themes/simple/sxng-core.min.js.map b/searx/static/themes/simple/sxng-core.min.js.map index 7b4f78eec..67354d123 100644 --- a/searx/static/themes/simple/sxng-core.min.js.map +++ b/searx/static/themes/simple/sxng-core.min.js.map @@ -1 +1 @@ -{"version":3,"mappings":"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","names":["endpoint: EndpointsKeys","settings: Settings"],"ignoreList":[],"sources":["../../../../client/simple/src/js/Plugin.ts","../../../../client/simple/src/js/toolkit.ts","../../../../client/simple/src/js/loader.ts","../../../../client/simple/src/js/router.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/**\n * Base class for client-side plugins.\n *\n * @remarks\n * Handle conditional loading of the plugin in:\n *\n * - client/simple/src/js/router.ts\n *\n * @abstract\n */\nexport abstract class Plugin {\n /**\n * Plugin name.\n */\n protected readonly id: string;\n\n /**\n * @remarks\n * Don't hold references of this instance outside the class.\n */\n protected constructor(id: string) {\n this.id = id;\n\n void this.invoke();\n }\n\n private async invoke(): Promise<void> {\n try {\n console.debug(`[PLUGIN] ${this.id}: Running...`);\n const result = await this.run();\n if (!result) return;\n\n console.debug(`[PLUGIN] ${this.id}: Running post-exec...`);\n // @ts-expect-error\n void (await this.post(result as NonNullable<Awaited<ReturnType<this[\"run\"]>>>));\n } catch (error) {\n console.error(`[PLUGIN] ${this.id}:`, error);\n } finally {\n console.debug(`[PLUGIN] ${this.id}: Done.`);\n }\n }\n\n /**\n * Plugin goes here.\n *\n * @remarks\n * The plugin is already loaded at this point. If you wish to execute\n * conditions to exit early, consider moving the logic to:\n *\n * - client/simple/src/js/router.ts\n *\n * ...to avoid unnecessarily loading this plugin on the client.\n */\n protected abstract run(): Promise<unknown>;\n\n /**\n * Post-execution hook.\n *\n * @remarks\n * The hook is only executed if `#run()` returns a truthy value.\n */\n // @ts-expect-error\n protected abstract post(result: NonNullable<Awaited<ReturnType<this[\"run\"]>>>): Promise<void>;\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport type { KeyBindingLayout } from \"./main/keyboard.ts\";\n\n// synced with searx/webapp.py get_client_settings\ntype Settings = {\n plugins?: string[];\n advanced_search?: boolean;\n autocomplete?: string;\n autocomplete_min?: number;\n doi_resolver?: string;\n favicon_resolver?: string;\n hotkeys?: KeyBindingLayout;\n method?: \"GET\" | \"POST\";\n query_in_title?: boolean;\n results_on_new_tab?: boolean;\n safesearch?: 0 | 1 | 2;\n search_on_category_select?: boolean;\n theme?: string;\n theme_static_path?: string;\n translations?: Record<string, string>;\n url_formatting?: \"pretty\" | \"full\" | \"host\";\n};\n\ntype HTTPOptions = {\n body?: BodyInit;\n timeout?: number;\n};\n\ntype ReadyOptions = {\n // all values must be truthy for the callback to be executed\n on?: (boolean | undefined)[];\n};\n\nexport type EndpointsKeys = keyof typeof Endpoints;\n\nexport const Endpoints = {\n index: \"index\",\n results: \"results\",\n preferences: \"preferences\",\n unknown: \"unknown\"\n} as const;\n\nexport const mutable = {\n closeDetail: undefined as (() => void) | undefined,\n scrollPageToSelected: undefined as (() => void) | undefined,\n selectImage: undefined as ((resultElement: HTMLElement) => void) | undefined,\n selectNext: undefined as ((openDetailView?: boolean) => void) | undefined,\n selectPrevious: undefined as ((openDetailView?: boolean) => void) | undefined\n};\n\nconst getEndpoint = (): EndpointsKeys => {\n const metaEndpoint = document.querySelector('meta[name=\"endpoint\"]')?.getAttribute(\"content\");\n\n if (metaEndpoint && metaEndpoint in Endpoints) {\n return metaEndpoint as EndpointsKeys;\n }\n\n return Endpoints.unknown;\n};\n\nconst getSettings = (): Settings => {\n const settings = document.querySelector(\"script[client_settings]\")?.getAttribute(\"client_settings\");\n if (!settings) return {};\n\n try {\n return JSON.parse(atob(settings));\n } catch (error) {\n console.error(\"Failed to load client_settings:\", error);\n return {};\n }\n};\n\nexport const http = async (method: string, url: string | URL, options?: HTTPOptions): Promise<Response> => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options?.timeout ?? 30_000);\n\n const res = await fetch(url, {\n body: options?.body,\n method: method,\n signal: controller.signal\n }).finally(() => clearTimeout(timeoutId));\n if (!res.ok) {\n throw new Error(res.statusText);\n }\n\n return res;\n};\n\nexport const listen = <K extends keyof DocumentEventMap, E extends HTMLElement>(\n type: string | K,\n target: string | Document | E,\n listener: (this: E, event: DocumentEventMap[K]) => void | Promise<void>,\n options?: AddEventListenerOptions\n): void => {\n if (typeof target !== \"string\") {\n target.addEventListener(type, listener as EventListener, options);\n return;\n }\n\n document.addEventListener(\n type,\n (event: Event) => {\n for (const node of event.composedPath()) {\n if (node instanceof HTMLElement && node.matches(target)) {\n try {\n listener.call(node as E, event as DocumentEventMap[K]);\n } catch (error) {\n console.error(error);\n }\n break;\n }\n }\n },\n options\n );\n};\n\nexport const ready = (callback: () => void, options?: ReadyOptions): void => {\n for (const condition of options?.on ?? []) {\n if (!condition) {\n return;\n }\n }\n\n if (document.readyState !== \"loading\") {\n callback();\n } else {\n listen(\"DOMContentLoaded\", document, callback, { once: true });\n }\n};\n\nexport const endpoint: EndpointsKeys = getEndpoint();\nexport const settings: Settings = getSettings();\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport type { Plugin } from \"./Plugin.ts\";\nimport { type EndpointsKeys, endpoint } from \"./toolkit.ts\";\n\ntype Options =\n | {\n on: \"global\";\n }\n | {\n on: \"endpoint\";\n where: EndpointsKeys[];\n };\n\nexport const load = <T extends Plugin>(instance: () => Promise<T>, options: Options): void => {\n if (!check(options)) return;\n\n void instance();\n};\n\nconst check = (options: Options): boolean => {\n // biome-ignore lint/style/useDefaultSwitchClause: options is typed\n switch (options.on) {\n case \"global\": {\n return true;\n }\n case \"endpoint\": {\n if (!options.where.includes(endpoint)) {\n // not on the expected endpoint\n return false;\n }\n\n return true;\n }\n }\n};\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { load } from \"./loader.ts\";\nimport { Endpoints, endpoint, listen, ready, settings } from \"./toolkit.ts\";\n\nready(() => {\n document.documentElement.classList.remove(\"no-js\");\n document.documentElement.classList.add(\"js\");\n\n listen(\"click\", \".close\", function (this: HTMLElement) {\n (this.parentNode as HTMLElement)?.classList.add(\"invisible\");\n });\n\n listen(\"click\", \".searxng_init_map\", async function (this: HTMLElement, event: Event) {\n event.preventDefault();\n this.classList.remove(\"searxng_init_map\");\n\n load(() => import(\"./plugin/MapView.ts\").then(({ default: Plugin }) => new Plugin(this)), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n });\n\n if (settings.plugins?.includes(\"infiniteScroll\")) {\n load(() => import(\"./plugin/InfiniteScroll.ts\").then(({ default: Plugin }) => new Plugin()), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n }\n\n if (settings.plugins?.includes(\"calculator\")) {\n load(() => import(\"./plugin/Calculator.ts\").then(({ default: Plugin }) => new Plugin()), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n }\n});\n\nready(\n () => {\n void import(\"./main/keyboard.ts\");\n void import(\"./main/search.ts\");\n\n if (settings.autocomplete) {\n void import(\"./main/autocomplete.ts\");\n }\n },\n { on: [endpoint === Endpoints.index] }\n);\n\nready(\n () => {\n void import(\"./main/keyboard.ts\");\n void import(\"./main/results.ts\");\n void import(\"./main/search.ts\");\n\n if (settings.autocomplete) {\n void import(\"./main/autocomplete.ts\");\n }\n },\n { on: [endpoint === Endpoints.results] }\n);\n\nready(\n () => {\n void import(\"./main/preferences.ts\");\n },\n { on: [endpoint === Endpoints.preferences] }\n);\n"],"file":"sxng-core.min.js"}
\ No newline at end of file +{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../client/simple/src/js/Plugin.ts","../../../../client/simple/src/js/toolkit.ts","../../../../client/simple/src/js/loader.ts","../../../../client/simple/src/js/router.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/**\n * Base class for client-side plugins.\n *\n * @remarks\n * Handle conditional loading of the plugin in:\n *\n * - client/simple/src/js/router.ts\n *\n * @abstract\n */\nexport abstract class Plugin {\n /**\n * Plugin name.\n */\n protected readonly id: string;\n\n /**\n * @remarks\n * Don't hold references of this instance outside the class.\n */\n protected constructor(id: string) {\n this.id = id;\n\n void this.invoke();\n }\n\n private async invoke(): Promise<void> {\n try {\n console.debug(`[PLUGIN] ${this.id}: Running...`);\n const result = await this.run();\n if (!result) return;\n\n console.debug(`[PLUGIN] ${this.id}: Running post-exec...`);\n // @ts-expect-error\n void (await this.post(result as NonNullable<Awaited<ReturnType<this[\"run\"]>>>));\n } catch (error) {\n console.error(`[PLUGIN] ${this.id}:`, error);\n } finally {\n console.debug(`[PLUGIN] ${this.id}: Done.`);\n }\n }\n\n /**\n * Plugin goes here.\n *\n * @remarks\n * The plugin is already loaded at this point. If you wish to execute\n * conditions to exit early, consider moving the logic to:\n *\n * - client/simple/src/js/router.ts\n *\n * ...to avoid unnecessarily loading this plugin on the client.\n */\n protected abstract run(): Promise<unknown>;\n\n /**\n * Post-execution hook.\n *\n * @remarks\n * The hook is only executed if `#run()` returns a truthy value.\n */\n // @ts-expect-error\n protected abstract post(result: NonNullable<Awaited<ReturnType<this[\"run\"]>>>): Promise<void>;\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport type { KeyBindingLayout } from \"./main/keyboard.ts\";\n\n// synced with searx/webapp.py get_client_settings\ntype Settings = {\n plugins?: string[];\n advanced_search?: boolean;\n autocomplete?: string;\n autocomplete_min?: number;\n doi_resolver?: string;\n favicon_resolver?: string;\n hotkeys?: KeyBindingLayout;\n method?: \"GET\" | \"POST\";\n query_in_title?: boolean;\n results_on_new_tab?: boolean;\n safesearch?: 0 | 1 | 2;\n search_on_category_select?: boolean;\n theme?: string;\n theme_static_path?: string;\n translations?: Record<string, string>;\n url_formatting?: \"pretty\" | \"full\" | \"host\";\n};\n\ntype HTTPOptions = {\n body?: BodyInit;\n timeout?: number;\n};\n\ntype ReadyOptions = {\n // all values must be truthy for the callback to be executed\n on?: (boolean | undefined)[];\n};\n\nexport type EndpointsKeys = keyof typeof Endpoints;\n\nexport const Endpoints = {\n index: \"index\",\n results: \"results\",\n preferences: \"preferences\",\n unknown: \"unknown\"\n} as const;\n\nexport const mutable = {\n closeDetail: undefined as (() => void) | undefined,\n scrollPageToSelected: undefined as (() => void) | undefined,\n selectImage: undefined as ((resultElement: HTMLElement) => void) | undefined,\n selectNext: undefined as ((openDetailView?: boolean) => void) | undefined,\n selectPrevious: undefined as ((openDetailView?: boolean) => void) | undefined\n};\n\nconst getEndpoint = (): EndpointsKeys => {\n const metaEndpoint = document.querySelector('meta[name=\"endpoint\"]')?.getAttribute(\"content\");\n\n if (metaEndpoint && metaEndpoint in Endpoints) {\n return metaEndpoint as EndpointsKeys;\n }\n\n return Endpoints.unknown;\n};\n\nconst getSettings = (): Settings => {\n const settings = document.querySelector(\"script[client_settings]\")?.getAttribute(\"client_settings\");\n if (!settings) return {};\n\n try {\n return JSON.parse(atob(settings));\n } catch (error) {\n console.error(\"Failed to load client_settings:\", error);\n return {};\n }\n};\n\nexport const http = async (method: string, url: string | URL, options?: HTTPOptions): Promise<Response> => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options?.timeout ?? 30_000);\n\n const res = await fetch(url, {\n body: options?.body,\n method: method,\n signal: controller.signal\n }).finally(() => clearTimeout(timeoutId));\n if (!res.ok) {\n throw new Error(res.statusText);\n }\n\n return res;\n};\n\nexport const listen = <K extends keyof DocumentEventMap, E extends HTMLElement>(\n type: string | K,\n target: string | Document | E,\n listener: (this: E, event: DocumentEventMap[K]) => void | Promise<void>,\n options?: AddEventListenerOptions\n): void => {\n if (typeof target !== \"string\") {\n target.addEventListener(type, listener as EventListener, options);\n return;\n }\n\n document.addEventListener(\n type,\n (event: Event) => {\n for (const node of event.composedPath()) {\n if (node instanceof HTMLElement && node.matches(target)) {\n try {\n listener.call(node as E, event as DocumentEventMap[K]);\n } catch (error) {\n console.error(error);\n }\n break;\n }\n }\n },\n options\n );\n};\n\nexport const ready = (callback: () => void, options?: ReadyOptions): void => {\n for (const condition of options?.on ?? []) {\n if (!condition) {\n return;\n }\n }\n\n if (document.readyState !== \"loading\") {\n callback();\n } else {\n listen(\"DOMContentLoaded\", document, callback, { once: true });\n }\n};\n\nexport const endpoint: EndpointsKeys = getEndpoint();\nexport const settings: Settings = getSettings();\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport type { Plugin } from \"./Plugin.ts\";\nimport { type EndpointsKeys, endpoint } from \"./toolkit.ts\";\n\ntype Options =\n | {\n on: \"global\";\n }\n | {\n on: \"endpoint\";\n where: EndpointsKeys[];\n };\n\nexport const load = <T extends Plugin>(instance: () => Promise<T>, options: Options): void => {\n if (!check(options)) return;\n\n void instance();\n};\n\nconst check = (options: Options): boolean => {\n // biome-ignore lint/style/useDefaultSwitchClause: options is typed\n switch (options.on) {\n case \"global\": {\n return true;\n }\n case \"endpoint\": {\n if (!options.where.includes(endpoint)) {\n // not on the expected endpoint\n return false;\n }\n\n return true;\n }\n }\n};\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { load } from \"./loader.ts\";\nimport { Endpoints, endpoint, listen, ready, settings } from \"./toolkit.ts\";\n\nready(() => {\n document.documentElement.classList.remove(\"no-js\");\n document.documentElement.classList.add(\"js\");\n\n listen(\"click\", \".close\", function (this: HTMLElement) {\n (this.parentNode as HTMLElement)?.classList.add(\"invisible\");\n });\n\n listen(\"click\", \".searxng_init_map\", async function (this: HTMLElement, event: Event) {\n event.preventDefault();\n this.classList.remove(\"searxng_init_map\");\n\n load(() => import(\"./plugin/MapView.ts\").then(({ default: Plugin }) => new Plugin(this)), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n });\n\n if (settings.plugins?.includes(\"infiniteScroll\")) {\n load(() => import(\"./plugin/InfiniteScroll.ts\").then(({ default: Plugin }) => new Plugin()), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n }\n\n if (settings.plugins?.includes(\"calculator\")) {\n load(() => import(\"./plugin/Calculator.ts\").then(({ default: Plugin }) => new Plugin()), {\n on: \"endpoint\",\n where: [Endpoints.results]\n });\n }\n});\n\nready(\n () => {\n void import(\"./main/keyboard.ts\");\n void import(\"./main/search.ts\");\n\n if (settings.autocomplete) {\n void import(\"./main/autocomplete.ts\");\n }\n },\n { on: [endpoint === Endpoints.index] }\n);\n\nready(\n () => {\n void import(\"./main/keyboard.ts\");\n void import(\"./main/results.ts\");\n void import(\"./main/search.ts\");\n\n if (settings.autocomplete) {\n void import(\"./main/autocomplete.ts\");\n }\n },\n { on: [endpoint === Endpoints.results] }\n);\n\nready(\n () => {\n void import(\"./main/preferences.ts\");\n },\n { on: [endpoint === Endpoints.preferences] }\n);\n"],"file":"sxng-core.min.js"}
\ No newline at end of file |