1
0
mirror of https://github.com/tabler/tabler-icons.git synced 2025-09-02 18:33:18 +02:00

chore: use svgicons2svgfont, svg2ttf, ttf2woff, wawoff2 instead of webfont (#1312)

This commit is contained in:
anatawa12
2025-03-02 20:51:56 +09:00
committed by GitHub
parent a90ddb1fb2
commit 09761e4880
5 changed files with 220 additions and 168 deletions

View File

@@ -110,7 +110,7 @@
"release": true
}
},
"packageManager": "pnpm@7.17.0",
"packageManager": "pnpm@8.15.9",
"dependencies": {
"crypto-js": "^4.2.0"
}

View File

@@ -0,0 +1,73 @@
import fsPromises from 'node:fs/promises';
import {createReadStream} from 'node:fs';
import {SVGIcons2SVGFontStream} from "svgicons2svgfont";
/**
* @typedef {stream.Readable & { metadata?: import('svgicons2svgfont').FileMetadata }} Svgicons2svgfontStream
*/
/**
*
* @param name {string} name
* @return {import('svgicons2svgfont').FileMetadata}
*/
function getMetadataFromSvgName(name) {
// we process uUnicode-Name.svg
const firstHyphen = name.indexOf('-');
const unicode = name.slice(1, firstHyphen);
const iconName = name.slice(firstHyphen + 1, -4);
const unicodeChar = String.fromCodePoint(parseInt(unicode, 16));
return {
unicode: [unicodeChar],
name: iconName,
}
}
/**
*
* @param path {string} The directory contains SVG files
* @return {Promise<Svgicons2svgfontStream[]>}
*/
export async function loadSvgFiles(path) {
const svgFiles = await fsPromises.readdir(path).then(files => files.filter(file => file.endsWith('.svg')));
svgFiles.sort();
return svgFiles.map(file => {
/** @type {Svgicons2svgfontStream} */
const stream = createReadStream(`${path}/${file}`);
stream.metadata = getMetadataFromSvgName(file);
return stream;
});
}
/**
*
* @param svgStreams {Svgicons2svgfontStream[]} SVG files
* @return {Promise<string>}
*/
export async function buildSvgFont(svgStreams) {
const fontStream = new SVGIcons2SVGFontStream({
fontName: 'tabler-icons',
normalize: true,
fontHeight: 1000,
descent: 100,
ascent: 900,
fixedWidth: false,
});
const fontStreamPromise = new Promise((resolve, reject) => {
const buffers = [];
fontStream.on('data', chunk => buffers.push(chunk));
fontStream.on('finish', () => {
resolve(buffers.join(''));
});
fontStream.on('error', reject);
});
svgStreams.forEach(stream => {
fontStream.write(stream);
});
fontStream.end();
return await fontStreamPromise;
}

View File

