summaryrefslogtreecommitdiff
path: root/client/simple/tools
diff options
context:
space:
mode:
Diffstat (limited to 'client/simple/tools')
-rw-r--r--client/simple/tools/img.ts (renamed from client/simple/tools/img.js)38
-rw-r--r--client/simple/tools/jinja_svg_catalog.ts (renamed from client/simple/tools/jinja_svg_catalog.js)105
-rw-r--r--client/simple/tools/plg.js44
-rw-r--r--client/simple/tools/plg.ts43
4 files changed, 114 insertions, 116 deletions
diff --git a/client/simple/tools/img.js b/client/simple/tools/img.ts
index 0b1b96ed8..db4e08645 100644
--- a/client/simple/tools/img.js
+++ b/client/simple/tools/img.ts
@@ -1,25 +1,26 @@
import fs from "node:fs";
import path from "node:path";
import sharp from "sharp";
+import type { Config } from "svgo";
import { optimize as svgo } from "svgo";
-/**
- * @typedef {object} Src2Dest - Mapping of src to dest
- * @property {string} src - Name of the source file.
- * @property {string} dest - Name of the destination file.
- */
+// Mapping of src to dest
+export type Src2Dest = {
+ // Name of the source file.
+ src: string;
+ // Name of the destination file.
+ dest: string;
+};
/**
* Convert a list of SVG files to PNG.
*
- * @param {Src2Dest[]} items - Array of SVG files (src: SVG, dest:PNG) to convert.
+ * @param items - Array of SVG files (src: SVG, dest:PNG) to convert.
*/
-async function svg2png(items) {
+export const svg2png = async (items: Src2Dest[]) => {
for (const item of items) {
try {
- fs.mkdir(path.dirname(item.dest), { recursive: true }, (err) => {
- if (err) throw err;
- });
+ fs.mkdirSync(path.dirname(item.dest), { recursive: true });
const info = await sharp(item.src)
.png({
@@ -35,23 +36,22 @@ async function svg2png(items) {
throw err;
}
}
-}
+};
/**
* Optimize SVG images for WEB.
*
- * @param {Src2Dest[]} items - Array of SVG files (src:SVG, dest:SVG) to optimize.
- * @param {import('svgo').Config} svgo_opts - Options passed to svgo.
+ * @param items - Array of SVG files (src:SVG, dest:SVG) to optimize.
+ * @param svgo_opts - Options passed to svgo.
*/
-async function svg2svg(items, svgo_opts) {
+export const svg2svg = (items: Src2Dest[], svgo_opts: Config) => {
for (const item of items) {
try {
- fs.mkdir(path.dirname(item.dest), { recursive: true }, (err) => {
- if (err) throw err;
- });
+ fs.mkdirSync(path.dirname(item.dest), { recursive: true });
const raw = fs.readFileSync(item.src, "utf8");
const opt = svgo(raw, svgo_opts);
+
fs.writeFileSync(item.dest, opt.data);
console.log(`[svg2svg] optimized: ${item.dest} -- src: ${item.src}`);
} catch (err) {
@@ -59,6 +59,4 @@ async function svg2svg(items, svgo_opts) {
throw err;
}
}
-}
-
-export { svg2png, svg2svg };
+};
diff --git a/client/simple/tools/jinja_svg_catalog.js b/client/simple/tools/jinja_svg_catalog.ts
index b7b0347b5..1fa1a6676 100644
--- a/client/simple/tools/jinja_svg_catalog.js
+++ b/client/simple/tools/jinja_svg_catalog.ts
@@ -2,55 +2,56 @@ import fs from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import { Edge } from "edge.js";
-import { optimize as svgo } from "svgo";
+import { type Config as SvgoConfig, optimize as svgo } from "svgo";
const __dirname = dirname(fileURLToPath(import.meta.url));
const __jinja_class_placeholder__ = "__jinja_class_placeholder__";
-// -- types
-
-/**
- * @typedef {object} IconSet - A set of icons
- * @property {object} set - Object of SVG icons, where property name is the
- * name of the icon and value is the src of the SVG (relative to base).
- * @property {string} base - Folder in which the SVG src files are located.
- * @property {import("svgo").Config} svgo_opts - svgo options for this set.
- */
-
-/**
- * @typedef {object} IconSVG - Mapping of icon name to SVG source file.
- * @property {string} name - Name of the icon isource file.
- * @property {string} src - Name of the destination file.
- * @property {import("svgo").Config} svgo_opts - Options passed to svgo.
- */
-
-/**
- * @typedef {object} JinjaMacro - Arguments to create a jinja macro
- * @property {string} name - Name of the jinja macro.
- * @property {string} class - SVG's class name (value of XML class attribute)
- */
-
-// -- functions
+// A set of icons
+export type IconSet = {
+ // Object of SVG icons, where property name is the name of the icon and value is the src of the SVG (relative to base)
+ set: Record<string, string>;
+ // Folder in which the SVG src files are located
+ base: string;
+ // svgo options for this set
+ svgo_opts: SvgoConfig;
+};
+
+// Mapping of icon name to SVG source file
+type IconSVG = {
+ // Name of the icon isource file
+ name: string;
+ // Name of the destination file
+ src: string;
+ // Options passed to svgo
+ svgo_opts: SvgoConfig;
+};
+
+// Arguments to create a jinja macro
+export type JinjaMacro = {
+ // Name of the jinja macro
+ name: string;
+ // SVG's class name (value of XML class attribute)
+ class: string;
+};
/**
* Generate a jinja template with a catalog of SVG icons that can be
- * used in in other HTML jinja templates.
+ * used in other HTML jinja templates.
*
- * @param {string} dest - filename of the generate jinja template.
- * @param {JinjaMacro} macros - Jinja macros to create.
- * @param {IconSVG[]} items - Array of SVG items.
+ * @param dest - filename of the generate jinja template.
+ * @param macros - Jinja macros to create.
+ * @param items - Array of SVG items.
*/
-
-function jinja_svg_catalog(dest, macros, items) {
- const svg_catalog = {};
+export const jinja_svg_catalog = (dest: string, macros: JinjaMacro[], items: IconSVG[]) => {
+ const svg_catalog: Record<string, string> = {};
const edge_template = resolve(__dirname, "jinja_svg_catalog.html.edge");
- items.forEach((item) => {
- /** @type {import("svgo").Config} */
- // JSON.stringify & JSON.parse are used to create a deep copy of the
- // item.svgo_opts object
- const svgo_opts = JSON.parse(JSON.stringify(item.svgo_opts));
- svgo_opts.plugins.push({
+ for (const item of items) {
+ // JSON.stringify & JSON.parse are used to create a deep copy of the item.svgo_opts object
+ const svgo_opts: SvgoConfig = JSON.parse(JSON.stringify(item.svgo_opts));
+
+ svgo_opts.plugins?.push({
name: "addClassesToSVGElement",
params: {
classNames: [__jinja_class_placeholder__]
@@ -60,12 +61,13 @@ function jinja_svg_catalog(dest, macros, items) {
try {
const raw = fs.readFileSync(item.src, "utf8");
const opt = svgo(raw, svgo_opts);
+
svg_catalog[item.name] = opt.data;
} catch (err) {
console.error(`ERROR: jinja_svg_catalog processing ${item.name} src: ${item.src} -- ${err}`);
throw err;
}
- });
+ }
fs.mkdir(dirname(dest), { recursive: true }, (err) => {
if (err) throw err;
@@ -85,35 +87,34 @@ function jinja_svg_catalog(dest, macros, items) {
fs.writeFileSync(dest, jinjatmpl);
console.log(`[jinja_svg_catalog] created: ${dest}`);
-}
+};
/**
* Calls jinja_svg_catalog for a collection of icon sets where each set has its
* own parameters.
*
- * @param {string} dest - filename of the generate jinja template.
- * @param {JinjaMacro} macros - Jinja macros to create.
- * @param {IconSet[]} sets - Array of SVG sets.
+ * @param dest - filename of the generate jinja template.
+ * @param macros - Jinja macros to create.
+ * @param sets - Array of SVG sets.
*/
-function jinja_svg_sets(dest, macros, sets) {
- /** @type IconSVG[] */
- const items = [];
- const all = [];
+export const jinja_svg_sets = (dest: string, macros: JinjaMacro[], sets: IconSet[]) => {
+ const items: IconSVG[] = [];
+ const all: string[] = [];
+
for (const obj of sets) {
for (const [name, file] of Object.entries(obj.set)) {
if (all.includes(name)) {
throw new Error(`ERROR: ${name} has already been defined`);
}
+
+ all.push(name);
items.push({
name: name,
src: resolve(obj.base, file),
svgo_opts: obj.svgo_opts
});
}
- jinja_svg_catalog(dest, macros, items);
}
-}
-
-// -- exports
-export { jinja_svg_sets, jinja_svg_catalog };
+ jinja_svg_catalog(dest, macros, items);
+};
diff --git a/client/simple/tools/plg.js b/client/simple/tools/plg.js
deleted file mode 100644
index 74e488fc4..000000000
--- a/client/simple/tools/plg.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Custom vite plugins to build the web-client components of the simple theme.
- *
- * HINT:
- *
- * This is an inital implementation for the migration of the build process
- * from grunt to vite. For fully support (vite: build & serve) more work is
- * needed.
- */
-
-import { svg2png, svg2svg } from "./img.js";
-
-/**
- * Vite plugin to convert a list of SVG files to PNG.
- *
- * @param {import('./img.js').Src2Dest[]} items - Array of SVG files (src: SVG, dest:PNG) to convert.
- */
-function plg_svg2png(items) {
- return {
- name: "searxng-simple-svg2png",
- apply: "build", // or 'serve'
- async writeBundle() {
- await svg2png(items);
- }
- };
-}
-
-/**
- * Vite plugin to optimize SVG images for WEB.
- *
- * @param {import('./img.js').Src2Dest[]} items - Array of SVG files (src:SVG, dest:SVG) to optimize.
- * @param {import('svgo').Config} svgo_opts - Options passed to svgo.
- */
-function plg_svg2svg(items, svgo_opts) {
- return {
- name: "searxng-simple-svg2png",
- apply: "build", // or 'serve'
- async writeBundle() {
- await svg2svg(items, svgo_opts);
- }
- };
-}
-
-export { plg_svg2png, plg_svg2svg };
diff --git a/client/simple/tools/plg.ts b/client/simple/tools/plg.ts
new file mode 100644
index 000000000..2db891d4f
--- /dev/null
+++ b/client/simple/tools/plg.ts
@@ -0,0 +1,43 @@
+/**
+ * Custom vite plugins to build the web-client components of the simple theme.
+ *
+ * HINT:
+ * This is an inital implementation for the migration of the build process
+ * from grunt to vite. For fully support (vite: build & serve) more work is
+ * needed.
+ */
+
+import type { Config } from "svgo";
+import type { Plugin } from "vite";
+import { type Src2Dest, svg2png, svg2svg } from "./img.ts";
+
+/**
+ * Vite plugin to convert a list of SVG files to PNG.
+ *
+ * @param items - Array of SVG files (src: SVG, dest:PNG) to convert.
+ */
+export const plg_svg2png = (items: Src2Dest[]): Plugin => {
+ return {
+ name: "searxng-simple-svg2png",
+ apply: "build",
+ async writeBundle() {
+ await svg2png(items);
+ }
+ };
+};
+
+/**
+ * Vite plugin to optimize SVG images for WEB.
+ *
+ * @param items - Array of SVG files (src:SVG, dest:SVG) to optimize.
+ * @param svgo_opts - Options passed to svgo.
+ */
+export const plg_svg2svg = (items: Src2Dest[], svgo_opts: Config): Plugin => {
+ return {
+ name: "searxng-simple-svg2svg",
+ apply: "build",
+ writeBundle() {
+ svg2svg(items, svgo_opts);
+ }
+ };
+};