@fastkit/icon-font-gen 0.13.15 → 0.13.16

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.
@@ -112,7 +112,7 @@ async function generateEntry(entry) {
112
112
  const hash = new HashComparator(options.src, options.dest);
113
113
  const srcHash = await hash.hasChanged();
114
114
  if (!srcHash) {
115
- logger.info(`Has not chaged files. Skip process. >>> ${options.src}`);
115
+ logger.info(`Has not changed files. Skip process. >>> ${options.src}`);
116
116
  return { entry };
117
117
  }
118
118
  await fs.ensureDir(options.dest);
@@ -145,12 +145,9 @@ async function generateEntry(entry) {
145
145
  }
146
146
  });
147
147
  await Promise.all(
148
- buildedFormats.map(({ format, code }) => {
149
- return fs.writeFile(
150
- path2.join(options.dest, `${options.name}.${format}`),
151
- code
152
- );
153
- })
148
+ buildedFormats.map(
149
+ ({ format, code }) => fs.writeFile(path2.join(options.dest, `${options.name}.${format}`), code)
150
+ )
154
151
  );
155
152
  const glyphs = [];
156
153
  result.glyphsData.forEach(({ metadata }) => {
@@ -165,9 +162,9 @@ async function generateEntry(entry) {
165
162
  });
166
163
  const urlPath = options.absolutePath ? options.dest : ".";
167
164
  const hashSuffix = options.addHashInFontUrl ? `?${Date.now()}` : "";
168
- const src = buildedFormats.map(({ format }) => {
169
- return `url("${urlPath}/${options.name}.${format}${hashSuffix}") format("${ICON_FONT_FORMAT_MAP[format]}")`;
170
- }).join(",");
165
+ const src = buildedFormats.map(
166
+ ({ format }) => `url("${urlPath}/${options.name}.${format}${hashSuffix}") format("${ICON_FONT_FORMAT_MAP[format]}")`
167
+ ).join(",");
171
168
  const cssCode = `/* stylelint-disable */
172
169
  @font-face {
173
170
  font-family: "${options.fontName}";
@@ -188,11 +185,11 @@ i[class^="${cssPrefix}"]:before, i[class*=" ${cssPrefix}"]:before {
188
185
  -webkit-font-smoothing: antialiased;
189
186
  -moz-osx-font-smoothing: grayscale;
190
187
  }
191
- ${glyphs.map(({ name: name2, code }) => {
192
- return `
188
+ ${glyphs.map(
189
+ ({ name: name2, code }) => `
193
190
  .${cssPrefix}${name2}:before { content: "\\${code}"; }
194
- `;
195
- }).join("\n")}
191
+ `
192
+ ).join("\n")}
196
193
  `;
197
194
  await fs.writeFile(path2.join(options.dest, `${options.name}.css`), cssCode);
198
195
  const ids = glyphs.map(({ name: name2 }) => `${options.prefix}${name2}`);