@@ -1,12 +1,13 @@
import { webfont } from "webfont";
import * as fs from 'fs'
import * as fs from 'node:fs'
import template from 'lodash.template'
import { getPackageDir, getPackageJson, getAliases, types, asyncForEach, toPascalCase } from '../../../.build/helpers.mjs'
import {buildSvgFont, loadSvgFiles} from "./build-utilities.mjs";
import svg2ttf from "svg2ttf";
import ttf2woff from "ttf2woff";
import wawoff2 from "wawoff2";
const formats = ['ttf', 'woff', 'woff2']
const p = getPackageJson()
const DIR = getPackageDir('icons-webfont')
const fontHeight = 1000
const strokes = {
200: 1,
@@ -36,31 +37,26 @@ for (const strokeName in strokes) {
asyncForEach(types, async type => {
console.log(`Building ${strokeName} webfont for ${type} icons`)
await webfont({
files: `icons-outlined/${strokeName}/${type}/*.svg`,
fontName: 'tabler-icons',
prependUnicode: true,
formats,
normalize: true,
fontHeight,
descent: 100,
ascent: 900,
fixedWidth: false
})
.then((result) => {
formats.forEach(format => {
fs.writeFileSync(`${DIR}/dist/fonts/tabler-icons${strokeName !== "400" ? `-${strokeName}` : ''}${type !== 'all' ? `-${type}` : ''}.${format}`, result[format])
})
const svgFiles = await loadSvgFiles(`icons-outlined/${strokeName}/${type}`);
const svgFontFileSource = await buildSvgFont(svgFiles);
const ttfFile = Buffer.from(svg2ttf(svgFontFileSource).buffer);
const woffFile = Buffer.from(ttf2woff(ttfFile).buffer);
const woff2File = await wawoff2.compress(ttfFile);
const glyphs = result.glyphsData
.map(icon => icon.metadata)
const fileName = `tabler-icons${strokeName !== "400" ? `-${strokeName}` : ''}${type !== 'all' ? `-${type}` : ''}`;
//fs.writeFileSync(`${DIR}/dist/fonts/${fileName}.svg`, svgFontFileSource); // for debug
fs.writeFileSync(`${DIR}/dist/fonts/${fileName}.ttf`, ttfFile);
fs.writeFileSync(`${DIR}/dist/fonts/${fileName}.woff`, woffFile);
fs.writeFileSync(`${DIR}/dist/fonts/${fileName}.woff2`, woff2File);
const glyphs = svgFiles.map(f => f.metadata)
.sort(function (a, b) {
return ('' + a.name).localeCompare(b.name)
return a.name.localeCompare(b.name)
})
const options = {
name: `Tabler Icons ${strokeName}${type !== 'all' ? ` ${toPascalCase(type)}` : ''}`,
fileName: `tabler-icons${strokeName !== "400" ? `-${strokeName}` : ''}${type !== 'all' ? `-${type}` : ''}`,
name: `Tabler Icons${type !== 'all' ? ` ${toPascalCase(type)}` : ''}`,
fileName,
glyphs,
v: p.version,
aliases: (type === 'all' ? getAlliasesFlat() : aliases[type]) || {}
@@ -69,15 +65,11 @@ for (const strokeName in strokes) {
//scss
const compiled = template(fs.readFileSync(`${DIR}/.build/iconfont.scss`).toString())
const resultSCSS = compiled(options)
fs.writeFileSync(`${DIR}/dist/tabler-icons${strokeName !== "400" ? `-${strokeName}` : ''}${type !== 'all' ? `-${type}` : ''}.scss`, resultSCSS)
fs.writeFileSync(`${DIR}/dist/${fileName}.scss`, resultSCSS)
//html
const compiledHtml = template(fs.readFileSync(`${DIR}/.build/iconfont.html`).toString())
const resultHtml = compiledHtml(options)
fs.writeFileSync(`${DIR}/dist/tabler-icons${strokeName !== "400" ? `-${strokeName}` : ''}${type !== 'all' ? `-${type}` : ''}.html`, resultHtml)
})
.catch((error) => {
throw error;
});
fs.writeFileSync(`${DIR}/dist/${fileName}.html`, resultHtml)
})
}

View File

@@ -47,6 +47,9 @@
],
"devDependencies": {
"sass": "^1.71.1",
"webfont": "^11.2.26"
"svg2ttf": "^6.0.3",
"svgicons2svgfont": "^15.0.0",
"ttf2woff": "^3.0.0",
"wawoff2": "^2.0.1"
}
}

228
pnpm-lock.yaml generated
View File

@@ -306,9 +306,18 @@ importers:
sass:
specifier: ^1.71.1
version: 1.83.1
webfont:
specifier: ^11.2.26
version: 11.2.26
svg2ttf:
specifier: ^6.0.3
version: 6.0.3
svgicons2svgfont:
specifier: ^15.0.0
version: 15.0.0
ttf2woff:
specifier: ^3.0.0
version: 3.0.0
wawoff2:
specifier: ^2.0.1
version: 2.0.1
test/test-preact:
dependencies:
@@ -4323,6 +4332,12 @@ packages:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
dev: true
/@types/sax@1.2.7:
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
dependencies:
'@types/node': 22.10.5
dev: true
/@types/scheduler@0.23.0:
resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==}
dev: true
@@ -5091,6 +5106,7 @@ packages:
/braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
requiresBuild: true
dependencies:
fill-range: 7.1.1
dev: true
@@ -5643,6 +5659,11 @@ packages:
engines: {node: '>=14'}
dev: true
/commander@12.1.0:
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
engines: {node: '>=18'}
dev: true
/commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: true
@@ -6151,6 +6172,7 @@ packages:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
hasBin: true
requiresBuild: true
dev: true
/detect-newline@3.1.0:
@@ -6175,13 +6197,6 @@ packages:
htmlparser2: 3.10.1
dev: true
/dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
dependencies:
path-type: 4.0.0
dev: true
/doctypes@1.1.0:
resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==}
dev: true
@@ -7062,6 +7077,7 @@ packages:
/fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
requiresBuild: true
dependencies:
to-regex-range: 5.0.1
dev: true
@@ -7308,10 +7324,6 @@ packages:
engines: {node: '>=6.9.0'}
dev: true
/geometry-interfaces@1.1.4:
resolution: {integrity: sha512-qD6OdkT6NcES9l4Xx3auTpwraQruU7dARbQPVO71MKvkGYw5/z/oIiGymuFXrRaEQa5Y67EIojUpaLeGEa5hGA==}
dev: true
/get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -7434,6 +7446,19 @@ packages:
path-scurry: 1.11.1
dev: true
/glob@11.0.1:
resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==}
engines: {node: 20 || >=22}
hasBin: true
dependencies:
foreground-child: 3.3.0
jackspeak: 4.0.2
minimatch: 10.0.1
minipass: 7.1.2
package-json-from-dist: 1.0.1
path-scurry: 2.0.0
dev: true
/glob@7.1.7:
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
deprecated: Glob versions prior to v9 are no longer supported
@@ -7497,18 +7522,6 @@ packages:
gopd: 1.2.0
dev: true
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.3.3
ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
dev: true
/globby@14.0.1:
resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==}
engines: {node: '>=18'}
@@ -8159,6 +8172,7 @@ packages:
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
requiresBuild: true
dev: true
/is-finalizationregistry@1.1.1:
@@ -8202,6 +8216,7 @@ packages:
/is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
requiresBuild: true
dependencies:
is-extglob: 2.1.1
dev: true
@@ -8271,6 +8286,7 @@ packages:
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
requiresBuild: true
dev: true
/is-obj@2.0.0:
@@ -8434,10 +8450,6 @@ packages:
is-inside-container: 1.0.0
dev: true
/isarray@0.0.1:
resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
dev: true
/isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: true
@@ -8491,6 +8503,13 @@ packages:
'@pkgjs/parseargs': 0.11.0
dev: true
/jackspeak@4.0.2:
resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==}
engines: {node: 20 || >=22}
dependencies:
'@isaacs/cliui': 8.0.2
dev: true
/jake@10.9.2:
resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
engines: {node: '>=10'}
@@ -9033,6 +9052,11 @@ packages:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
dev: true
/lru-cache@11.0.2:
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
engines: {node: 20 || >=22}
dev: true
/lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
dependencies:
@@ -9496,6 +9520,7 @@ packages:
/micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
requiresBuild: true
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -9572,6 +9597,13 @@ packages:
engines: {node: '>=4'}
dev: true
/minimatch@10.0.1:
resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
engines: {node: 20 || >=22}
dependencies:
brace-expansion: 2.0.1
dev: true
/minimatch@3.0.8:
resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
dependencies:
@@ -9800,12 +9832,6 @@ packages:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
dev: true
/neatequal@1.0.0:
resolution: {integrity: sha512-sVt5awO4a4w24QmAthdrCPiVRW3naB8FGLdyadin01BH+6BzNPEBwGrpwCczQvPlULS6uXTItTe1PJ5P0kYm7A==}
dependencies:
varstream: 0.3.2
dev: true
/negotiator@0.6.3:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
@@ -10457,6 +10483,10 @@ packages:
netmask: 2.0.2
dev: true
/package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
dev: true
/package-json@8.1.1:
resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
engines: {node: '>=14.16'}
@@ -10658,13 +10688,16 @@ packages:
minipass: 7.1.2
dev: true
/path-to-regexp@6.3.0:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
/path-scurry@2.0.0:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22}
dependencies:
lru-cache: 11.0.2
minipass: 7.1.2
dev: true
/path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
/path-to-regexp@6.3.0:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
dev: true
/path-type@5.0.0:
@@ -10708,6 +10741,7 @@ packages:
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
requiresBuild: true
dev: true
/picomatch@4.0.2:
@@ -11306,15 +11340,6 @@ packages:
type-fest: 0.6.0
dev: true
/readable-stream@1.1.14:
resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
dependencies:
core-util-is: 1.0.3
inherits: 2.0.4
isarray: 0.0.1
string_decoder: 0.10.31
dev: true
/readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
dependencies:
@@ -11553,11 +11578,6 @@ packages:
engines: {node: '>=4'}
dev: true
/resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
dev: true
/resolve-package-path@3.1.0:
resolution: {integrity: sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA==}
engines: {node: 10.* || >= 12}
@@ -12537,10 +12557,6 @@ packages:
es-object-atoms: 1.0.0
dev: true
/string_decoder@0.10.31:
resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
dev: true
/string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
@@ -12765,9 +12781,11 @@ packages:
- debug
dev: true
/svg-pathdata@6.0.3:
resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==}
engines: {node: '>=12.0.0'}
/svg-pathdata@7.1.0:
resolution: {integrity: sha512-wrvKHXZSYZyODOj5E1l1bMTIo8sR7YCH0E4SA8IgLgMsZq4RypslpYvNSsrdg4ThD6du2KWPyVeKinkqUelGhg==}
engines: {node: '>=20.11.1'}
dependencies:
yerror: 8.0.0
dev: true
/svg2ttf@6.0.3:
@@ -12782,18 +12800,21 @@ packages:
svgpath: 2.6.0
dev: true
/svgicons2svgfont@10.0.6:
resolution: {integrity: sha512-fUgQEVg3XwTbOHvlXahHGqCet5Wvfo1bV4DCvbSRvjsOCPCRunYbG4dUJCPegps37BMph3eOrfoobhH5AWuC6A==}
engines: {node: '>=12.0.0'}
/svgicons2svgfont@15.0.0:
resolution: {integrity: sha512-X5iL08aZJRKwYAGcl6ykQg0T6ce8yGpLdccqMXp6mreObpSdjlME9dRKPFIvFWX9/KTvPFAuYnX1gCaqjw7QUA==}
engines: {node: '>=20.11.1'}
hasBin: true
dependencies:
commander: 7.2.0
geometry-interfaces: 1.1.4
glob: 7.2.3
neatequal: 1.0.0
readable-stream: 3.6.2
'@types/sax': 1.2.7
commander: 12.1.0
debug: 4.4.0
glob: 11.0.1
sax: 1.4.1
svg-pathdata: 6.0.3
svg-pathdata: 7.1.0
transformation-matrix-js: 2.7.6
yerror: 8.0.0
transitivePeerDependencies:
- supports-color
dev: true
/svgo@3.3.2:
@@ -12927,6 +12948,7 @@ packages:
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
requiresBuild: true
dependencies:
is-number: 7.0.0
dev: true
@@ -12961,6 +12983,11 @@ packages:
punycode: 2.3.1
dev: true
/transformation-matrix-js@2.7.6:
resolution: {integrity: sha512-1CxDIZmCQ3vA0GGnkdMQqxUXVm3xXAFmglPYRS1hr37LzSg22TC7QAWOT38OmdUvMEs/rqcnkFoAsqvzdiluDg==}
deprecated: Package no longer supported. Contact support@npmjs.com for more info.
dev: true
/trim-newlines@3.0.1:
resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
engines: {node: '>=8'}
@@ -12974,20 +13001,11 @@ packages:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
dev: true
/ttf2eot@2.0.0:
resolution: {integrity: sha512-U56aG2Ylw7psLOmakjemAzmpqVgeadwENg9oaDjaZG5NYX4WB6+7h74bNPcc+0BXsoU5A/XWiHabDXyzFOmsxQ==}
/ttf2woff@3.0.0:
resolution: {integrity: sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==}
hasBin: true
dependencies:
argparse: 1.0.10
microbuffer: 1.0.0
dev: true
/ttf2woff@2.0.2:
resolution: {integrity: sha512-X68badwBjAy/+itU49scLjXUL094up+rHuYk+YAOTTBYSUMOmLZ7VyhZJuqQESj1gnyLAC2/5V8Euv+mExmyPA==}
hasBin: true
dependencies:
argparse: 1.0.10
microbuffer: 1.0.0
argparse: 2.0.1
pako: 1.0.11
dev: true
@@ -13408,14 +13426,6 @@ packages:
semver: 7.6.3
dev: true
/varstream@0.3.2:
resolution: {integrity: sha512-OpR3Usr9dGZZbDttlTxdviGdxiURI0prX68+DuaN/JfIDbK9ZOmREKM6PgmelsejMnhgjXmEEEgf+E4NbsSqMg==}
engines: {node: '>=0.10.*'}
hasBin: true
dependencies:
readable-stream: 1.1.14
dev: true
/vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
@@ -13680,29 +13690,6 @@ packages:
engines: {node: '>= 14'}
dev: true
/webfont@11.2.26:
resolution: {integrity: sha512-ms9abzcJGMBj5yVTpNfAcyQB0SNzmi10aBlKLC7kAt1TQ5eZqieRhvhxN1BrXaizWV0nksp6vLqBfaJmBWmF7Q==}
engines: {node: '>= 12.0.0'}
hasBin: true
dependencies:
cosmiconfig: 5.2.1
deepmerge: 4.3.1
globby: 11.1.0
meow: 9.0.0
nunjucks: 3.2.4(chokidar@3.6.0)
p-limit: 3.1.0
parse-json: 5.2.0
resolve-from: 5.0.0
svg2ttf: 6.0.3
svgicons2svgfont: 10.0.6
ttf2eot: 2.0.0
ttf2woff: 2.0.2
wawoff2: 2.0.1
xml2js: 0.4.23
transitivePeerDependencies:
- chokidar
dev: true
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: true
@@ -13993,14 +13980,6 @@ packages:
xml-lexer: 0.2.2
dev: true
/xml2js@0.4.23:
resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==}
engines: {node: '>=4.0.0'}
dependencies:
sax: 1.4.1
xmlbuilder: 11.0.1
dev: true
/xml2js@0.5.0:
resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
engines: {node: '>=4.0.0'}
@@ -14094,6 +14073,11 @@ packages:
yargs-parser: 21.1.1
dev: true
/yerror@8.0.0:
resolution: {integrity: sha512-FemWD5/UqNm8ffj8oZIbjWXIF2KE0mZssggYpdaQkWDDgXBQ/35PNIxEuz6/YLn9o0kOxDBNJe8x8k9ljD7k/g==}
engines: {node: '>=18.16.0'}
dev: true
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}