@fastkit/icon-font-gen 0.16.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.mts +0 -1
- package/dist/cli.mjs +2 -2
- package/dist/{generator-C4rLFFZ0.mjs → generator-BzNGBKOM.mjs} +11 -3
- package/dist/generator-BzNGBKOM.mjs.map +1 -0
- package/dist/icon-font-gen.d.mts +14 -5
- package/dist/icon-font-gen.mjs +1 -1
- package/package.json +8 -8
- package/dist/generator-C4rLFFZ0.mjs.map +0 -1
package/dist/cli.d.mts
CHANGED
package/dist/cli.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { c as IconFontGenError, i as generate, l as DEFAULT_CONFIG_FILENAME, u as DEFAULT_DEST_DIRNAME } from "./generator-
|
|
1
|
+
import { c as IconFontGenError, i as generate, l as DEFAULT_CONFIG_FILENAME, u as DEFAULT_DEST_DIRNAME } from "./generator-BzNGBKOM.mjs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { esbuildRequire, findPackageDir } from "@fastkit/node-util";
|
|
4
4
|
import { cac } from "cac";
|
|
5
5
|
//#region package.json
|
|
6
|
-
var version = "0.16.
|
|
6
|
+
var version = "0.16.2";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/cli.ts
|
|
9
9
|
async function cli() {
|
|
@@ -5,19 +5,27 @@ import chokidar from "chokidar";
|
|
|
5
5
|
import { EV } from "@fastkit/ev";
|
|
6
6
|
import { TinyLogger, createTinyError } from "@fastkit/tiny-logger";
|
|
7
7
|
//#region src/schemes.ts
|
|
8
|
+
/**
|
|
9
|
+
* Every format this package knows how to emit, in the order they are written to
|
|
10
|
+
* the `@font-face` `src` list. Only the formats actually requested through
|
|
11
|
+
* `formats` are generated, so appending to this list does not change the output
|
|
12
|
+
* of an existing configuration.
|
|
13
|
+
*/
|
|
8
14
|
const ICON_FONT_FORMATS = [
|
|
9
15
|
"eot",
|
|
10
16
|
"woff",
|
|
11
17
|
"woff2",
|
|
12
18
|
"svg",
|
|
13
|
-
"ttf"
|
|
19
|
+
"ttf",
|
|
20
|
+
"otf"
|
|
14
21
|
];
|
|
15
22
|
const ICON_FONT_FORMAT_MAP = {
|
|
16
23
|
eot: "embedded-opentype",
|
|
17
24
|
woff2: "woff2",
|
|
18
25
|
woff: "woff",
|
|
19
26
|
ttf: "truetype",
|
|
20
|
-
svg: "svg"
|
|
27
|
+
svg: "svg",
|
|
28
|
+
otf: "opentype"
|
|
21
29
|
};
|
|
22
30
|
async function resolveRawIconFontEntry(rootDir, rawEntry) {
|
|
23
31
|
const entry = { ...rawEntry };
|
|
@@ -289,4 +297,4 @@ var IconFontRunner = class extends EV {
|
|
|
289
297
|
//#endregion
|
|
290
298
|
export { generateEntry as a, IconFontGenError as c, ICON_FONT_FORMATS as d, ICON_FONT_FORMAT_MAP as f, generate as i, DEFAULT_CONFIG_FILENAME as l, resolveRawIconFontEntry as m, IconFontRunner as n, generateIndex as o, ceateIconFontConfig as p, IconFontRunnerItem as r, mergeDefaults as s, DEFAULT_OPTIONS as t, DEFAULT_DEST_DIRNAME as u };
|
|
291
299
|
|
|
292
|
-
//# sourceMappingURL=generator-
|
|
300
|
+
//# sourceMappingURL=generator-BzNGBKOM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-BzNGBKOM.mjs","names":[],"sources":["../src/schemes.ts","../src/logger.ts","../src/generator.ts"],"sourcesContent":["import type { webfont } from 'webfont';\nimport path from 'node:path';\nimport { installPackage } from '@fastkit/node-util';\n\n/**\n * Derived from webfont's public signature. webfont 12 added an `exports` map\n * that only publishes the package root, so its internal `dist` type paths are no\n * longer reachable. Tracking the upstream union means a format added there shows\n * up here as a missing key in {@link ICON_FONT_FORMAT_MAP}.\n */\nexport type IconFontFormat = NonNullable<\n NonNullable<Parameters<typeof webfont>[0]>['formats']\n>[number];\n\n/**\n * Every format this package knows how to emit, in the order they are written to\n * the `@font-face` `src` list. Only the formats actually requested through\n * `formats` are generated, so appending to this list does not change the output\n * of an existing configuration.\n */\nexport const ICON_FONT_FORMATS: IconFontFormat[] = [\n 'eot',\n 'woff',\n 'woff2',\n 'svg',\n 'ttf',\n 'otf',\n];\n\nexport const ICON_FONT_FORMAT_MAP: Record<IconFontFormat, string> = {\n eot: 'embedded-opentype',\n woff2: 'woff2',\n woff: 'woff',\n ttf: 'truetype',\n svg: 'svg',\n otf: 'opentype',\n};\n\nexport interface IconFontSettings {\n fixedWidth?: boolean;\n centerHorizontally?: boolean;\n normalize?: boolean;\n fontHeight?: number;\n round?: number;\n descent?: number;\n disablePrefix?: boolean;\n absolutePath?: boolean;\n addHashInFontUrl?: boolean;\n}\n\nexport interface IconFontEntry extends IconFontSettings {\n name: string;\n fontName: string;\n formats?: IconFontFormat[];\n startUnicode?: number;\n prefix: string;\n src: string;\n dest: string;\n display: 'block' | 'swap';\n}\n\nexport interface RawIconFontEntry extends Omit<\n IconFontEntry,\n 'name' | 'fontName' | 'prefix' | 'dest' | 'display'\n> {\n name?: string;\n fontName?: string;\n /**\n * @default block\n */\n display?: 'block' | 'swap';\n}\n\n// export type RawIconFontOptions = IconFontEntry | IconFontEntry[];\n\nexport interface IconFontOptions {\n entries: RawIconFontEntry[];\n dest: string;\n}\n\nexport async function resolveRawIconFontEntry(\n rootDir: string,\n rawEntry: RawIconFontEntry,\n): Promise<IconFontEntry> {\n const entry = {\n ...rawEntry,\n };\n\n // mdi support\n if (entry.src === '@mdi') {\n const installedDir = await findOrInstallMDI();\n entry.src = path.join(installedDir, 'svg');\n if (entry.fontHeight == null) {\n entry.fontHeight = 512;\n }\n if (entry.descent == null) {\n entry.descent = 64;\n }\n if (entry.name == null) {\n entry.name = 'mdi';\n }\n }\n\n const name = entry.name || path.basename(entry.src);\n const fontName = entry.fontName || `${name}-icon`;\n const dest = path.join(rootDir, name);\n const prefix = entry.disablePrefix ? '' : `${name}-`;\n const display = entry.display || 'block';\n return {\n ...entry,\n name,\n fontName,\n prefix,\n dest,\n display,\n };\n}\n\nfunction findOrInstallMDI() {\n return installPackage('@mdi/svg', { dev: true });\n}\n\nexport const DEFAULT_CONFIG_FILENAME = 'icon-font.config';\n\nexport const DEFAULT_DEST_DIRNAME = '.icon-font';\n\nexport interface IconFontConfig extends Omit<IconFontOptions, 'dest'> {\n dest?: string;\n}\n\nexport function ceateIconFontConfig(options: IconFontConfig) {\n return options;\n}\n","import { TinyLogger, createTinyError } from '@fastkit/tiny-logger';\n\nconst name = 'icon-font-gen';\n\nexport const logger = new TinyLogger(name);\n\nexport const IconFontGenError = createTinyError(name);\n","import fs from 'fs-extra';\nimport path from 'node:path';\nimport chokidar, { FSWatcher } from 'chokidar';\nimport { EV } from '@fastkit/ev';\nimport { HashComparator } from '@fastkit/node-util';\nimport { UnPromisify } from '@fastkit/helpers';\nimport type webfont from 'webfont';\nimport { logger } from './logger';\nimport {\n IconFontOptions,\n IconFontEntry,\n RawIconFontEntry,\n resolveRawIconFontEntry,\n ICON_FONT_FORMATS,\n IconFontFormat,\n ICON_FONT_FORMAT_MAP,\n} from './schemes';\n\nexport type IconFontEntryResult = {\n entry: IconFontEntry;\n result?: UnPromisify<ReturnType<typeof webfont>>;\n};\n\nexport const DEFAULT_OPTIONS: Partial<IconFontEntry> = {\n formats: ['woff2'],\n fixedWidth: true,\n normalize: true,\n};\n\nconst BANNER = `\n/**\n * This is auto generated file.\n * Do not edit !!!\n *\n * @see: https://github.com/dadajam4/fastkit/tree/main/packages/icon-font-gen\n */\n`.trim();\n\nexport function mergeDefaults(entry: IconFontEntry): IconFontEntry {\n return {\n ...DEFAULT_OPTIONS,\n ...entry,\n };\n}\n\nasync function generateTS(entry: IconFontEntry, ids: string[]) {\n const code = `\n/* eslint-disable */\n// @ts-nocheck\n${BANNER}\nimport type { IconName, IconNameMap } from '@fastkit/icon-font';\nimport { registerIconNames } from '@fastkit/icon-font';\ndeclare module \"@fastkit/icon-font\" {\n export interface IconNameMap {\n${ids.map((id) => ` '${id}': true,`).join('\\n')}\n }\n}\nexport const ICON_NAMES = registerIconNames([\n ${ids.map((id) => `'${id}'`).join(',\\n ')}\n]);\nexport type { IconName, IconNameMap } from '@fastkit/icon-font';\n `.trim();\n const fileName = `${entry.name || 'icons'}.ts`;\n const dest = path.resolve(entry.dest, fileName);\n await fs.writeFile(dest, code);\n return {\n fileName,\n dest,\n code,\n };\n}\n\nexport async function generateEntry(\n entry: IconFontEntry,\n): Promise<IconFontEntryResult> {\n const options = mergeDefaults(entry);\n\n // @TODO support empty prefix\n // const namePrefix = options.name;\n const cssPrefix = `icon-${options.prefix}`;\n\n const hash = new HashComparator(options.src, options.dest);\n const srcHash = await hash.hasChanged();\n if (!srcHash) {\n logger.info(`Has not changed files. Skip process. >>> ${options.src}`);\n return { entry };\n }\n\n await fs.ensureDir(options.dest);\n\n const { webfont } = await import('webfont');\n\n // const { startUnicode = 0xea01 } = options;\n const { startUnicode = 0xba01 } = options;\n\n let i = startUnicode;\n\n const result = await webfont({\n files: options.src,\n fontName: options.fontName,\n formats: options.formats,\n fixedWidth: options.fixedWidth,\n centerHorizontally: options.centerHorizontally,\n normalize: options.normalize,\n fontHeight: options.fontHeight,\n round: options.round,\n descent: options.descent,\n addHashInFontUrl: options.addHashInFontUrl,\n glyphTransformFn: (obj) => {\n const char = String.fromCodePoint(i);\n obj.unicode = [char];\n i++;\n return obj;\n },\n });\n\n const buildedFormats: { format: IconFontFormat; code: string | Buffer }[] =\n [];\n ICON_FONT_FORMATS.forEach((format) => {\n const code = result[format];\n if (code) {\n buildedFormats.push({ format, code });\n }\n });\n\n await Promise.all(\n buildedFormats.map(({ format, code }) =>\n fs.writeFile(\n path.join(options.dest, `${options.name}.${format}`),\n code as string | Uint8Array,\n ),\n ),\n );\n\n const glyphs: { name: string; code: string }[] = [];\n\n result.glyphsData!.forEach(({ metadata }) => {\n if (!metadata) return;\n const { name, unicode } = metadata;\n if (!unicode) {\n return;\n }\n\n const code = unicode[0].charCodeAt(0).toString(16);\n glyphs.push({ name, code });\n });\n\n const urlPath = options.absolutePath ? options.dest : '.';\n const hashSuffix = options.addHashInFontUrl ? `?${Date.now()}` : '';\n const src = buildedFormats\n .map(\n ({ format }) =>\n `url(\"${urlPath}/${options.name}.${format}${hashSuffix}\") format(\"${ICON_FONT_FORMAT_MAP[format]}\")`,\n )\n .join(',');\n\n const cssCode = `/* stylelint-disable */\n@font-face {\n font-family: \"${options.fontName}\";\n font-display: ${options.display};\n font-style: normal;\n font-weight: 400;\n src: ${src};\n}\n\ni[class^=\"${cssPrefix}\"]:before, i[class*=\" ${cssPrefix}\"]:before {\n font-family: ${options.fontName} !important;\n font-style: normal;\n font-weight: normal !important;\n font-variant: normal;\n text-transform: none;\n text-rendering: auto;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n${glyphs\n .map(\n ({ name, code }) => `\n.${cssPrefix}${name}:before { content: \"\\\\${code}\"; }\n `,\n )\n .join('\\n')}\n `;\n await fs.writeFile(path.join(options.dest, `${options.name}.css`), cssCode);\n\n // const prefix = options.prefix ? `${options.prefix}-` : '';\n const ids = glyphs.map(({ name }) => `${options.prefix}${name}`);\n await generateTS(options, ids);\n await hash.commit(srcHash);\n return {\n entry,\n result,\n };\n}\n\nexport async function generateIndex(dest: string, entries: IconFontEntry[]) {\n const names = entries.map(({ name }) => name);\n const tsCode = `\n/* eslint-disable */\n// @ts-nocheck\nimport './index.css';\n${BANNER}\n${names\n .map(\n (name, index) =>\n // `import { IconName as IconName_${index}, IconNameMap as IconNameMap_${index} } from './${name}/${name}';`,\n `import './${name}/${name}';`,\n )\n .join('\\n')}\nexport type { IconName } from '@fastkit/icon-font';\nexport { ICON_NAMES } from '@fastkit/icon-font';\n `.trim();\n const tsDest = path.join(dest, 'index.ts');\n await fs.writeFile(tsDest, tsCode);\n\n const cssCode = `\n/* stylelint-disable */\n${BANNER}\n${names.map((name) => `@import './${name}/${name}.css';`).join('\\n')}\n `.trim();\n const cssDest = path.join(dest, 'index.css');\n await fs.writeFile(cssDest, cssCode);\n}\n\nexport async function generate(opts: IconFontOptions) {\n await fs.emptyDir(opts.dest);\n const results = await Promise.all(\n opts.entries.map((entry) =>\n resolveRawIconFontEntry(opts.dest, entry).then((_entry) =>\n generateEntry(_entry),\n ),\n ),\n );\n const entries = results.map(({ entry }) => entry);\n await generateIndex(opts.dest, entries);\n}\n\nexport class IconFontRunnerItem extends EV<{\n build: IconFontEntryResult;\n}> {\n readonly entry: RawIconFontEntry;\n\n readonly ctx: IconFontRunner;\n\n private _resolveEntryPromise?: Promise<IconFontEntry>;\n\n private _watcher: FSWatcher | null = null;\n\n watchMode: boolean;\n\n // get name() {\n // return this.entry.name;\n // }\n\n constructor(ctx: IconFontRunner, entry: RawIconFontEntry, watch = false) {\n super();\n this.ctx = ctx;\n this.entry = entry;\n this.watchMode = watch;\n this.build = this.build.bind(this);\n }\n\n async run() {\n const result = await this.build();\n if (this.watchMode && !this._watcher) {\n const watchDir = path.resolve(this.entry.src);\n this._watcher = chokidar.watch(watchDir, { ignoreInitial: true });\n this._watcher.on('all', this.build);\n }\n return result;\n }\n\n resolveEntry() {\n if (!this._resolveEntryPromise) {\n this._resolveEntryPromise = resolveRawIconFontEntry(\n this.ctx.dest,\n this.entry,\n );\n }\n return this._resolveEntryPromise;\n }\n\n async build() {\n const entry = await this.resolveEntry();\n const result = await generateEntry(entry);\n this.emit('build', result);\n return { entry };\n }\n\n destroy() {\n if (this._watcher) {\n this._watcher.close();\n this._watcher = null;\n }\n this.offAll();\n if (this.ctx) {\n delete (this as any).ctx;\n }\n }\n}\n\nexport class IconFontRunner extends EV<{\n build: {\n item: IconFontRunnerItem;\n result: IconFontEntryResult;\n };\n}> {\n readonly items: IconFontRunnerItem[] = [];\n\n readonly dest: string;\n\n constructor(opts: IconFontOptions, watch?: boolean) {\n super();\n\n this.dest = opts.dest;\n\n opts.entries.forEach((entry) => {\n const item = new IconFontRunnerItem(this, entry, watch);\n item.on('build', (result) => {\n this.emit('build', { item, result });\n });\n this.items.push(item);\n });\n }\n\n async buildIndex() {\n const entries = await Promise.all(\n this.items.map((item) => item.resolveEntry()),\n );\n return generateIndex(this.dest, entries);\n }\n\n async run() {\n await fs.ensureDir(this.dest);\n await Promise.all([\n this.buildIndex(),\n Promise.all(this.items.map((item) => item.run())),\n ]);\n }\n\n destroy() {\n this.items.forEach((item) => item.destroy());\n this.items.length = 0;\n this.offAll();\n delete (this as any)._opts;\n }\n}\n"],"mappings":"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"}
|
package/dist/icon-font-gen.d.mts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { EV } from "@fastkit/ev";
|
|
2
|
-
import {
|
|
2
|
+
import webfont, { webfont as webfont$1 } from "webfont";
|
|
3
3
|
import { UnPromisify } from "@fastkit/helpers";
|
|
4
|
-
import webfont from "webfont";
|
|
5
|
-
|
|
6
4
|
//#region src/schemes.d.ts
|
|
7
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Derived from webfont's public signature. webfont 12 added an `exports` map
|
|
7
|
+
* that only publishes the package root, so its internal `dist` type paths are no
|
|
8
|
+
* longer reachable. Tracking the upstream union means a format added there shows
|
|
9
|
+
* up here as a missing key in {@link ICON_FONT_FORMAT_MAP}.
|
|
10
|
+
*/
|
|
11
|
+
type IconFontFormat = NonNullable<NonNullable<Parameters<typeof webfont$1>[0]>['formats']>[number];
|
|
12
|
+
/**
|
|
13
|
+
* Every format this package knows how to emit, in the order they are written to
|
|
14
|
+
* the `@font-face` `src` list. Only the formats actually requested through
|
|
15
|
+
* `formats` are generated, so appending to this list does not change the output
|
|
16
|
+
* of an existing configuration.
|
|
17
|
+
*/
|
|
8
18
|
declare const ICON_FONT_FORMATS: IconFontFormat[];
|
|
9
19
|
declare const ICON_FONT_FORMAT_MAP: Record<IconFontFormat, string>;
|
|
10
20
|
interface IconFontSettings {
|
|
@@ -91,4 +101,3 @@ declare class IconFontRunner extends EV<{
|
|
|
91
101
|
}
|
|
92
102
|
//#endregion
|
|
93
103
|
export { DEFAULT_CONFIG_FILENAME, DEFAULT_DEST_DIRNAME, DEFAULT_OPTIONS, ICON_FONT_FORMATS, ICON_FONT_FORMAT_MAP, IconFontConfig, IconFontEntry, IconFontEntryResult, IconFontFormat, IconFontOptions, IconFontRunner, IconFontRunnerItem, IconFontSettings, RawIconFontEntry, ceateIconFontConfig, generate, generateEntry, generateIndex, mergeDefaults, resolveRawIconFontEntry };
|
|
94
|
-
//# sourceMappingURL=icon-font-gen.d.mts.map
|
package/dist/icon-font-gen.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as generateEntry, d as ICON_FONT_FORMATS, f as ICON_FONT_FORMAT_MAP, i as generate, l as DEFAULT_CONFIG_FILENAME, m as resolveRawIconFontEntry, n as IconFontRunner, o as generateIndex, p as ceateIconFontConfig, r as IconFontRunnerItem, s as mergeDefaults, t as DEFAULT_OPTIONS, u as DEFAULT_DEST_DIRNAME } from "./generator-
|
|
1
|
+
import { a as generateEntry, d as ICON_FONT_FORMATS, f as ICON_FONT_FORMAT_MAP, i as generate, l as DEFAULT_CONFIG_FILENAME, m as resolveRawIconFontEntry, n as IconFontRunner, o as generateIndex, p as ceateIconFontConfig, r as IconFontRunnerItem, s as mergeDefaults, t as DEFAULT_OPTIONS, u as DEFAULT_DEST_DIRNAME } from "./generator-BzNGBKOM.mjs";
|
|
2
2
|
export { DEFAULT_CONFIG_FILENAME, DEFAULT_DEST_DIRNAME, DEFAULT_OPTIONS, ICON_FONT_FORMATS, ICON_FONT_FORMAT_MAP, IconFontRunner, IconFontRunnerItem, ceateIconFontConfig, generate, generateEntry, generateIndex, mergeDefaults, resolveRawIconFontEntry };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fastkit/icon-font-gen",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.2",
|
|
4
4
|
"description": "A tool to generate icon web fonts and their definitions Type-safe for your application.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fastkit",
|
|
@@ -55,13 +55,13 @@
|
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"cac": "^7.0.0",
|
|
57
57
|
"chokidar": "^5.0.0",
|
|
58
|
-
"fs-extra": "^11.
|
|
59
|
-
"webfont": "^
|
|
60
|
-
"@fastkit/ev": "^0.15.
|
|
61
|
-
"@fastkit/
|
|
62
|
-
"@fastkit/
|
|
63
|
-
"@fastkit/
|
|
64
|
-
"@fastkit/
|
|
58
|
+
"fs-extra": "^11.4.0",
|
|
59
|
+
"webfont": "^12.5.0",
|
|
60
|
+
"@fastkit/ev": "^0.15.2",
|
|
61
|
+
"@fastkit/helpers": "^0.16.2",
|
|
62
|
+
"@fastkit/icon-font": "^2.2.3",
|
|
63
|
+
"@fastkit/node-util": "^0.16.2",
|
|
64
|
+
"@fastkit/tiny-logger": "^0.16.2"
|
|
65
65
|
},
|
|
66
66
|
"buildOptions": {
|
|
67
67
|
"name": "IconFont"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator-C4rLFFZ0.mjs","names":[],"sources":["../src/schemes.ts","../src/logger.ts","../src/generator.ts"],"sourcesContent":["import type { OptionsBase } from 'webfont/dist/src/types/OptionsBase';\nimport path from 'node:path';\nimport { installPackage } from '@fastkit/node-util';\n\nexport type IconFontFormat = NonNullable<OptionsBase['formats']>[number];\n\nexport const ICON_FONT_FORMATS: IconFontFormat[] = [\n 'eot',\n 'woff',\n 'woff2',\n 'svg',\n 'ttf',\n];\n\nexport const ICON_FONT_FORMAT_MAP: Record<IconFontFormat, string> = {\n eot: 'embedded-opentype',\n woff2: 'woff2',\n woff: 'woff',\n ttf: 'truetype',\n svg: 'svg',\n};\n\nexport interface IconFontSettings {\n fixedWidth?: boolean;\n centerHorizontally?: boolean;\n normalize?: boolean;\n fontHeight?: number;\n round?: number;\n descent?: number;\n disablePrefix?: boolean;\n absolutePath?: boolean;\n addHashInFontUrl?: boolean;\n}\n\nexport interface IconFontEntry extends IconFontSettings {\n name: string;\n fontName: string;\n formats?: IconFontFormat[];\n startUnicode?: number;\n prefix: string;\n src: string;\n dest: string;\n display: 'block' | 'swap';\n}\n\nexport interface RawIconFontEntry extends Omit<\n IconFontEntry,\n 'name' | 'fontName' | 'prefix' | 'dest' | 'display'\n> {\n name?: string;\n fontName?: string;\n /**\n * @default block\n */\n display?: 'block' | 'swap';\n}\n\n// export type RawIconFontOptions = IconFontEntry | IconFontEntry[];\n\nexport interface IconFontOptions {\n entries: RawIconFontEntry[];\n dest: string;\n}\n\nexport async function resolveRawIconFontEntry(\n rootDir: string,\n rawEntry: RawIconFontEntry,\n): Promise<IconFontEntry> {\n const entry = {\n ...rawEntry,\n };\n\n // mdi support\n if (entry.src === '@mdi') {\n const installedDir = await findOrInstallMDI();\n entry.src = path.join(installedDir, 'svg');\n if (entry.fontHeight == null) {\n entry.fontHeight = 512;\n }\n if (entry.descent == null) {\n entry.descent = 64;\n }\n if (entry.name == null) {\n entry.name = 'mdi';\n }\n }\n\n const name = entry.name || path.basename(entry.src);\n const fontName = entry.fontName || `${name}-icon`;\n const dest = path.join(rootDir, name);\n const prefix = entry.disablePrefix ? '' : `${name}-`;\n const display = entry.display || 'block';\n return {\n ...entry,\n name,\n fontName,\n prefix,\n dest,\n display,\n };\n}\n\nfunction findOrInstallMDI() {\n return installPackage('@mdi/svg', { dev: true });\n}\n\nexport const DEFAULT_CONFIG_FILENAME = 'icon-font.config';\n\nexport const DEFAULT_DEST_DIRNAME = '.icon-font';\n\nexport interface IconFontConfig extends Omit<IconFontOptions, 'dest'> {\n dest?: string;\n}\n\nexport function ceateIconFontConfig(options: IconFontConfig) {\n return options;\n}\n","import { TinyLogger, createTinyError } from '@fastkit/tiny-logger';\n\nconst name = 'icon-font-gen';\n\nexport const logger = new TinyLogger(name);\n\nexport const IconFontGenError = createTinyError(name);\n","import fs from 'fs-extra';\nimport path from 'node:path';\nimport chokidar, { FSWatcher } from 'chokidar';\nimport { EV } from '@fastkit/ev';\nimport { HashComparator } from '@fastkit/node-util';\nimport { UnPromisify } from '@fastkit/helpers';\nimport type webfont from 'webfont';\nimport { logger } from './logger';\nimport {\n IconFontOptions,\n IconFontEntry,\n RawIconFontEntry,\n resolveRawIconFontEntry,\n ICON_FONT_FORMATS,\n IconFontFormat,\n ICON_FONT_FORMAT_MAP,\n} from './schemes';\n\nexport type IconFontEntryResult = {\n entry: IconFontEntry;\n result?: UnPromisify<ReturnType<typeof webfont>>;\n};\n\nexport const DEFAULT_OPTIONS: Partial<IconFontEntry> = {\n formats: ['woff2'],\n fixedWidth: true,\n normalize: true,\n};\n\nconst BANNER = `\n/**\n * This is auto generated file.\n * Do not edit !!!\n *\n * @see: https://github.com/dadajam4/fastkit/tree/main/packages/icon-font-gen\n */\n`.trim();\n\nexport function mergeDefaults(entry: IconFontEntry): IconFontEntry {\n return {\n ...DEFAULT_OPTIONS,\n ...entry,\n };\n}\n\nasync function generateTS(entry: IconFontEntry, ids: string[]) {\n const code = `\n/* eslint-disable */\n// @ts-nocheck\n${BANNER}\nimport type { IconName, IconNameMap } from '@fastkit/icon-font';\nimport { registerIconNames } from '@fastkit/icon-font';\ndeclare module \"@fastkit/icon-font\" {\n export interface IconNameMap {\n${ids.map((id) => ` '${id}': true,`).join('\\n')}\n }\n}\nexport const ICON_NAMES = registerIconNames([\n ${ids.map((id) => `'${id}'`).join(',\\n ')}\n]);\nexport type { IconName, IconNameMap } from '@fastkit/icon-font';\n `.trim();\n const fileName = `${entry.name || 'icons'}.ts`;\n const dest = path.resolve(entry.dest, fileName);\n await fs.writeFile(dest, code);\n return {\n fileName,\n dest,\n code,\n };\n}\n\nexport async function generateEntry(\n entry: IconFontEntry,\n): Promise<IconFontEntryResult> {\n const options = mergeDefaults(entry);\n\n // @TODO support empty prefix\n // const namePrefix = options.name;\n const cssPrefix = `icon-${options.prefix}`;\n\n const hash = new HashComparator(options.src, options.dest);\n const srcHash = await hash.hasChanged();\n if (!srcHash) {\n logger.info(`Has not changed files. Skip process. >>> ${options.src}`);\n return { entry };\n }\n\n await fs.ensureDir(options.dest);\n\n const { webfont } = await import('webfont');\n\n // const { startUnicode = 0xea01 } = options;\n const { startUnicode = 0xba01 } = options;\n\n let i = startUnicode;\n\n const result = await webfont({\n files: options.src,\n fontName: options.fontName,\n formats: options.formats,\n fixedWidth: options.fixedWidth,\n centerHorizontally: options.centerHorizontally,\n normalize: options.normalize,\n fontHeight: options.fontHeight,\n round: options.round,\n descent: options.descent,\n addHashInFontUrl: options.addHashInFontUrl,\n glyphTransformFn: (obj) => {\n const char = String.fromCodePoint(i);\n obj.unicode = [char];\n i++;\n return obj;\n },\n });\n\n const buildedFormats: { format: IconFontFormat; code: string | Buffer }[] =\n [];\n ICON_FONT_FORMATS.forEach((format) => {\n const code = result[format];\n if (code) {\n buildedFormats.push({ format, code });\n }\n });\n\n await Promise.all(\n buildedFormats.map(({ format, code }) =>\n fs.writeFile(\n path.join(options.dest, `${options.name}.${format}`),\n code as string | Uint8Array,\n ),\n ),\n );\n\n const glyphs: { name: string; code: string }[] = [];\n\n result.glyphsData!.forEach(({ metadata }) => {\n if (!metadata) return;\n const { name, unicode } = metadata;\n if (!unicode) {\n return;\n }\n\n const code = unicode[0].charCodeAt(0).toString(16);\n glyphs.push({ name, code });\n });\n\n const urlPath = options.absolutePath ? options.dest : '.';\n const hashSuffix = options.addHashInFontUrl ? `?${Date.now()}` : '';\n const src = buildedFormats\n .map(\n ({ format }) =>\n `url(\"${urlPath}/${options.name}.${format}${hashSuffix}\") format(\"${ICON_FONT_FORMAT_MAP[format]}\")`,\n )\n .join(',');\n\n const cssCode = `/* stylelint-disable */\n@font-face {\n font-family: \"${options.fontName}\";\n font-display: ${options.display};\n font-style: normal;\n font-weight: 400;\n src: ${src};\n}\n\ni[class^=\"${cssPrefix}\"]:before, i[class*=\" ${cssPrefix}\"]:before {\n font-family: ${options.fontName} !important;\n font-style: normal;\n font-weight: normal !important;\n font-variant: normal;\n text-transform: none;\n text-rendering: auto;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n${glyphs\n .map(\n ({ name, code }) => `\n.${cssPrefix}${name}:before { content: \"\\\\${code}\"; }\n `,\n )\n .join('\\n')}\n `;\n await fs.writeFile(path.join(options.dest, `${options.name}.css`), cssCode);\n\n // const prefix = options.prefix ? `${options.prefix}-` : '';\n const ids = glyphs.map(({ name }) => `${options.prefix}${name}`);\n await generateTS(options, ids);\n await hash.commit(srcHash);\n return {\n entry,\n result,\n };\n}\n\nexport async function generateIndex(dest: string, entries: IconFontEntry[]) {\n const names = entries.map(({ name }) => name);\n const tsCode = `\n/* eslint-disable */\n// @ts-nocheck\nimport './index.css';\n${BANNER}\n${names\n .map(\n (name, index) =>\n // `import { IconName as IconName_${index}, IconNameMap as IconNameMap_${index} } from './${name}/${name}';`,\n `import './${name}/${name}';`,\n )\n .join('\\n')}\nexport type { IconName } from '@fastkit/icon-font';\nexport { ICON_NAMES } from '@fastkit/icon-font';\n `.trim();\n const tsDest = path.join(dest, 'index.ts');\n await fs.writeFile(tsDest, tsCode);\n\n const cssCode = `\n/* stylelint-disable */\n${BANNER}\n${names.map((name) => `@import './${name}/${name}.css';`).join('\\n')}\n `.trim();\n const cssDest = path.join(dest, 'index.css');\n await fs.writeFile(cssDest, cssCode);\n}\n\nexport async function generate(opts: IconFontOptions) {\n await fs.emptyDir(opts.dest);\n const results = await Promise.all(\n opts.entries.map((entry) =>\n resolveRawIconFontEntry(opts.dest, entry).then((_entry) =>\n generateEntry(_entry),\n ),\n ),\n );\n const entries = results.map(({ entry }) => entry);\n await generateIndex(opts.dest, entries);\n}\n\nexport class IconFontRunnerItem extends EV<{\n build: IconFontEntryResult;\n}> {\n readonly entry: RawIconFontEntry;\n\n readonly ctx: IconFontRunner;\n\n private _resolveEntryPromise?: Promise<IconFontEntry>;\n\n private _watcher: FSWatcher | null = null;\n\n watchMode: boolean;\n\n // get name() {\n // return this.entry.name;\n // }\n\n constructor(ctx: IconFontRunner, entry: RawIconFontEntry, watch = false) {\n super();\n this.ctx = ctx;\n this.entry = entry;\n this.watchMode = watch;\n this.build = this.build.bind(this);\n }\n\n async run() {\n const result = await this.build();\n if (this.watchMode && !this._watcher) {\n const watchDir = path.resolve(this.entry.src);\n this._watcher = chokidar.watch(watchDir, { ignoreInitial: true });\n this._watcher.on('all', this.build);\n }\n return result;\n }\n\n resolveEntry() {\n if (!this._resolveEntryPromise) {\n this._resolveEntryPromise = resolveRawIconFontEntry(\n this.ctx.dest,\n this.entry,\n );\n }\n return this._resolveEntryPromise;\n }\n\n async build() {\n const entry = await this.resolveEntry();\n const result = await generateEntry(entry);\n this.emit('build', result);\n return { entry };\n }\n\n destroy() {\n if (this._watcher) {\n this._watcher.close();\n this._watcher = null;\n }\n this.offAll();\n if (this.ctx) {\n delete (this as any).ctx;\n }\n }\n}\n\nexport class IconFontRunner extends EV<{\n build: {\n item: IconFontRunnerItem;\n result: IconFontEntryResult;\n };\n}> {\n readonly items: IconFontRunnerItem[] = [];\n\n readonly dest: string;\n\n constructor(opts: IconFontOptions, watch?: boolean) {\n super();\n\n this.dest = opts.dest;\n\n opts.entries.forEach((entry) => {\n const item = new IconFontRunnerItem(this, entry, watch);\n item.on('build', (result) => {\n this.emit('build', { item, result });\n });\n this.items.push(item);\n });\n }\n\n async buildIndex() {\n const entries = await Promise.all(\n this.items.map((item) => item.resolveEntry()),\n );\n return generateIndex(this.dest, entries);\n }\n\n async run() {\n await fs.ensureDir(this.dest);\n await Promise.all([\n this.buildIndex(),\n Promise.all(this.items.map((item) => item.run())),\n ]);\n }\n\n destroy() {\n this.items.forEach((item) => item.destroy());\n this.items.length = 0;\n this.offAll();\n delete (this as any)._opts;\n }\n}\n"],"mappings":";;;;;;;AAMA,MAAa,oBAAsC;CACjD;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,uBAAuD;CAClE,KAAK;CACL,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;AACP;AA4CA,eAAsB,wBACpB,SACA,UACwB;CACxB,MAAM,QAAQ,EACZ,GAAG,SACL;CAGA,IAAI,MAAM,QAAQ,QAAQ;EACxB,MAAM,eAAe,MAAM,iBAAiB;EAC5C,MAAM,MAAM,KAAK,KAAK,cAAc,KAAK;EACzC,IAAI,MAAM,cAAc,MACtB,MAAM,aAAa;EAErB,IAAI,MAAM,WAAW,MACnB,MAAM,UAAU;EAElB,IAAI,MAAM,QAAQ,MAChB,MAAM,OAAO;CAEjB;CAEA,MAAM,OAAO,MAAM,QAAQ,KAAK,SAAS,MAAM,GAAG;CAClD,MAAM,WAAW,MAAM,YAAY,GAAG,KAAK;CAC3C,MAAM,OAAO,KAAK,KAAK,SAAS,IAAI;CACpC,MAAM,SAAS,MAAM,gBAAgB,KAAK,GAAG,KAAK;CAClD,MAAM,UAAU,MAAM,WAAW;CACjC,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAS,mBAAmB;CAC1B,OAAO,eAAe,YAAY,EAAE,KAAK,KAAK,CAAC;AACjD;AAEA,MAAa,0BAA0B;AAEvC,MAAa,uBAAuB;AAMpC,SAAgB,oBAAoB,SAAyB;CAC3D,OAAO;AACT;;;AClHA,MAAM,OAAO;AAEb,MAAa,SAAS,IAAI,WAAW,IAAI;AAEzC,MAAa,mBAAmB,gBAAgB,IAAI;;;ACiBpD,MAAa,kBAA0C;CACrD,SAAS,CAAC,OAAO;CACjB,YAAY;CACZ,WAAW;AACb;AAEA,MAAM,SAAS;;;;;;;EAOb,KAAK;AAEP,SAAgB,cAAc,OAAqC;CACjE,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;AAEA,eAAe,WAAW,OAAsB,KAAe;CAC7D,MAAM,OAAO;;;EAGb,OAAO;;;;;EAKP,IAAI,KAAK,OAAO,QAAQ,GAAG,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE;;;;IAI/C,IAAI,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC,KAAK,OAAO,EAAE;;;IAGzC,KAAK;CACP,MAAM,WAAW,GAAG,MAAM,QAAQ,QAAQ;CAC1C,MAAM,OAAO,KAAK,QAAQ,MAAM,MAAM,QAAQ;CAC9C,MAAM,GAAG,UAAU,MAAM,IAAI;CAC7B,OAAO;EACL;EACA;EACA;CACF;AACF;AAEA,eAAsB,cACpB,OAC8B;CAC9B,MAAM,UAAU,cAAc,KAAK;CAInC,MAAM,YAAY,QAAQ,QAAQ;CAElC,MAAM,OAAO,IAAI,eAAe,QAAQ,KAAK,QAAQ,IAAI;CACzD,MAAM,UAAU,MAAM,KAAK,WAAW;CACtC,IAAI,CAAC,SAAS;EACZ,OAAO,KAAK,4CAA4C,QAAQ,KAAK;EACrE,OAAO,EAAE,MAAM;CACjB;CAEA,MAAM,GAAG,UAAU,QAAQ,IAAI;CAE/B,MAAM,EAAE,YAAY,MAAM,OAAO;CAGjC,MAAM,EAAE,eAAe,UAAW;CAElC,IAAI,IAAI;CAER,MAAM,SAAS,MAAM,QAAQ;EAC3B,OAAO,QAAQ;EACf,UAAU,QAAQ;EAClB,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,oBAAoB,QAAQ;EAC5B,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,OAAO,QAAQ;EACf,SAAS,QAAQ;EACjB,kBAAkB,QAAQ;EAC1B,mBAAmB,QAAQ;GAEzB,IAAI,UAAU,CADD,OAAO,cAAc,CAChB,CAAC;GACnB;GACA,OAAO;EACT;CACF,CAAC;CAED,MAAM,iBACJ,CAAC;CACH,kBAAkB,SAAS,WAAW;EACpC,MAAM,OAAO,OAAO;EACpB,IAAI,MACF,eAAe,KAAK;GAAE;GAAQ;EAAK,CAAC;CAExC,CAAC;CAED,MAAM,QAAQ,IACZ,eAAe,KAAK,EAAE,QAAQ,WAC5B,GAAG,UACD,KAAK,KAAK,QAAQ,MAAM,GAAG,QAAQ,KAAK,GAAG,QAAQ,GACnD,IACF,CACF,CACF;CAEA,MAAM,SAA2C,CAAC;CAElD,OAAO,WAAY,SAAS,EAAE,eAAe;EAC3C,IAAI,CAAC,UAAU;EACf,MAAM,EAAE,MAAM,YAAY;EAC1B,IAAI,CAAC,SACH;EAGF,MAAM,OAAO,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE;EACjD,OAAO,KAAK;GAAE;GAAM;EAAK,CAAC;CAC5B,CAAC;CAED,MAAM,UAAU,QAAQ,eAAe,QAAQ,OAAO;CACtD,MAAM,aAAa,QAAQ,mBAAmB,IAAI,KAAK,IAAI,MAAM;CACjE,MAAM,MAAM,eACT,KACE,EAAE,aACD,QAAQ,QAAQ,GAAG,QAAQ,KAAK,GAAG,SAAS,WAAW,aAAa,qBAAqB,QAAQ,GACrG,CAAC,CACA,KAAK,GAAG;CAEX,MAAM,UAAU;;kBAEA,QAAQ,SAAS;kBACjB,QAAQ,QAAQ;;;SAGzB,IAAI;;;YAGD,UAAU,wBAAwB,UAAU;iBACvC,QAAQ,SAAS;;;;;;;;;;EAUhC,OACC,KACE,EAAE,MAAM,WAAW;GACrB,YAAY,KAAK,wBAAwB,KAAK;GAE/C,CAAC,CACA,KAAK,IAAI,EAAE;;CAEZ,MAAM,GAAG,UAAU,KAAK,KAAK,QAAQ,MAAM,GAAG,QAAQ,KAAK,KAAK,GAAG,OAAO;CAI1E,MAAM,WAAW,SADL,OAAO,KAAK,EAAE,WAAW,GAAG,QAAQ,SAAS,MAC7B,CAAC;CAC7B,MAAM,KAAK,OAAO,OAAO;CACzB,OAAO;EACL;EACA;CACF;AACF;AAEA,eAAsB,cAAc,MAAc,SAA0B;CAC1E,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,IAAI;CAC5C,MAAM,SAAS;;;;EAIf,OAAO;EACP,MACC,KACE,MAAM,UAEL,aAAa,KAAK,GAAG,KAAK,GAC9B,CAAC,CACA,KAAK,IAAI,EAAE;;;IAGV,KAAK;CACP,MAAM,SAAS,KAAK,KAAK,MAAM,UAAU;CACzC,MAAM,GAAG,UAAU,QAAQ,MAAM;CAEjC,MAAM,UAAU;;EAEhB,OAAO;EACP,MAAM,KAAK,SAAS,cAAc,KAAK,GAAG,KAAK,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE;IACjE,KAAK;CACP,MAAM,UAAU,KAAK,KAAK,MAAM,WAAW;CAC3C,MAAM,GAAG,UAAU,SAAS,OAAO;AACrC;AAEA,eAAsB,SAAS,MAAuB;CACpD,MAAM,GAAG,SAAS,KAAK,IAAI;CAQ3B,MAAM,WAAU,MAPM,QAAQ,IAC5B,KAAK,QAAQ,KAAK,UAChB,wBAAwB,KAAK,MAAM,KAAK,CAAC,CAAC,MAAM,WAC9C,cAAc,MAAM,CACtB,CACF,CACF,EAAA,CACwB,KAAK,EAAE,YAAY,KAAK;CAChD,MAAM,cAAc,KAAK,MAAM,OAAO;AACxC;AAEA,IAAa,qBAAb,cAAwC,GAErC;CACD;CAEA;CAEA;CAEA,WAAqC;CAErC;CAMA,YAAY,KAAqB,OAAyB,QAAQ,OAAO;EACvE,MAAM;EACN,KAAK,MAAM;EACX,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,KAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;CACnC;CAEA,MAAM,MAAM;EACV,MAAM,SAAS,MAAM,KAAK,MAAM;EAChC,IAAI,KAAK,aAAa,CAAC,KAAK,UAAU;GACpC,MAAM,WAAW,KAAK,QAAQ,KAAK,MAAM,GAAG;GAC5C,KAAK,WAAW,SAAS,MAAM,UAAU,EAAE,eAAe,KAAK,CAAC;GAChE,KAAK,SAAS,GAAG,OAAO,KAAK,KAAK;EACpC;EACA,OAAO;CACT;CAEA,eAAe;EACb,IAAI,CAAC,KAAK,sBACR,KAAK,uBAAuB,wBAC1B,KAAK,IAAI,MACT,KAAK,KACP;EAEF,OAAO,KAAK;CACd;CAEA,MAAM,QAAQ;EACZ,MAAM,QAAQ,MAAM,KAAK,aAAa;EACtC,MAAM,SAAS,MAAM,cAAc,KAAK;EACxC,KAAK,KAAK,SAAS,MAAM;EACzB,OAAO,EAAE,MAAM;CACjB;CAEA,UAAU;EACR,IAAI,KAAK,UAAU;GACjB,KAAK,SAAS,MAAM;GACpB,KAAK,WAAW;EAClB;EACA,KAAK,OAAO;EACZ,IAAI,KAAK,KACP,OAAQ,KAAa;CAEzB;AACF;AAEA,IAAa,iBAAb,cAAoC,GAKjC;CACD,QAAuC,CAAC;CAExC;CAEA,YAAY,MAAuB,OAAiB;EAClD,MAAM;EAEN,KAAK,OAAO,KAAK;EAEjB,KAAK,QAAQ,SAAS,UAAU;GAC9B,MAAM,OAAO,IAAI,mBAAmB,MAAM,OAAO,KAAK;GACtD,KAAK,GAAG,UAAU,WAAW;IAC3B,KAAK,KAAK,SAAS;KAAE;KAAM;IAAO,CAAC;GACrC,CAAC;GACD,KAAK,MAAM,KAAK,IAAI;EACtB,CAAC;CACH;CAEA,MAAM,aAAa;EACjB,MAAM,UAAU,MAAM,QAAQ,IAC5B,KAAK,MAAM,KAAK,SAAS,KAAK,aAAa,CAAC,CAC9C;EACA,OAAO,cAAc,KAAK,MAAM,OAAO;CACzC;CAEA,MAAM,MAAM;EACV,MAAM,GAAG,UAAU,KAAK,IAAI;EAC5B,MAAM,QAAQ,IAAI,CAChB,KAAK,WAAW,GAChB,QAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,CAClD,CAAC;CACH;CAEA,UAAU;EACR,KAAK,MAAM,SAAS,SAAS,KAAK,QAAQ,CAAC;EAC3C,KAAK,MAAM,SAAS;EACpB,KAAK,OAAO;EACZ,OAAQ,KAAa;CACvB;AACF"}
|