@@ -234,7 +231,7 @@ async function generate(opts) {
234
231
  const results = await Promise.all(
235
232
  opts.entries.map(
236
233
  (entry) => resolveRawIconFontEntry(opts.dest, entry).then(
237
- (entry2) => generateEntry(entry2)
234
+ (_entry) => generateEntry(_entry)
238
235
  )
239
236
  )
240
237
  );
@@ -295,8 +292,6 @@ var IconFontRunnerItem = class extends EV {
295
292
  var IconFontRunner = class extends EV {
296
293
  items = [];
297
294
  dest;
298
- // private _opts: IconFontOptions;
299
- // private entries: IconFontEntry[] = [];
300
295
  constructor(opts, watch) {
301
296
  super();
302
297
  this.dest = opts.dest;
@@ -331,4 +326,4 @@ var IconFontRunner = class extends EV {
331
326
 
332
327
  export { DEFAULT_CONFIG_FILENAME, DEFAULT_DEST_DIRNAME, DEFAULT_OPTIONS, ICON_FONT_FORMATS, ICON_FONT_FORMAT_MAP, IconFontGenError, IconFontRunner, IconFontRunnerItem, ceateIconFontConfig, generate, generateEntry, generateIndex, mergeDefaults, resolveRawIconFontEntry };
333
328
  //# sourceMappingURL=out.js.map
334
- //# sourceMappingURL=chunk-B7P6DCN4.mjs.map
329
+ //# sourceMappingURL=chunk-QGON4EVH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemes.ts","../src/logger.ts","../src/generator.ts"],"names":["name","path"],"mappings":"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","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\n 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 // eslint-disable-next-line no-shadow\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(path.join(options.dest, `${options.name}.${format}`), code),\n ),\n );\n\n const glyphs: { name: string; code: string }[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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"]}
package/dist/cli.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  import __plugboy_path from 'node:path';
2
- import { DEFAULT_DEST_DIRNAME, DEFAULT_CONFIG_FILENAME, IconFontGenError, generate } from './chunk-B7P6DCN4.mjs';
2
+ import { DEFAULT_DEST_DIRNAME, DEFAULT_CONFIG_FILENAME, IconFontGenError, generate } from './chunk-QGON4EVH.mjs';
3
3
  import { cac } from 'cac';
4
4
  import { findPackageDir, esbuildRequire } from '@fastkit/node-util';
5
5
 
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@fastkit/icon-font-gen",
9
- version: "0.13.15",
9
+ version: "0.13.16",
10
10
  description: "A tool to generate icon web fonts and their definitions Type-safe for your application.",
11
11
  keywords: [
12
12
  "fastkit",
@@ -95,8 +95,8 @@ var package_default = {
95
95
 
96
96
  // src/cli.ts
97
97
  async function cli() {
98
- const cli2 = cac("icon-font");
99
- cli2.option("-d, --dest <string>", "Destination for generated fonts.", {
98
+ const _cli = cac("icon-font");
99
+ _cli.option("-d, --dest <string>", "Destination for generated fonts.", {
100
100
  default: __plugboy_path.join(process.cwd(), `${DEFAULT_DEST_DIRNAME}`)
101
101
  }).command(
102
102
  "[config file path]",
@@ -106,9 +106,9 @@ Path of the configuration file. (default: [your package directory]${__plugboy_pa
106
106
 
107
107
  e.g.
108
108
  \`\`\`
109
- import { ceateIconFontConfig } from '@fastkit/icon-font-gen';
109
+ import { createIconFontConfig } from '@fastkit/icon-font-gen';
110
110
 
111
- export default ceateIconFontConfig({ ... });
111
+ export default createIconFontConfig({ ... });
112
112
  \`\`\`
113
113
  `.trim()
114
114
  ).action(
@@ -131,9 +131,9 @@ Path of the configuration file. (default: [your package directory]${__plugboy_pa
131
131
  });
132
132
  }
133
133
  );
134
- cli2.help();
135
- cli2.version(package_default.version);
136
- cli2.parse();
134
+ _cli.help();
135
+ _cli.version(package_default.version);
136
+ _cli.parse();
137
137
  }
138
138
  cli();
139
139
 
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json"],"names":["cli"],"mappings":"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","sourcesContent":["import { cac } from 'cac';\nimport path from 'node:path';\nimport {\n DEFAULT_DEST_DIRNAME,\n DEFAULT_CONFIG_FILENAME,\n IconFontConfig,\n} from './schemes';\nimport { generate } from './generator';\nimport { findPackageDir, esbuildRequire } from '@fastkit/node-util';\nimport { IconFontGenError } from './logger';\nimport pkg from '../package.json';\n\nexport async function cli() {\n const cli = cac('icon-font');\n\n cli\n .option('-d, --dest <string>', 'Destination for generated fonts.', {\n default: path.join(process.cwd(), `${DEFAULT_DEST_DIRNAME}`),\n })\n .command(\n '[config file path]',\n `\nPath of the configuration file. (default: [your package directory]${path.sep}${DEFAULT_CONFIG_FILENAME})\n You must export default <IconFontConfig>.\n\n e.g.\n \\`\\`\\`\n import { ceateIconFontConfig } from '@fastkit/icon-font-gen';\n\n export default ceateIconFontConfig({ ... });\n \\`\\`\\`\n `.trim(),\n )\n .action(\n async (configPath: string | undefined, options: { dest: string }) => {\n if (!configPath) {\n const pkgDir = await findPackageDir();\n if (!pkgDir) {\n throw new IconFontGenError('missing package directory.');\n }\n configPath = path.join(pkgDir, DEFAULT_CONFIG_FILENAME);\n }\n\n const dest = path.resolve(options.dest);\n const mod = await esbuildRequire<{ default: IconFontConfig }>(\n configPath,\n );\n const config = mod.exports.default;\n\n await generate({\n ...config,\n dest,\n });\n },\n );\n\n cli.help();\n\n cli.version(pkg.version);\n\n cli.parse();\n}\n\ncli();\n","{\n \"name\": \"@fastkit/icon-font-gen\",\n \"version\": \"0.13.15\",\n \"description\": \"A tool to generate icon web fonts and their definitions Type-safe for your application.\",\n \"keywords\": [\n \"fastkit\",\n \"icon\"\n ],\n \"homepage\": \"https://github.com/dadajam4/fastkit/tree/main/packages/icon-font-gen#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/dadajam4/fastkit/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dadajam4/fastkit.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"dadajam4\",\n \"type\": \"module\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"types\": \"./dist/icon-font-gen.d.ts\",\n \"import\": {\n \"default\": \"./dist/icon-font-gen.mjs\"\n }\n },\n \"./cli\": {\n \"types\": \"./dist/cli.d.ts\",\n \"import\": {\n \"default\": \"./dist/cli.mjs\"\n }\n },\n \"./*\": \"./dist/*\"\n },\n \"main\": \"./dist/icon-font-gen.mjs\",\n \"types\": \"./dist/icon-font-gen.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \".\": [\n \"./dist/icon-font-gen.d.ts\"\n ],\n \"cli\": [\n \"./dist/cli.d.ts\"\n ]\n }\n },\n \"bin\": {\n \"icon-font\": \"./bin/cli.mjs\"\n },\n \"files\": [\n \"./cli.mjs\",\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"plugboy build\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf dist\",\n \"eslint\": \"eslint . --ext ts,tsx,js,vue,html,yaml\",\n \"eslint:fix\": \"eslint . --ext ts,tsx,js,vue,html,yaml --fix\",\n \"format\": \"pnpm run eslint:fix\",\n \"lint\": \"pnpm run eslint\",\n \"stub\": \"plugboy stub\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@fastkit/ev\": \"workspace:*\",\n \"@fastkit/helpers\": \"workspace:*\",\n \"@fastkit/icon-font\": \"workspace:*\",\n \"@fastkit/node-util\": \"workspace:*\",\n \"@fastkit/tiny-logger\": \"workspace:*\",\n \"cac\": \"^6.7.14\",\n \"chokidar\": \"^3.5.3\",\n \"fs-extra\": \"^11.1.1\",\n \"webfont\": \"^11.2.26\"\n },\n \"buildOptions\": {\n \"name\": \"IconFont\"\n },\n \"_docs\": {\n \"scope\": \"\",\n \"feature\": \"icon\",\n \"description\": {\n \"en\": \"A tool to generate icon web fonts and their definitions Type-safe for your application.\",\n \"ja\": \"アプリケーションのためにアイコンWebフォントとその定義をTypeセーフに生成するツール。\"\n }\n }\n}"]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW;AACpB,OAAO,UAAU;AACjB,SAAS,gBAAgB,sBAAsB;;;ACF/C;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAY;AAAA,EACZ,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,SAAW;AAAA,EACX,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,kBAAkB;AAAA,IAClB,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,QACR,SAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,OAAS;AAAA,MACT,QAAU;AAAA,QACR,SAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,eAAiB;AAAA,IACf,KAAK;AAAA,MACH,KAAK;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAO;AAAA,IACL,aAAa;AAAA,EACf;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,OAAS;AAAA,IACT,QAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,EACf;AAAA,EACA,cAAgB;AAAA,IACd,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,KAAO;AAAA,IACP,UAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAW;AAAA,EACb;AAAA,EACA,cAAgB;AAAA,IACd,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,aAAe;AAAA,MACb,IAAM;AAAA,MACN,IAAM;AAAA,IACR;AAAA,EACF;AACF;;;AD3EA,eAAsB,MAAM;AAC1B,QAAM,OAAO,IAAI,WAAW;AAE5B,OACG,OAAO,uBAAuB,oCAAoC;AAAA,IACjE,SAAS,KAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,oBAAoB,EAAE;AAAA,EAC7D,CAAC,EACA;AAAA,IACC;AAAA,IACA;AAAA,oEAC8D,KAAK,GAAG,GAAG,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAS9F,KAAK;AAAA,EACT,EACC;AAAA,IACC,OAAO,YAAgC,YAA8B;AACnE,UAAI,CAAC,YAAY;AACf,cAAM,SAAS,MAAM,eAAe;AACpC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,iBAAiB,4BAA4B;AAAA,QACzD;AACA,qBAAa,KAAK,KAAK,QAAQ,uBAAuB;AAAA,MACxD;AAEA,YAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI;AACtC,YAAM,MAAM,MAAM;AAAA,QAChB;AAAA,MACF;AACA,YAAM,SAAS,IAAI,QAAQ;AAE3B,YAAM,SAAS;AAAA,QACb,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEF,OAAK,KAAK;AAEV,OAAK,QAAQ,gBAAI,OAAO;AAExB,OAAK,MAAM;AACb;AAEA,IAAI","sourcesContent":["import { cac } from 'cac';\nimport path from 'node:path';\nimport { findPackageDir, esbuildRequire } from '@fastkit/node-util';\nimport {\n DEFAULT_DEST_DIRNAME,\n DEFAULT_CONFIG_FILENAME,\n IconFontConfig,\n} from './schemes';\nimport { generate } from './generator';\nimport { IconFontGenError } from './logger';\nimport pkg from '../package.json';\n\nexport async function cli() {\n const _cli = cac('icon-font');\n\n _cli\n .option('-d, --dest <string>', 'Destination for generated fonts.', {\n default: path.join(process.cwd(), `${DEFAULT_DEST_DIRNAME}`),\n })\n .command(\n '[config file path]',\n `\nPath of the configuration file. (default: [your package directory]${path.sep}${DEFAULT_CONFIG_FILENAME})\n You must export default <IconFontConfig>.\n\n e.g.\n \\`\\`\\`\n import { createIconFontConfig } from '@fastkit/icon-font-gen';\n\n export default createIconFontConfig({ ... });\n \\`\\`\\`\n `.trim(),\n )\n .action(\n async (configPath: string | undefined, options: { dest: string }) => {\n if (!configPath) {\n const pkgDir = await findPackageDir();\n if (!pkgDir) {\n throw new IconFontGenError('missing package directory.');\n }\n configPath = path.join(pkgDir, DEFAULT_CONFIG_FILENAME);\n }\n\n const dest = path.resolve(options.dest);\n const mod = await esbuildRequire<{ default: IconFontConfig }>(\n configPath,\n );\n const config = mod.exports.default;\n\n await generate({\n ...config,\n dest,\n });\n },\n );\n\n _cli.help();\n\n _cli.version(pkg.version);\n\n _cli.parse();\n}\n\ncli();\n","{\n \"name\": \"@fastkit/icon-font-gen\",\n \"version\": \"0.13.16\",\n \"description\": \"A tool to generate icon web fonts and their definitions Type-safe for your application.\",\n \"keywords\": [\n \"fastkit\",\n \"icon\"\n ],\n \"homepage\": \"https://github.com/dadajam4/fastkit/tree/main/packages/icon-font-gen#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/dadajam4/fastkit/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dadajam4/fastkit.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"dadajam4\",\n \"type\": \"module\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"types\": \"./dist/icon-font-gen.d.ts\",\n \"import\": {\n \"default\": \"./dist/icon-font-gen.mjs\"\n }\n },\n \"./cli\": {\n \"types\": \"./dist/cli.d.ts\",\n \"import\": {\n \"default\": \"./dist/cli.mjs\"\n }\n },\n \"./*\": \"./dist/*\"\n },\n \"main\": \"./dist/icon-font-gen.mjs\",\n \"types\": \"./dist/icon-font-gen.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \".\": [\n \"./dist/icon-font-gen.d.ts\"\n ],\n \"cli\": [\n \"./dist/cli.d.ts\"\n ]\n }\n },\n \"bin\": {\n \"icon-font\": \"./bin/cli.mjs\"\n },\n \"files\": [\n \"./cli.mjs\",\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"plugboy build\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf dist\",\n \"eslint\": \"eslint . --ext ts,tsx,js,vue,html,yaml\",\n \"eslint:fix\": \"eslint . --ext ts,tsx,js,vue,html,yaml --fix\",\n \"format\": \"pnpm run eslint:fix\",\n \"lint\": \"pnpm run eslint\",\n \"stub\": \"plugboy stub\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@fastkit/ev\": \"workspace:*\",\n \"@fastkit/helpers\": \"workspace:*\",\n \"@fastkit/icon-font\": \"workspace:*\",\n \"@fastkit/node-util\": \"workspace:*\",\n \"@fastkit/tiny-logger\": \"workspace:*\",\n \"cac\": \"^6.7.14\",\n \"chokidar\": \"^3.5.3\",\n \"fs-extra\": \"^11.1.1\",\n \"webfont\": \"^11.2.26\"\n },\n \"buildOptions\": {\n \"name\": \"IconFont\"\n },\n \"_docs\": {\n \"scope\": \"\",\n \"feature\": \"icon\",\n \"description\": {\n \"en\": \"A tool to generate icon web fonts and their definitions Type-safe for your application.\",\n \"ja\": \"アプリケーションのためにアイコンWebフォントとその定義をTypeセーフに生成するツール。\"\n }\n }\n}"]}
@@ -1,3 +1,3 @@
1
- export { DEFAULT_CONFIG_FILENAME, DEFAULT_DEST_DIRNAME, DEFAULT_OPTIONS, ICON_FONT_FORMATS, ICON_FONT_FORMAT_MAP, IconFontRunner, IconFontRunnerItem, ceateIconFontConfig, generate, generateEntry, generateIndex, mergeDefaults, resolveRawIconFontEntry } from './chunk-B7P6DCN4.mjs';
1
+ export { DEFAULT_CONFIG_FILENAME, DEFAULT_DEST_DIRNAME, DEFAULT_OPTIONS, ICON_FONT_FORMATS, ICON_FONT_FORMAT_MAP, IconFontRunner, IconFontRunnerItem, ceateIconFontConfig, generate, generateEntry, generateIndex, mergeDefaults, resolveRawIconFontEntry } from './chunk-QGON4EVH.mjs';
2
2
  //# sourceMappingURL=out.js.map
3
3
  //# sourceMappingURL=icon-font-gen.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastkit/icon-font-gen",
3
- "version": "0.13.15",
3
+ "version": "0.13.16",
4
4
  "description": "A tool to generate icon web fonts and their definitions Type-safe for your application.",
5
5
  "keywords": [
6
6
  "fastkit",
@@ -57,11 +57,11 @@
57
57
  "chokidar": "^3.5.3",
58
58
  "fs-extra": "^11.1.1",
59
59
  "webfont": "^11.2.26",
60
- "@fastkit/icon-font": "1.0.9",
61
- "@fastkit/node-util": "0.13.8",
62
- "@fastkit/ev": "0.13.1",
63
- "@fastkit/helpers": "0.13.7",
64
- "@fastkit/tiny-logger": "0.13.7"
60
+ "@fastkit/ev": "0.13.2",
61
+ "@fastkit/icon-font": "1.0.10",
62
+ "@fastkit/tiny-logger": "0.13.8",
63
+ "@fastkit/helpers": "0.13.8",
64
+ "@fastkit/node-util": "0.13.9"
65
65
  },
66
66
  "buildOptions": {
67
67
  "name": "IconFont"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schemes.ts","../src/logger.ts","../src/generator.ts"],"names":["name","path","entry"],"mappings":"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","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\n 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 {\n IconFontOptions,\n IconFontEntry,\n RawIconFontEntry,\n resolveRawIconFontEntry,\n ICON_FONT_FORMATS,\n IconFontFormat,\n ICON_FONT_FORMAT_MAP,\n} from './schemes';\nimport { HashComparator } from '@fastkit/node-util';\nimport { UnPromisify } from '@fastkit/helpers';\nimport { logger } from './logger';\nimport type webfont from 'webfont';\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 chaged 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 return fs.writeFile(\n path.join(options.dest, `${options.name}.${format}`),\n code,\n );\n }),\n );\n\n const glyphs: { name: string; code: string }[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 ICON_FONT_FORMAT_MAP;\n const src = buildedFormats\n .map(({ format }) => {\n return `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(({ name, code }) => {\n return `\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 readonly ctx: IconFontRunner;\n private _resolveEntryPromise?: Promise<IconFontEntry>;\n private _watcher: FSWatcher | null = null;\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 readonly dest: string;\n // private _opts: IconFontOptions;\n // private entries: IconFontEntry[] = [];\n\n constructor(opts: IconFontOptions, watch?: boolean) {\n super();\n\n // this._opts = opts;\n this.dest = opts.dest;\n // this.entries = opts.entries.map((entry) =>\n // resolveRawIconFontEntry(this.outputDir, entry),\n // );\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"]}