@charcoal-ui/icons-cli 4.2.1 → 4.3.0-beta.1

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/index.js CHANGED
@@ -15,6 +15,10 @@ var __copyProps = (to, from, except, desc) => {
15
15
  return to;
16
16
  };
17
17
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
18
22
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
19
23
  mod
20
24
  ));
@@ -189,6 +193,9 @@ async function* getChangedFiles(dir) {
189
193
  }
190
194
  async function collectGitStatus() {
191
195
  return new Map(
196
+ /**
197
+ * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1
198
+ */
192
199
  (await execp(`git status --porcelain`)).split("\n").map((s) => {
193
200
  return [
194
201
  s.slice(3),
@@ -200,7 +207,7 @@ async function collectGitStatus() {
200
207
 
201
208
  // src/GitHubClient.ts
202
209
  var GithubClient = class {
203
- constructor(repoOwner, repoName, token, defaultBranch, now = new Date()) {
210
+ constructor(repoOwner, repoName, token, defaultBranch, now = /* @__PURE__ */ new Date()) {
204
211
  this.repoOwner = repoOwner;
205
212
  this.repoName = repoName;
206
213
  this.defaultBranch = defaultBranch;
@@ -227,6 +234,9 @@ var GithubClient = class {
227
234
  get branch() {
228
235
  return `icons/update/${this.now.getTime()}`;
229
236
  }
237
+ /**
238
+ * both used for commit message or pull request title
239
+ */
230
240
  get message() {
231
241
  return `[icons-cli] Update icons ${this.now.toDateString()}`;
232
242
  }
@@ -235,6 +245,8 @@ var GithubClient = class {
235
245
  for await (const file of getChangedFiles(outputDir)) {
236
246
  const item = {
237
247
  path: file.relativePath,
248
+ // 100 はファイル 644 は実行不可なファイルであるという意味
249
+ // @see https://octokit.github.io/rest.js/v18#git-create-tree
238
250
  mode: "100644",
239
251
  content: file.content
240
252
  };
@@ -309,7 +321,7 @@ var GithubClient = class {
309
321
  var import_node = require("@gitbeaker/node");
310
322
  var import_path4 = __toESM(require("path"));
311
323
  var GitlabClient = class {
312
- constructor(host, projectId, privateToken, defaultBranch, now = new Date()) {
324
+ constructor(host, projectId, privateToken, defaultBranch, now = /* @__PURE__ */ new Date()) {
313
325
  this.host = host;
314
326
  this.projectId = projectId;
315
327
  this.defaultBranch = defaultBranch;
@@ -336,6 +348,9 @@ var GitlabClient = class {
336
348
  get branch() {
337
349
  return `icons/update/${this.now.getTime()}`;
338
350
  }
351
+ /**
352
+ * both used for commit message or merge request title
353
+ */
339
354
  get message() {
340
355
  return `[icons-cli] Update icons ${this.now.toDateString()}`;
341
356
  }
@@ -378,6 +393,10 @@ var import_svgo = __toESM(require("svgo"));
378
393
  var DEFAULT_CURRENT_COLOR_TARGET = "#858585";
379
394
  var svgo = new import_svgo.default({
380
395
  plugins: [
396
+ // NOTICE: SVGO は「svg 内のすべての fill を currentColor に変える」機能しかない
397
+ // icons-cli に必要なのは「特定の黒っぽい色だけ currentColor に変える」機能
398
+ // なので、convertColors plugin は使わない
399
+ // { convertColors: { currentColor: true } },
381
400
  { removeViewBox: false },
382
401
  { removeAttrs: { attrs: ["stroke-opacity", "fill-opacity"] } }
383
402
  ]
@@ -521,6 +540,7 @@ var generateIconSource = async (outputDir) => {
521
540
  const srcRoot = import_path6.default.join(outputDir, "src");
522
541
  const icons = (await (0, import_fast_glob2.default)("**/*.svg", { cwd: svgRoot })).map(
523
542
  (path7) => path7.slice(0, -4)
543
+ // e.g. '16/Add.svg' -> '16/Add'
524
544
  ).sort();
525
545
  for (const it of icons) {
526
546
  const data = await import_fs_extra3.default.readFile(import_path6.default.join(svgRoot, `${it}.svg`));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/figma/FigmaFileClient.ts","../src/concurrently.ts","../src/GitHubClient.ts","../src/getChangedFiles.ts","../src/utils.ts","../src/GitlabClient.ts","../src/svg/optimizeSvg.ts","../src/svg/optimizeSvgInDirectory.ts","../src/generateSource.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './figma/FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET } from './svg/optimizeSvg'\nimport { optimizeSvgInDirectory } from './svg/optimizeSvgInDirectory'\nimport { generateIconSource } from './generateSource'\nimport { mustBeDefined } from './utils'\n\n/**\n * Figma\n */\nconst FIGMA_TOKEN = process.env.FIGMA_TOKEN\nconst FIGMA_FILE_URL = process.env.FIGMA_FILE_URL\nconst OUTPUT_ROOT_DIR = process.env.OUTPUT_ROOT_DIR\n\n/**\n * GitLab\n */\nconst GITLAB_ACCESS_TOKEN = process.env.GITLAB_ACCESS_TOKEN\nconst GITLAB_DEFAULT_BRANCH = process.env.GITLAB_DEFAULT_BRANCH\nconst GITLAB_HOST = process.env.GITLAB_HOST\nconst GITLAB_PROJECT_ID = process.env.GITLAB_PROJECT_ID\n\n/**\n * GitHub\n */\nconst GITHUB_ACCESS_TOKEN = process.env.GITHUB_ACCESS_TOKEN\nconst GITHUB_REPO_OWNER = process.env.GITHUB_REPO_OWNER\nconst GITHUB_REPO_NAME = process.env.GITHUB_REPO_NAME\nconst GITHUB_DEFAULT_BRANCH = process.env.GITHUB_DEFAULT_BRANCH\n\nvoid yargs\n .scriptName('icons-cli')\n .command(\n 'figma:export',\n 'Load all icons from Figma and save to files',\n {\n format: {\n default: 'svg',\n choices: ['svg', 'pdf'],\n describe: 'Output format',\n },\n },\n async ({ format }) => {\n mustBeDefined(FIGMA_FILE_URL, 'FIGMA_FILE_URL')\n mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n )\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize svg files in output directory',\n {\n color: {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n describe: 'Color code that should be converted into `currentColor`',\n },\n ignoreFile: {\n type: 'string',\n describe:\n 'A file that contains the list of path to SVG files that should not be optimized',\n },\n },\n async ({ color, ignoreFile }) => {\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await optimizeSvgInDirectory(OUTPUT_ROOT_DIR, color, ignoreFile)\n }\n )\n .command(\n 'files:generate',\n 'Enumerate svg files in output directory and generate icon files',\n {},\n () => {\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n void generateIconSource(OUTPUT_ROOT_DIR).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'gitlab:mr',\n 'Create a merge request in the name of icons-cli',\n {},\n async () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main',\n OUTPUT_ROOT_DIR\n )\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n async () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main',\n OUTPUT_ROOT_DIR\n )\n }\n )\n .demandCommand()\n .strict()\n .help()\n .parse()\n","import path from 'path'\nimport camelCase from 'camelcase'\nimport * as Figma from 'figma-js'\nimport { ensureDir, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from '../concurrently'\n\nconst matchPath = match<{ fileId: string; name: string }>('/file/:fileId/:name')\n\nfunction extractParams(url: string): { fileId: string; nodeId?: string } {\n const { pathname, searchParams } = new URL(url)\n\n const result = matchPath(pathname)\n if (result === false) {\n throw new Error('No fileId found in url')\n }\n\n return {\n fileId: result.params.fileId,\n nodeId: searchParams.get('node-id') ?? undefined,\n }\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\nconst iconName = /^(?:\\d+|Inline)\\s*\\//u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\ninterface Component {\n id: string\n name: string\n image?: string\n}\n\nexport class FigmaFileClient {\n private readonly fileId: string\n private readonly nodeId?: string\n private readonly exportFormat: ExportFormat\n private readonly client: Figma.ClientInterface\n\n private components: Record<string, Component> = {}\n\n static async runFromCli(\n url: string,\n token: string,\n outputRootDir: string,\n exportFormat: ExportFormat\n ) {\n const client = new this(url, token, exportFormat)\n\n const outputDir = path.join(process.cwd(), outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components from ${url}`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log('success!')\n }\n\n constructor(\n url: string,\n personalAccessToken: string,\n exportFormat: ExportFormat\n ) {\n this.client = Figma.Client({\n personalAccessToken,\n })\n\n const { fileId, nodeId } = extractParams(url)\n this.fileId = fileId\n this.nodeId = nodeId\n\n this.exportFormat = exportFormat\n }\n\n async loadSvg(outputDir: string) {\n await remove(outputDir)\n await ensureDir(outputDir)\n\n await this.loadComponents()\n await this.loadImageUrls()\n await this.downloadImages(outputDir)\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n // nodeIdが指定されている場合は、IDが一致するノードのみを探索対象にする\n // 指定されていない場合はドキュメント全体が探索対象\n const targets =\n this.nodeId !== undefined\n ? document.children.filter((node) => node.id === this.nodeId)\n : document.children\n\n // 対象ノードの子孫を探索してアイコンのコンポーネントを見つける\n targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.keys(this.components).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\n // eslint-disable-next-line no-console\n console.log('Getting export urls')\n\n const { data } = await this.client.fileImages(this.fileId, {\n format: this.exportFormat,\n ids: Object.keys(this.components),\n scale: 1,\n })\n\n for (const [id, image] of Object.entries(data.images)) {\n this.components[id].image = image\n }\n }\n\n private async downloadImages(outputDir: string) {\n return concurrently(\n Object.values(this.components).map((component) => async () => {\n if (component.image === undefined) {\n return\n }\n\n const svg = await got(component.image).text()\n\n const filename = `${filenamify(component.name)}.${this.exportFormat}`\n const fullname = path.join(outputDir, filename)\n const dirname = path.dirname(fullname)\n\n await ensureDir(dirname)\n\n // eslint-disable-next-line no-console\n console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, svg, 'utf8')\n })\n )\n }\n\n private async getFile() {\n // eslint-disable-next-line no-console\n console.log('Processing response')\n\n const { data } = await this.client.file(this.fileId.toString())\n\n return data\n }\n\n private findComponentsRecursively(child: Figma.Node) {\n if (child.type === 'COMPONENT') {\n const { name, id } = child\n\n if (isIconNode(child)) {\n this.components[id] = {\n name,\n id,\n }\n }\n } else if ('children' in child) {\n child.children.forEach((grandChild) =>\n this.findComponentsRecursively(grandChild)\n )\n }\n }\n}\n","import PQueue from 'p-queue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function concurrently(tasks: (() => Promise<any>)[]) {\n const queue = new PQueue({ concurrency: 3 })\n for (const task of tasks) {\n void queue.add(task)\n }\n queue.start()\n return queue.onIdle()\n}\n","import { Octokit } from '@octokit/rest'\nimport path from 'path'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype RefResponse = ReturnType<GithubClient['createBranch']> extends Promise<\n infer R\n>\n ? R\n : never\n\ninterface TreeItem {\n path?: string\n mode?: '100644' | '100755' | '040000' | '160000' | '120000'\n type?: 'blob' | 'commit' | 'tree'\n sha?: string | null\n content?: string\n}\n\nexport class GithubClient {\n private readonly api: Octokit\n private readonly now: Date\n\n static async runFromCli(\n repoOwner: string,\n repoName: string,\n token: string,\n defaultBranch: string,\n outputDir: string\n ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n const outputDirFullPath = path.resolve(process.cwd(), outputDir)\n const diff = await client.createTreeFromDiff(outputDirFullPath)\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n const newBranch = await client.createBranch()\n\n await client.createCommit(diff, newBranch)\n return client.createPullRequest(newBranch)\n }\n\n constructor(\n private readonly repoOwner: string,\n private readonly repoName: string,\n token: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Octokit({\n auth: token,\n })\n\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or pull request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createTreeFromDiff(outputDir: string): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles(outputDir)) {\n const item = {\n path: file.relativePath,\n // 100 はファイル 644 は実行不可なファイルであるという意味\n // @see https://octokit.github.io/rest.js/v18#git-create-tree\n mode: '100644' as const,\n content: file.content,\n }\n\n if (file.status === 'deleted') {\n // https://stackoverflow.com/questions/23637961/how-do-i-mark-a-file-as-deleted-in-a-tree-using-the-github-api\n tree.push({\n ...item,\n sha: null,\n })\n } else {\n tree.push(item)\n }\n }\n\n return tree\n }\n\n async createCommit(tree: TreeItem[], targetBranch: RefResponse) {\n const parentCommit = await this.api.git.getCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n\n commit_sha: targetBranch.data.object.sha,\n })\n\n const newTree = await this.api.git.createTree({\n owner: this.repoOwner,\n repo: this.repoName,\n\n base_tree: parentCommit.data.tree.sha,\n tree,\n })\n\n // この時点ではどのブランチにも属さないコミットができる\n const commit = await this.api.git.createCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n message: this.message,\n tree: newTree.data.sha,\n parents: [parentCommit.data.sha],\n })\n\n // ref を更新することで、commit が targetBranch に属するようになる\n await this.api.git.updateRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.branch}`,\n sha: commit.data.sha,\n })\n\n return commit\n }\n\n async createPullRequest(targetBranch: RefResponse) {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.pulls.create({\n owner: this.repoOwner,\n repo: this.repoName,\n head: targetBranch.data.ref,\n base: defaultBranch.data.ref,\n title: this.message,\n body: '',\n })\n }\n\n private getDefaultBranchRef() {\n return this.api.git.getRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.defaultBranch}`,\n })\n }\n\n async createBranch() {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.git.createRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `refs/heads/${this.branch}`,\n sha: defaultBranch.data.object.sha,\n })\n }\n}\n","import { promises as fs, existsSync } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir: string) {\n if (!existsSync(dir))\n throw new Error(`icons-cli: target directory not found (${dir})`)\n const gitStatus = await collectGitStatus()\n for (const [relativePath, status] of gitStatus) {\n const fullpath = path.resolve(process.cwd(), relativePath)\n if (!fullpath.startsWith(`${dir}/`)) {\n continue\n }\n if (!existsSync(fullpath))\n throw new Error(`icons-cli: could not load svg (${fullpath})`)\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n yield { relativePath, content, status }\n }\n}\n\nasync function collectGitStatus() {\n return new Map(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`)).split('\\n').map((s) => {\n return [\n s.slice(3),\n s.startsWith(' M')\n ? 'modified'\n : s.startsWith('??')\n ? 'untracked'\n : s.startsWith(' D')\n ? 'deleted'\n : null,\n ] as const\n })\n )\n}\n","import { exec } from 'child_process'\n\n/**\n * FIXME: util.promisify を使うと node-libs-browser に入っている方が使われてしまい、壊れる\n */\nexport const execp = (command: string) =>\n new Promise<string>((resolve, reject) => {\n exec(command, (err, stdout) => {\n if (err) {\n return reject(err)\n }\n\n return resolve(stdout)\n })\n })\n\nexport function mustBeDefined<T>(\n value: T,\n name: string\n): asserts value is NonNullable<T> {\n if (typeof value === 'undefined') {\n throw new TypeError(`${name} must be defined.`)\n }\n}\n","import type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\nimport path from 'path'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype GitlabApi = InstanceType<typeof Gitlab>\n\nexport class GitlabClient {\n private readonly api: GitlabApi\n private readonly now: Date\n\n static async runFromCli(\n host: string,\n projectId: number,\n privateToken: string,\n defaultBranch: string,\n outputDir: string\n ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n const outputDirFullPath = path.resolve(process.cwd(), outputDir)\n const diff = await client.createActionsFromDiff(outputDirFullPath)\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n await client.createCommit(diff)\n return client.createMergeRequest()\n }\n\n constructor(\n private readonly host: string,\n private readonly projectId: number,\n privateToken: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Gitlab({\n host: this.host,\n token: privateToken,\n })\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or merge request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createActionsFromDiff(outputDir: string): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles(outputDir)) {\n actions.push({\n action:\n file.status === 'untracked'\n ? 'create'\n : file.status === 'deleted'\n ? 'delete'\n : 'update',\n filePath: file.relativePath,\n content: file.content,\n })\n }\n\n return actions\n }\n\n async createCommit(diff: CommitAction[]) {\n return this.api.Commits.create(\n this.projectId,\n this.branch,\n this.message,\n diff,\n {\n start_branch: this.defaultBranch,\n }\n )\n }\n\n createMergeRequest() {\n return this.api.MergeRequests.create(\n this.projectId,\n this.branch,\n this.defaultBranch,\n this.message\n )\n }\n}\n","import { JSDOM } from 'jsdom'\nimport { parseToRgb } from 'polished'\nimport type { RgbColor, RgbaColor } from 'polished/lib/types/color'\nimport Svgo from 'svgo'\n\nexport const DEFAULT_CURRENT_COLOR_TARGET = '#858585'\n\nconst svgo = new Svgo({\n plugins: [\n // NOTICE: SVGO は「svg 内のすべての fill を currentColor に変える」機能しかない\n // icons-cli に必要なのは「特定の黒っぽい色だけ currentColor に変える」機能\n // なので、convertColors plugin は使わない\n // { convertColors: { currentColor: true } },\n { removeViewBox: false },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\n/**\n * SVGを最適化するオプション\n */\ninterface Options {\n /**\n * currentColorに置換する色 #ffffff\n */\n convertedColor: string\n /**\n * svgoによる最適化を行わない\n */\n withoutOptimizeBySVGO?: boolean\n}\n\nexport async function optimizeSvg(input: string, options: Options) {\n const { document } = new JSDOM(input).window\n const svg = document.querySelector('svg')\n if (!svg) {\n throw new Error('optimizeSvg: input string seems not to have <svg>')\n }\n\n addViewboxToRootSvg(svg)\n convertToCurrentColor(svg, options.convertedColor)\n\n if (options.withoutOptimizeBySVGO === true) {\n return svg.outerHTML\n } else {\n return (await svgo.optimize(svg.outerHTML)).data\n }\n}\n\nconst TARGET_ATTRS = ['fill', 'stroke']\n\nfunction convertToCurrentColor(svg: SVGSVGElement, convertedColor: string) {\n const targetColor = parseColor(convertedColor)\n if (!targetColor) {\n throw new Error(`${convertedColor} is not a valid color`)\n }\n\n for (const attr of TARGET_ATTRS) {\n const targets = Array.from(svg.querySelectorAll<SVGElement>(`[${attr}]`))\n\n for (const el of targets) {\n const value = parseColor(el.getAttribute(attr))\n if (!value) {\n continue\n }\n\n if (!colorEquals(value, targetColor)) {\n continue\n }\n\n el.setAttribute(attr, 'currentColor')\n }\n }\n}\n\nfunction parseColor(value: string | null) {\n if (value == null) {\n return null\n }\n\n try {\n return parseToRgb(value)\n } catch {\n return null\n }\n}\n\nfunction colorEquals(self: RgbColor | RgbaColor, other: RgbColor | RgbaColor) {\n if (self.red !== other.red) {\n return false\n }\n\n if (self.blue !== other.blue) {\n return false\n }\n\n if (self.green !== other.green) {\n return false\n }\n\n if ('alpha' in self) {\n if ('alpha' in other) {\n if (self.alpha !== other.alpha) {\n return false\n }\n }\n }\n\n return true\n}\n\nfunction addViewboxToRootSvg(svg: SVGSVGElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const width = svg.getAttribute('width')!\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import path from 'path'\nimport glob from 'fast-glob'\nimport fs from 'fs-extra'\nimport { concurrently } from '../concurrently'\nimport { optimizeSvg } from './optimizeSvg'\n\n/* eslint-disable no-console */\n\nexport const optimizeSvgInDirectory = async (\n outputDir: string,\n replaceColor: string,\n ignoreFile?: string\n) => {\n const rootDir = path.join(outputDir, 'svg')\n\n const ignorePatterns =\n ignoreFile !== undefined\n ? (await fs.readFile(ignoreFile, 'utf8')).trim().split(/\\r?\\n/u)\n : []\n\n const files = await glob('**/*.svg', {\n cwd: rootDir,\n })\n\n await concurrently(\n files.map((file) => async () => {\n console.log(`Optimizing ${file}...`)\n const fullPath = path.join(rootDir, file)\n\n const originalSvg = await fs.readFile(fullPath, 'utf8')\n const optimizedSvg = await optimizeSvg(originalSvg, {\n convertedColor: replaceColor,\n withoutOptimizeBySVGO: ignorePatterns.includes(file),\n })\n await fs.writeFile(fullPath, optimizedSvg)\n })\n )\n}\n","import path from 'path'\nimport glob from 'fast-glob'\nimport fs from 'fs-extra'\n\nconst generateIconSvgEmbeddedSource = (svgString: string) => {\n const str = svgString.replace(/\\r?\\n/g, '')\n\n return `/** This file is auto generated. DO NOT EDIT BY HAND. */\nexport default '${str}'\n`\n}\n\nconst generateMjsEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\nexport default {\n${icons\n .map((it) => ` '${it}': () => import('./${it}.js').then(m => m.default)`)\n .join(',\\n')}\n}\n`\n\nconst generateCjsEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\nmodule.exports = {\n${icons\n .map((it) => ` '${it}': () => import('./${it}.js').then(m => m.default)`)\n .join(',\\n')}\n}\n`\n\nconst generateTypeDefinitionEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOt EDIT BY HAND. */\n\ndeclare var _default: {\n${icons.map((it) => ` '${it}': () => Promise<string>`).join(';\\n')}\n};\nexport default _default;\n`\n\nexport const generateEntrypoint = async (\n outputDir: string,\n icons: string[]\n) => {\n const srcRoot = path.join(outputDir, 'src')\n const mjsPath = path.join(srcRoot, 'index.js')\n await fs.ensureFile(mjsPath)\n await fs.writeFile(mjsPath, generateMjsEntrypoint(icons))\n\n const cjsPath = path.join(srcRoot, 'index.cjs')\n await fs.ensureFile(cjsPath)\n await fs.writeFile(cjsPath, generateCjsEntrypoint(icons))\n\n const dtsPath = path.join(srcRoot, 'index.d.ts')\n await fs.ensureFile(dtsPath)\n await fs.writeFile(dtsPath, generateTypeDefinitionEntrypoint(icons))\n}\n\nexport const generateIconSource = async (outputDir: string) => {\n const svgRoot = path.join(outputDir, 'svg')\n const srcRoot = path.join(outputDir, 'src')\n const icons = (await glob('**/*.svg', { cwd: svgRoot }))\n .map(\n (path) => path.slice(0, -4) // e.g. '16/Add.svg' -> '16/Add'\n )\n .sort()\n\n for (const it of icons) {\n const data = await fs.readFile(path.join(svgRoot, `${it}.svg`))\n const outputPath = path.join(srcRoot, `${it}.js`)\n await fs.ensureFile(outputPath)\n await fs.writeFile(\n outputPath,\n generateIconSvgEmbeddedSource(data.toString())\n )\n }\n\n await generateEntrypoint(outputDir, icons)\n}\n"],"mappings":"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","names":["PQueue","camelCase","path","got","import_path","import_path","path","fs","path","import_path","path","Svgo","import_path","import_fs_extra","path","fs","glob","import_path","import_fast_glob","import_fs_extra","path","fs","glob","yargs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/figma/FigmaFileClient.ts","../src/concurrently.ts","../src/GitHubClient.ts","../src/getChangedFiles.ts","../src/utils.ts","../src/GitlabClient.ts","../src/svg/optimizeSvg.ts","../src/svg/optimizeSvgInDirectory.ts","../src/generateSource.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './figma/FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET } from './svg/optimizeSvg'\nimport { optimizeSvgInDirectory } from './svg/optimizeSvgInDirectory'\nimport { generateIconSource } from './generateSource'\nimport { mustBeDefined } from './utils'\n\n/**\n * Figma\n */\nconst FIGMA_TOKEN = process.env.FIGMA_TOKEN\nconst FIGMA_FILE_URL = process.env.FIGMA_FILE_URL\nconst OUTPUT_ROOT_DIR = process.env.OUTPUT_ROOT_DIR\n\n/**\n * GitLab\n */\nconst GITLAB_ACCESS_TOKEN = process.env.GITLAB_ACCESS_TOKEN\nconst GITLAB_DEFAULT_BRANCH = process.env.GITLAB_DEFAULT_BRANCH\nconst GITLAB_HOST = process.env.GITLAB_HOST\nconst GITLAB_PROJECT_ID = process.env.GITLAB_PROJECT_ID\n\n/**\n * GitHub\n */\nconst GITHUB_ACCESS_TOKEN = process.env.GITHUB_ACCESS_TOKEN\nconst GITHUB_REPO_OWNER = process.env.GITHUB_REPO_OWNER\nconst GITHUB_REPO_NAME = process.env.GITHUB_REPO_NAME\nconst GITHUB_DEFAULT_BRANCH = process.env.GITHUB_DEFAULT_BRANCH\n\nvoid yargs\n .scriptName('icons-cli')\n .command(\n 'figma:export',\n 'Load all icons from Figma and save to files',\n {\n format: {\n default: 'svg',\n choices: ['svg', 'pdf'],\n describe: 'Output format',\n },\n },\n async ({ format }) => {\n mustBeDefined(FIGMA_FILE_URL, 'FIGMA_FILE_URL')\n mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n )\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize svg files in output directory',\n {\n color: {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n describe: 'Color code that should be converted into `currentColor`',\n },\n ignoreFile: {\n type: 'string',\n describe:\n 'A file that contains the list of path to SVG files that should not be optimized',\n },\n },\n async ({ color, ignoreFile }) => {\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await optimizeSvgInDirectory(OUTPUT_ROOT_DIR, color, ignoreFile)\n }\n )\n .command(\n 'files:generate',\n 'Enumerate svg files in output directory and generate icon files',\n {},\n () => {\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n void generateIconSource(OUTPUT_ROOT_DIR).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'gitlab:mr',\n 'Create a merge request in the name of icons-cli',\n {},\n async () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main',\n OUTPUT_ROOT_DIR\n )\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n async () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n await GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main',\n OUTPUT_ROOT_DIR\n )\n }\n )\n .demandCommand()\n .strict()\n .help()\n .parse()\n","import path from 'path'\nimport camelCase from 'camelcase'\nimport * as Figma from 'figma-js'\nimport { ensureDir, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from '../concurrently'\n\nconst matchPath = match<{ fileId: string; name: string }>('/file/:fileId/:name')\n\nfunction extractParams(url: string): { fileId: string; nodeId?: string } {\n const { pathname, searchParams } = new URL(url)\n\n const result = matchPath(pathname)\n if (result === false) {\n throw new Error('No fileId found in url')\n }\n\n return {\n fileId: result.params.fileId,\n nodeId: searchParams.get('node-id') ?? undefined,\n }\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\nconst iconName = /^(?:\\d+|Inline)\\s*\\//u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\ninterface Component {\n id: string\n name: string\n image?: string\n}\n\nexport class FigmaFileClient {\n private readonly fileId: string\n private readonly nodeId?: string\n private readonly exportFormat: ExportFormat\n private readonly client: Figma.ClientInterface\n\n private components: Record<string, Component> = {}\n\n static async runFromCli(\n url: string,\n token: string,\n outputRootDir: string,\n exportFormat: ExportFormat\n ) {\n const client = new this(url, token, exportFormat)\n\n const outputDir = path.join(process.cwd(), outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components from ${url}`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log('success!')\n }\n\n constructor(\n url: string,\n personalAccessToken: string,\n exportFormat: ExportFormat\n ) {\n this.client = Figma.Client({\n personalAccessToken,\n })\n\n const { fileId, nodeId } = extractParams(url)\n this.fileId = fileId\n this.nodeId = nodeId\n\n this.exportFormat = exportFormat\n }\n\n async loadSvg(outputDir: string) {\n await remove(outputDir)\n await ensureDir(outputDir)\n\n await this.loadComponents()\n await this.loadImageUrls()\n await this.downloadImages(outputDir)\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n // nodeIdが指定されている場合は、IDが一致するノードのみを探索対象にする\n // 指定されていない場合はドキュメント全体が探索対象\n const targets =\n this.nodeId !== undefined\n ? document.children.filter((node) => node.id === this.nodeId)\n : document.children\n\n // 対象ノードの子孫を探索してアイコンのコンポーネントを見つける\n targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.keys(this.components).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\n // eslint-disable-next-line no-console\n console.log('Getting export urls')\n\n const { data } = await this.client.fileImages(this.fileId, {\n format: this.exportFormat,\n ids: Object.keys(this.components),\n scale: 1,\n })\n\n for (const [id, image] of Object.entries(data.images)) {\n this.components[id].image = image\n }\n }\n\n private async downloadImages(outputDir: string) {\n return concurrently(\n Object.values(this.components).map((component) => async () => {\n if (component.image === undefined) {\n return\n }\n\n const svg = await got(component.image).text()\n\n const filename = `${filenamify(component.name)}.${this.exportFormat}`\n const fullname = path.join(outputDir, filename)\n const dirname = path.dirname(fullname)\n\n await ensureDir(dirname)\n\n // eslint-disable-next-line no-console\n console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, svg, 'utf8')\n })\n )\n }\n\n private async getFile() {\n // eslint-disable-next-line no-console\n console.log('Processing response')\n\n const { data } = await this.client.file(this.fileId.toString())\n\n return data\n }\n\n private findComponentsRecursively(child: Figma.Node) {\n if (child.type === 'COMPONENT') {\n const { name, id } = child\n\n if (isIconNode(child)) {\n this.components[id] = {\n name,\n id,\n }\n }\n } else if ('children' in child) {\n child.children.forEach((grandChild) =>\n this.findComponentsRecursively(grandChild)\n )\n }\n }\n}\n","import PQueue from 'p-queue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function concurrently(tasks: (() => Promise<any>)[]) {\n const queue = new PQueue({ concurrency: 3 })\n for (const task of tasks) {\n void queue.add(task)\n }\n queue.start()\n return queue.onIdle()\n}\n","import { Octokit } from '@octokit/rest'\nimport path from 'path'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype RefResponse = ReturnType<GithubClient['createBranch']> extends Promise<\n infer R\n>\n ? R\n : never\n\ninterface TreeItem {\n path?: string\n mode?: '100644' | '100755' | '040000' | '160000' | '120000'\n type?: 'blob' | 'commit' | 'tree'\n sha?: string | null\n content?: string\n}\n\nexport class GithubClient {\n private readonly api: Octokit\n private readonly now: Date\n\n static async runFromCli(\n repoOwner: string,\n repoName: string,\n token: string,\n defaultBranch: string,\n outputDir: string\n ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n const outputDirFullPath = path.resolve(process.cwd(), outputDir)\n const diff = await client.createTreeFromDiff(outputDirFullPath)\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n const newBranch = await client.createBranch()\n\n await client.createCommit(diff, newBranch)\n return client.createPullRequest(newBranch)\n }\n\n constructor(\n private readonly repoOwner: string,\n private readonly repoName: string,\n token: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Octokit({\n auth: token,\n })\n\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or pull request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createTreeFromDiff(outputDir: string): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles(outputDir)) {\n const item = {\n path: file.relativePath,\n // 100 はファイル 644 は実行不可なファイルであるという意味\n // @see https://octokit.github.io/rest.js/v18#git-create-tree\n mode: '100644' as const,\n content: file.content,\n }\n\n if (file.status === 'deleted') {\n // https://stackoverflow.com/questions/23637961/how-do-i-mark-a-file-as-deleted-in-a-tree-using-the-github-api\n tree.push({\n ...item,\n sha: null,\n })\n } else {\n tree.push(item)\n }\n }\n\n return tree\n }\n\n async createCommit(tree: TreeItem[], targetBranch: RefResponse) {\n const parentCommit = await this.api.git.getCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n\n commit_sha: targetBranch.data.object.sha,\n })\n\n const newTree = await this.api.git.createTree({\n owner: this.repoOwner,\n repo: this.repoName,\n\n base_tree: parentCommit.data.tree.sha,\n tree,\n })\n\n // この時点ではどのブランチにも属さないコミットができる\n const commit = await this.api.git.createCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n message: this.message,\n tree: newTree.data.sha,\n parents: [parentCommit.data.sha],\n })\n\n // ref を更新することで、commit が targetBranch に属するようになる\n await this.api.git.updateRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.branch}`,\n sha: commit.data.sha,\n })\n\n return commit\n }\n\n async createPullRequest(targetBranch: RefResponse) {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.pulls.create({\n owner: this.repoOwner,\n repo: this.repoName,\n head: targetBranch.data.ref,\n base: defaultBranch.data.ref,\n title: this.message,\n body: '',\n })\n }\n\n private getDefaultBranchRef() {\n return this.api.git.getRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.defaultBranch}`,\n })\n }\n\n async createBranch() {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.git.createRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `refs/heads/${this.branch}`,\n sha: defaultBranch.data.object.sha,\n })\n }\n}\n","import { promises as fs, existsSync } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir: string) {\n if (!existsSync(dir))\n throw new Error(`icons-cli: target directory not found (${dir})`)\n const gitStatus = await collectGitStatus()\n for (const [relativePath, status] of gitStatus) {\n const fullpath = path.resolve(process.cwd(), relativePath)\n if (!fullpath.startsWith(`${dir}/`)) {\n continue\n }\n if (!existsSync(fullpath))\n throw new Error(`icons-cli: could not load svg (${fullpath})`)\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n yield { relativePath, content, status }\n }\n}\n\nasync function collectGitStatus() {\n return new Map(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`)).split('\\n').map((s) => {\n return [\n s.slice(3),\n s.startsWith(' M')\n ? 'modified'\n : s.startsWith('??')\n ? 'untracked'\n : s.startsWith(' D')\n ? 'deleted'\n : null,\n ] as const\n })\n )\n}\n","import { exec } from 'child_process'\n\n/**\n * FIXME: util.promisify を使うと node-libs-browser に入っている方が使われてしまい、壊れる\n */\nexport const execp = (command: string) =>\n new Promise<string>((resolve, reject) => {\n exec(command, (err, stdout) => {\n if (err) {\n return reject(err)\n }\n\n return resolve(stdout)\n })\n })\n\nexport function mustBeDefined<T>(\n value: T,\n name: string\n): asserts value is NonNullable<T> {\n if (typeof value === 'undefined') {\n throw new TypeError(`${name} must be defined.`)\n }\n}\n","import type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\nimport path from 'path'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype GitlabApi = InstanceType<typeof Gitlab>\n\nexport class GitlabClient {\n private readonly api: GitlabApi\n private readonly now: Date\n\n static async runFromCli(\n host: string,\n projectId: number,\n privateToken: string,\n defaultBranch: string,\n outputDir: string\n ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n const outputDirFullPath = path.resolve(process.cwd(), outputDir)\n const diff = await client.createActionsFromDiff(outputDirFullPath)\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n await client.createCommit(diff)\n return client.createMergeRequest()\n }\n\n constructor(\n private readonly host: string,\n private readonly projectId: number,\n privateToken: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Gitlab({\n host: this.host,\n token: privateToken,\n })\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or merge request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createActionsFromDiff(outputDir: string): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles(outputDir)) {\n actions.push({\n action:\n file.status === 'untracked'\n ? 'create'\n : file.status === 'deleted'\n ? 'delete'\n : 'update',\n filePath: file.relativePath,\n content: file.content,\n })\n }\n\n return actions\n }\n\n async createCommit(diff: CommitAction[]) {\n return this.api.Commits.create(\n this.projectId,\n this.branch,\n this.message,\n diff,\n {\n start_branch: this.defaultBranch,\n }\n )\n }\n\n createMergeRequest() {\n return this.api.MergeRequests.create(\n this.projectId,\n this.branch,\n this.defaultBranch,\n this.message\n )\n }\n}\n","import { JSDOM } from 'jsdom'\nimport { parseToRgb } from 'polished'\nimport type { RgbColor, RgbaColor } from 'polished/lib/types/color'\nimport Svgo from 'svgo'\n\nexport const DEFAULT_CURRENT_COLOR_TARGET = '#858585'\n\nconst svgo = new Svgo({\n plugins: [\n // NOTICE: SVGO は「svg 内のすべての fill を currentColor に変える」機能しかない\n // icons-cli に必要なのは「特定の黒っぽい色だけ currentColor に変える」機能\n // なので、convertColors plugin は使わない\n // { convertColors: { currentColor: true } },\n { removeViewBox: false },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\n/**\n * SVGを最適化するオプション\n */\ninterface Options {\n /**\n * currentColorに置換する色 #ffffff\n */\n convertedColor: string\n /**\n * svgoによる最適化を行わない\n */\n withoutOptimizeBySVGO?: boolean\n}\n\nexport async function optimizeSvg(input: string, options: Options) {\n const { document } = new JSDOM(input).window\n const svg = document.querySelector('svg')\n if (!svg) {\n throw new Error('optimizeSvg: input string seems not to have <svg>')\n }\n\n addViewboxToRootSvg(svg)\n convertToCurrentColor(svg, options.convertedColor)\n\n if (options.withoutOptimizeBySVGO === true) {\n return svg.outerHTML\n } else {\n return (await svgo.optimize(svg.outerHTML)).data\n }\n}\n\nconst TARGET_ATTRS = ['fill', 'stroke']\n\nfunction convertToCurrentColor(svg: SVGSVGElement, convertedColor: string) {\n const targetColor = parseColor(convertedColor)\n if (!targetColor) {\n throw new Error(`${convertedColor} is not a valid color`)\n }\n\n for (const attr of TARGET_ATTRS) {\n const targets = Array.from(svg.querySelectorAll<SVGElement>(`[${attr}]`))\n\n for (const el of targets) {\n const value = parseColor(el.getAttribute(attr))\n if (!value) {\n continue\n }\n\n if (!colorEquals(value, targetColor)) {\n continue\n }\n\n el.setAttribute(attr, 'currentColor')\n }\n }\n}\n\nfunction parseColor(value: string | null) {\n if (value == null) {\n return null\n }\n\n try {\n return parseToRgb(value)\n } catch {\n return null\n }\n}\n\nfunction colorEquals(self: RgbColor | RgbaColor, other: RgbColor | RgbaColor) {\n if (self.red !== other.red) {\n return false\n }\n\n if (self.blue !== other.blue) {\n return false\n }\n\n if (self.green !== other.green) {\n return false\n }\n\n if ('alpha' in self) {\n if ('alpha' in other) {\n if (self.alpha !== other.alpha) {\n return false\n }\n }\n }\n\n return true\n}\n\nfunction addViewboxToRootSvg(svg: SVGSVGElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const width = svg.getAttribute('width')!\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import path from 'path'\nimport glob from 'fast-glob'\nimport fs from 'fs-extra'\nimport { concurrently } from '../concurrently'\nimport { optimizeSvg } from './optimizeSvg'\n\n/* eslint-disable no-console */\n\nexport const optimizeSvgInDirectory = async (\n outputDir: string,\n replaceColor: string,\n ignoreFile?: string\n) => {\n const rootDir = path.join(outputDir, 'svg')\n\n const ignorePatterns =\n ignoreFile !== undefined\n ? (await fs.readFile(ignoreFile, 'utf8')).trim().split(/\\r?\\n/u)\n : []\n\n const files = await glob('**/*.svg', {\n cwd: rootDir,\n })\n\n await concurrently(\n files.map((file) => async () => {\n console.log(`Optimizing ${file}...`)\n const fullPath = path.join(rootDir, file)\n\n const originalSvg = await fs.readFile(fullPath, 'utf8')\n const optimizedSvg = await optimizeSvg(originalSvg, {\n convertedColor: replaceColor,\n withoutOptimizeBySVGO: ignorePatterns.includes(file),\n })\n await fs.writeFile(fullPath, optimizedSvg)\n })\n )\n}\n","import path from 'path'\nimport glob from 'fast-glob'\nimport fs from 'fs-extra'\n\nconst generateIconSvgEmbeddedSource = (svgString: string) => {\n const str = svgString.replace(/\\r?\\n/g, '')\n\n return `/** This file is auto generated. DO NOT EDIT BY HAND. */\nexport default '${str}'\n`\n}\n\nconst generateMjsEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\nexport default {\n${icons\n .map((it) => ` '${it}': () => import('./${it}.js').then(m => m.default)`)\n .join(',\\n')}\n}\n`\n\nconst generateCjsEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\nmodule.exports = {\n${icons\n .map((it) => ` '${it}': () => import('./${it}.js').then(m => m.default)`)\n .join(',\\n')}\n}\n`\n\nconst generateTypeDefinitionEntrypoint = (\n icons: string[]\n) => `/** This file is auto generated. DO NOt EDIT BY HAND. */\n\ndeclare var _default: {\n${icons.map((it) => ` '${it}': () => Promise<string>`).join(';\\n')}\n};\nexport default _default;\n`\n\nexport const generateEntrypoint = async (\n outputDir: string,\n icons: string[]\n) => {\n const srcRoot = path.join(outputDir, 'src')\n const mjsPath = path.join(srcRoot, 'index.js')\n await fs.ensureFile(mjsPath)\n await fs.writeFile(mjsPath, generateMjsEntrypoint(icons))\n\n const cjsPath = path.join(srcRoot, 'index.cjs')\n await fs.ensureFile(cjsPath)\n await fs.writeFile(cjsPath, generateCjsEntrypoint(icons))\n\n const dtsPath = path.join(srcRoot, 'index.d.ts')\n await fs.ensureFile(dtsPath)\n await fs.writeFile(dtsPath, generateTypeDefinitionEntrypoint(icons))\n}\n\nexport const generateIconSource = async (outputDir: string) => {\n const svgRoot = path.join(outputDir, 'svg')\n const srcRoot = path.join(outputDir, 'src')\n const icons = (await glob('**/*.svg', { cwd: svgRoot }))\n .map(\n (path) => path.slice(0, -4) // e.g. '16/Add.svg' -> '16/Add'\n )\n .sort()\n\n for (const it of icons) {\n const data = await fs.readFile(path.join(svgRoot, `${it}.svg`))\n const outputPath = path.join(srcRoot, `${it}.js`)\n await fs.ensureFile(outputPath)\n await fs.writeFile(\n outputPath,\n generateIconSvgEmbeddedSource(data.toString())\n )\n }\n\n await generateEntrypoint(outputDir, icons)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,mBAAkB;;;ACFlB,kBAAiB;AACjB,uBAAsB;AACtB,YAAuB;AACvB,sBAA6C;AAC7C,iBAAgB;AAChB,4BAAsB;;;ACLtB,qBAAmB;AAGZ,SAAS,aAAa,OAA+B;AAC1D,QAAM,QAAQ,IAAI,eAAAA,QAAO,EAAE,aAAa,EAAE,CAAC;AAC3C,aAAW,QAAQ,OAAO;AACxB,SAAK,MAAM,IAAI,IAAI;AAAA,EACrB;AACA,QAAM,MAAM;AACZ,SAAO,MAAM,OAAO;AACtB;;;ADFA,IAAM,gBAAY,6BAAwC,qBAAqB;AAE/E,SAAS,cAAc,KAAkD;AACvE,QAAM,EAAE,UAAU,aAAa,IAAI,IAAI,IAAI,GAAG;AAE9C,QAAM,SAAS,UAAU,QAAQ;AACjC,MAAI,WAAW,OAAO;AACpB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,QAAQ,OAAO,OAAO;AAAA,IACtB,QAAQ,aAAa,IAAI,SAAS,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,WAAW,MAAc;AAChC,aAAO,iBAAAC,SAAU,MAAM,EAAE,YAAY,KAAK,CAAC,EAAE,QAAQ,KAAK,EAAE;AAC9D;AAEA,IAAM,WAAW;AAEjB,SAAS,WAAW,MAAkB;AACpC,SAAO,SAAS,KAAK,KAAK,IAAI;AAChC;AAUO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,aAAwC,CAAC;AAAA,EAEjD,aAAa,WACX,KACA,OACA,eACA,cACA;AACA,UAAM,SAAS,IAAI,KAAK,KAAK,OAAO,YAAY;AAEhD,UAAM,YAAY,YAAAC,QAAK,KAAK,QAAQ,IAAI,GAAG,eAAe,YAAY;AAGtE,YAAQ,IAAI,6BAA6B,KAAK;AAC9C,UAAM,OAAO,QAAQ,SAAS;AAG9B,YAAQ,IAAI,UAAU;AAAA,EACxB;AAAA,EAEA,YACE,KACA,qBACA,cACA;AACA,SAAK,SAAe,aAAO;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,EAAE,QAAQ,OAAO,IAAI,cAAc,GAAG;AAC5C,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,WAAmB;AAC/B,cAAM,wBAAO,SAAS;AACtB,cAAM,2BAAU,SAAS;AAEzB,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,eAAe,SAAS;AAAA,EACrC;AAAA,EAEA,MAAc,iBAAiB;AAC7B,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,QAAQ;AAIxC,UAAM,UACJ,KAAK,WAAW,SACZ,SAAS,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,KAAK,MAAM,IAC1D,SAAS;AAGf,YAAQ,QAAQ,CAAC,UAAU,KAAK,0BAA0B,KAAK,CAAC;AAEhE,QAAI,OAAO,KAAK,KAAK,UAAU,EAAE,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB;AAE5B,YAAQ,IAAI,qBAAqB;AAEjC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAO,WAAW,KAAK,QAAQ;AAAA,MACzD,QAAQ,KAAK;AAAA,MACb,KAAK,OAAO,KAAK,KAAK,UAAU;AAAA,MAChC,OAAO;AAAA,IACT,CAAC;AAED,eAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACrD,WAAK,WAAW,EAAE,EAAE,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,WAAmB;AAC9C,WAAO;AAAA,MACL,OAAO,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC,cAAc,YAAY;AAC5D,YAAI,UAAU,UAAU,QAAW;AACjC;AAAA,QACF;AAEA,cAAM,MAAM,UAAM,WAAAC,SAAI,UAAU,KAAK,EAAE,KAAK;AAE5C,cAAM,WAAW,GAAG,WAAW,UAAU,IAAI,KAAK,KAAK;AACvD,cAAM,WAAW,YAAAD,QAAK,KAAK,WAAW,QAAQ;AAC9C,cAAM,UAAU,YAAAA,QAAK,QAAQ,QAAQ;AAErC,kBAAM,2BAAU,OAAO;AAGvB,gBAAQ,IAAI,UAAU,+BAA0B;AAChD,kBAAM,2BAAU,UAAU,KAAK,MAAM;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,UAAU;AAEtB,YAAQ,IAAI,qBAAqB;AAEjC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO,SAAS,CAAC;AAE9D,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,OAAmB;AACnD,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,EAAE,MAAM,GAAG,IAAI;AAErB,UAAI,WAAW,KAAK,GAAG;AACrB,aAAK,WAAW,EAAE,IAAI;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,cAAc,OAAO;AAC9B,YAAM,SAAS;AAAA,QAAQ,CAAC,eACtB,KAAK,0BAA0B,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;;;AE7KA,kBAAwB;AACxB,IAAAE,eAAiB;;;ACDjB,gBAA2C;AAC3C,IAAAC,eAAiB;;;ACDjB,2BAAqB;AAKd,IAAM,QAAQ,CAAC,YACpB,IAAI,QAAgB,CAAC,SAAS,WAAW;AACvC,iCAAK,SAAS,CAAC,KAAK,WAAW;AAC7B,QAAI,KAAK;AACP,aAAO,OAAO,GAAG;AAAA,IACnB;AAEA,WAAO,QAAQ,MAAM;AAAA,EACvB,CAAC;AACH,CAAC;AAEI,SAAS,cACd,OACA,MACiC;AACjC,MAAI,OAAO,UAAU,aAAa;AAChC,UAAM,IAAI,UAAU,GAAG,uBAAuB;AAAA,EAChD;AACF;;;ADhBA,gBAAuB,gBAAgB,KAAa;AAClD,MAAI,KAAC,sBAAW,GAAG;AACjB,UAAM,IAAI,MAAM,0CAA0C,MAAM;AAClE,QAAM,YAAY,MAAM,iBAAiB;AACzC,aAAW,CAAC,cAAc,MAAM,KAAK,WAAW;AAC9C,UAAM,WAAW,aAAAC,QAAK,QAAQ,QAAQ,IAAI,GAAG,YAAY;AACzD,QAAI,CAAC,SAAS,WAAW,GAAG,MAAM,GAAG;AACnC;AAAA,IACF;AACA,QAAI,KAAC,sBAAW,QAAQ;AACtB,YAAM,IAAI,MAAM,kCAAkC,WAAW;AAC/D,UAAM,UAAU,MAAM,UAAAC,SAAG,SAAS,UAAU,EAAE,UAAU,QAAQ,CAAC;AACjE,UAAM,EAAE,cAAc,SAAS,OAAO;AAAA,EACxC;AACF;AAEA,eAAe,mBAAmB;AAChC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,KAIR,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM;AAC7D,aAAO;AAAA,QACL,EAAE,MAAM,CAAC;AAAA,QACT,EAAE,WAAW,IAAI,IACb,aACA,EAAE,WAAW,IAAI,IACjB,cACA,EAAE,WAAW,IAAI,IACjB,YACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ADvBO,IAAM,eAAN,MAAmB;AAAA,EA4BxB,YACmB,WACA,UACjB,OACiB,eACjB,MAAM,oBAAI,KAAK,GACf;AALiB;AACA;AAEA;AAGjB,SAAK,MAAM,IAAI,oBAAQ;AAAA,MACrB,MAAM;AAAA,IACR,CAAC;AAED,SAAK,MAAM;AAAA,EACb;AAAA,EAvCiB;AAAA,EACA;AAAA,EAEjB,aAAa,WACX,WACA,UACA,OACA,eACA,WACA;AACA,UAAM,SAAS,IAAI,KAAK,WAAW,UAAU,OAAO,aAAa;AACjE,UAAM,oBAAoB,aAAAC,QAAK,QAAQ,QAAQ,IAAI,GAAG,SAAS;AAC/D,UAAM,OAAO,MAAM,OAAO,mBAAmB,iBAAiB;AAE9D,YAAQ,IAAI,GAAG,KAAK,0BAA0B;AAC9C,QAAI,KAAK,WAAW,GAAG;AAErB,cAAQ,IAAI,sBAAsB;AAClC;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,OAAO,aAAa;AAE5C,UAAM,OAAO,aAAa,MAAM,SAAS;AACzC,WAAO,OAAO,kBAAkB,SAAS;AAAA,EAC3C;AAAA,EAgBA,IAAI,SAAS;AACX,WAAO,gBAAgB,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,WAAO,4BAA4B,KAAK,IAAI,aAAa;AAAA,EAC3D;AAAA,EAEA,MAAM,mBAAmB,WAAwC;AAC/D,UAAM,OAAmB,CAAC;AAE1B,qBAAiB,QAAQ,gBAAgB,SAAS,GAAG;AACnD,YAAM,OAAO;AAAA,QACX,MAAM,KAAK;AAAA;AAAA;AAAA,QAGX,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB;AAEA,UAAI,KAAK,WAAW,WAAW;AAE7B,aAAK,KAAK;AAAA,UACR,GAAG;AAAA,UACH,KAAK;AAAA,QACP,CAAC;AAAA,MACH,OAAO;AACL,aAAK,KAAK,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,MAAkB,cAA2B;AAC9D,UAAM,eAAe,MAAM,KAAK,IAAI,IAAI,UAAU;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MAEX,YAAY,aAAa,KAAK,OAAO;AAAA,IACvC,CAAC;AAED,UAAM,UAAU,MAAM,KAAK,IAAI,IAAI,WAAW;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MAEX,WAAW,aAAa,KAAK,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAGD,UAAM,SAAS,MAAM,KAAK,IAAI,IAAI,aAAa;AAAA,MAC7C,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,QAAQ,KAAK;AAAA,MACnB,SAAS,CAAC,aAAa,KAAK,GAAG;AAAA,IACjC,CAAC;AAGD,UAAM,KAAK,IAAI,IAAI,UAAU;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,KAAK,SAAS,KAAK;AAAA,MACnB,KAAK,OAAO,KAAK;AAAA,IACnB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,cAA2B;AACjD,UAAM,gBAAgB,MAAM,KAAK,oBAAoB;AAErD,WAAO,KAAK,IAAI,MAAM,OAAO;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,MAAM,aAAa,KAAK;AAAA,MACxB,MAAM,cAAc,KAAK;AAAA,MACzB,OAAO,KAAK;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB;AAC5B,WAAO,KAAK,IAAI,IAAI,OAAO;AAAA,MACzB,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,KAAK,SAAS,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe;AACnB,UAAM,gBAAgB,MAAM,KAAK,oBAAoB;AAErD,WAAO,KAAK,IAAI,IAAI,UAAU;AAAA,MAC5B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,KAAK,cAAc,KAAK;AAAA,MACxB,KAAK,cAAc,KAAK,OAAO;AAAA,IACjC,CAAC;AAAA,EACH;AACF;;;AGnKA,kBAAuB;AACvB,IAAAC,eAAiB;AAKV,IAAM,eAAN,MAAmB;AAAA,EA0BxB,YACmB,MACA,WACjB,cACiB,eACjB,MAAM,oBAAI,KAAK,GACf;AALiB;AACA;AAEA;AAGjB,SAAK,MAAM,IAAI,mBAAO;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,IACT,CAAC;AACD,SAAK,MAAM;AAAA,EACb;AAAA,EArCiB;AAAA,EACA;AAAA,EAEjB,aAAa,WACX,MACA,WACA,cACA,eACA,WACA;AACA,UAAM,SAAS,IAAI,KAAK,MAAM,WAAW,cAAc,aAAa;AACpE,UAAM,oBAAoB,aAAAC,QAAK,QAAQ,QAAQ,IAAI,GAAG,SAAS;AAC/D,UAAM,OAAO,MAAM,OAAO,sBAAsB,iBAAiB;AAEjE,YAAQ,IAAI,GAAG,KAAK,0BAA0B;AAC9C,QAAI,KAAK,WAAW,GAAG;AAErB,cAAQ,IAAI,sBAAsB;AAClC;AAAA,IACF;AAEA,UAAM,OAAO,aAAa,IAAI;AAC9B,WAAO,OAAO,mBAAmB;AAAA,EACnC;AAAA,EAgBA,IAAI,SAAS;AACX,WAAO,gBAAgB,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,WAAO,4BAA4B,KAAK,IAAI,aAAa;AAAA,EAC3D;AAAA,EAEA,MAAM,sBAAsB,WAA4C;AACtE,UAAM,UAA0B,CAAC;AAEjC,qBAAiB,QAAQ,gBAAgB,SAAS,GAAG;AACnD,cAAQ,KAAK;AAAA,QACX,QACE,KAAK,WAAW,cACZ,WACA,KAAK,WAAW,YAChB,WACA;AAAA,QACN,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,MAAsB;AACvC,WAAO,KAAK,IAAI,QAAQ;AAAA,MACtB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACE,cAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,WAAO,KAAK,IAAI,cAAc;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;;;ACjGA,mBAAsB;AACtB,sBAA2B;AAE3B,kBAAiB;AAEV,IAAM,+BAA+B;AAE5C,IAAM,OAAO,IAAI,YAAAC,QAAK;AAAA,EACpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKP,EAAE,eAAe,MAAM;AAAA,IACvB,EAAE,aAAa,EAAE,OAAO,CAAC,kBAAkB,cAAc,EAAE,EAAE;AAAA,EAC/D;AACF,CAAC;AAgBD,eAAsB,YAAY,OAAe,SAAkB;AACjE,QAAM,EAAE,SAAS,IAAI,IAAI,mBAAM,KAAK,EAAE;AACtC,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,sBAAoB,GAAG;AACvB,wBAAsB,KAAK,QAAQ,cAAc;AAEjD,MAAI,QAAQ,0BAA0B,MAAM;AAC1C,WAAO,IAAI;AAAA,EACb,OAAO;AACL,YAAQ,MAAM,KAAK,SAAS,IAAI,SAAS,GAAG;AAAA,EAC9C;AACF;AAEA,IAAM,eAAe,CAAC,QAAQ,QAAQ;AAEtC,SAAS,sBAAsB,KAAoB,gBAAwB;AACzE,QAAM,cAAc,WAAW,cAAc;AAC7C,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,GAAG,qCAAqC;AAAA,EAC1D;AAEA,aAAW,QAAQ,cAAc;AAC/B,UAAM,UAAU,MAAM,KAAK,IAAI,iBAA6B,IAAI,OAAO,CAAC;AAExE,eAAW,MAAM,SAAS;AACxB,YAAM,QAAQ,WAAW,GAAG,aAAa,IAAI,CAAC;AAC9C,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,UAAI,CAAC,YAAY,OAAO,WAAW,GAAG;AACpC;AAAA,MACF;AAEA,SAAG,aAAa,MAAM,cAAc;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAsB;AACxC,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,eAAO,4BAAW,KAAK;AAAA,EACzB,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,MAA4B,OAA6B;AAC5E,MAAI,KAAK,QAAQ,MAAM,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,UAAU,MAAM,OAAO;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,MAAM;AACnB,QAAI,WAAW,OAAO;AACpB,UAAI,KAAK,UAAU,MAAM,OAAO;AAC9B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,KAAoB;AAE/C,QAAM,QAAQ,IAAI,aAAa,OAAO;AAEtC,QAAM,SAAS,IAAI,aAAa,QAAQ;AAExC,MAAI,aAAa,WAAW,OAAO,SAAS,QAAQ;AACtD;;;ACtHA,IAAAC,eAAiB;AACjB,uBAAiB;AACjB,IAAAC,mBAAe;AAMR,IAAM,yBAAyB,OACpC,WACA,cACA,eACG;AACH,QAAM,UAAU,aAAAC,QAAK,KAAK,WAAW,KAAK;AAE1C,QAAM,iBACJ,eAAe,UACV,MAAM,iBAAAC,QAAG,SAAS,YAAY,MAAM,GAAG,KAAK,EAAE,MAAM,QAAQ,IAC7D,CAAC;AAEP,QAAM,QAAQ,UAAM,iBAAAC,SAAK,YAAY;AAAA,IACnC,KAAK;AAAA,EACP,CAAC;AAED,QAAM;AAAA,IACJ,MAAM,IAAI,CAAC,SAAS,YAAY;AAC9B,cAAQ,IAAI,cAAc,SAAS;AACnC,YAAM,WAAW,aAAAF,QAAK,KAAK,SAAS,IAAI;AAExC,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,UAAU,MAAM;AACtD,YAAM,eAAe,MAAM,YAAY,aAAa;AAAA,QAClD,gBAAgB;AAAA,QAChB,uBAAuB,eAAe,SAAS,IAAI;AAAA,MACrD,CAAC;AACD,YAAM,iBAAAA,QAAG,UAAU,UAAU,YAAY;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;;;ACrCA,IAAAE,eAAiB;AACjB,IAAAC,oBAAiB;AACjB,IAAAC,mBAAe;AAEf,IAAM,gCAAgC,CAAC,cAAsB;AAC3D,QAAM,MAAM,UAAU,QAAQ,UAAU,EAAE;AAE1C,SAAO;AAAA,kBACS;AAAA;AAElB;AAEA,IAAM,wBAAwB,CAC5B,UACG;AAAA;AAAA;AAAA,EAGH,MACC,IAAI,CAAC,OAAO,MAAM,wBAAwB,8BAA8B,EACxE,KAAK,KAAK;AAAA;AAAA;AAIb,IAAM,wBAAwB,CAC5B,UACG;AAAA;AAAA;AAAA,EAGH,MACC,IAAI,CAAC,OAAO,MAAM,wBAAwB,8BAA8B,EACxE,KAAK,KAAK;AAAA;AAAA;AAIb,IAAM,mCAAmC,CACvC,UACG;AAAA;AAAA;AAAA,EAGH,MAAM,IAAI,CAAC,OAAO,MAAM,4BAA4B,EAAE,KAAK,KAAK;AAAA;AAAA;AAAA;AAK3D,IAAM,qBAAqB,OAChC,WACA,UACG;AACH,QAAM,UAAU,aAAAC,QAAK,KAAK,WAAW,KAAK;AAC1C,QAAM,UAAU,aAAAA,QAAK,KAAK,SAAS,UAAU;AAC7C,QAAM,iBAAAC,QAAG,WAAW,OAAO;AAC3B,QAAM,iBAAAA,QAAG,UAAU,SAAS,sBAAsB,KAAK,CAAC;AAExD,QAAM,UAAU,aAAAD,QAAK,KAAK,SAAS,WAAW;AAC9C,QAAM,iBAAAC,QAAG,WAAW,OAAO;AAC3B,QAAM,iBAAAA,QAAG,UAAU,SAAS,sBAAsB,KAAK,CAAC;AAExD,QAAM,UAAU,aAAAD,QAAK,KAAK,SAAS,YAAY;AAC/C,QAAM,iBAAAC,QAAG,WAAW,OAAO;AAC3B,QAAM,iBAAAA,QAAG,UAAU,SAAS,iCAAiC,KAAK,CAAC;AACrE;AAEO,IAAM,qBAAqB,OAAO,cAAsB;AAC7D,QAAM,UAAU,aAAAD,QAAK,KAAK,WAAW,KAAK;AAC1C,QAAM,UAAU,aAAAA,QAAK,KAAK,WAAW,KAAK;AAC1C,QAAM,SAAS,UAAM,kBAAAE,SAAK,YAAY,EAAE,KAAK,QAAQ,CAAC,GACnD;AAAA,IACC,CAACF,UAASA,MAAK,MAAM,GAAG,EAAE;AAAA;AAAA,EAC5B,EACC,KAAK;AAER,aAAW,MAAM,OAAO;AACtB,UAAM,OAAO,MAAM,iBAAAC,QAAG,SAAS,aAAAD,QAAK,KAAK,SAAS,GAAG,QAAQ,CAAC;AAC9D,UAAM,aAAa,aAAAA,QAAK,KAAK,SAAS,GAAG,OAAO;AAChD,UAAM,iBAAAC,QAAG,WAAW,UAAU;AAC9B,UAAM,iBAAAA,QAAG;AAAA,MACP;AAAA,MACA,8BAA8B,KAAK,SAAS,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,mBAAmB,WAAW,KAAK;AAC3C;;;ATpEA,IAAM,cAAc,QAAQ,IAAI;AAChC,IAAM,iBAAiB,QAAQ,IAAI;AACnC,IAAM,kBAAkB,QAAQ,IAAI;AAKpC,IAAM,sBAAsB,QAAQ,IAAI;AACxC,IAAM,wBAAwB,QAAQ,IAAI;AAC1C,IAAM,cAAc,QAAQ,IAAI;AAChC,IAAM,oBAAoB,QAAQ,IAAI;AAKtC,IAAM,sBAAsB,QAAQ,IAAI;AACxC,IAAM,oBAAoB,QAAQ,IAAI;AACtC,IAAM,mBAAmB,QAAQ,IAAI;AACrC,IAAM,wBAAwB,QAAQ,IAAI;AAE1C,KAAK,aAAAE,QACF,WAAW,WAAW,EACtB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,OAAO,KAAK;AAAA,MACtB,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,OAAO,EAAE,OAAO,MAAM;AACpB,kBAAc,gBAAgB,gBAAgB;AAC9C,kBAAc,aAAa,aAAa;AACxC,kBAAc,iBAAiB,iBAAiB;AAEhD,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,OAAO,EAAE,OAAO,WAAW,MAAM;AAC/B,kBAAc,iBAAiB,iBAAiB;AAEhD,UAAM,uBAAuB,iBAAiB,OAAO,UAAU;AAAA,EACjE;AACF,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,MAAM;AACJ,kBAAc,iBAAiB,iBAAiB;AAEhD,SAAK,mBAAmB,eAAe,EAAE,MAAM,CAAC,MAAM;AAEpD,cAAQ,MAAM,CAAC;AACf,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AACF,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY;AACV,kBAAc,mBAAmB,mBAAmB;AACpD,kBAAc,qBAAqB,qBAAqB;AACxD,kBAAc,iBAAiB,iBAAiB;AAEhD,UAAM,aAAa;AAAA,MACjB,eAAe;AAAA,MACf,OAAO,iBAAiB;AAAA,MACxB;AAAA,MACA,yBAAyB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY;AACV,kBAAc,qBAAqB,qBAAqB;AACxD,kBAAc,iBAAiB,iBAAiB;AAEhD,UAAM,aAAa;AAAA,MACjB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB;AAAA,MACA,yBAAyB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF,EACC,cAAc,EACd,OAAO,EACP,KAAK,EACL,MAAM;","names":["PQueue","camelCase","path","got","import_path","import_path","path","fs","path","import_path","path","Svgo","import_path","import_fs_extra","path","fs","glob","import_path","import_fast_glob","import_fs_extra","path","fs","glob","yargs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@charcoal-ui/icons-cli",
3
- "version": "4.2.1",
3
+ "version": "4.3.0-beta.1",
4
4
  "license": "Apache-2.0",
5
5
  "bin": "./dist/index.js",
6
6
  "scripts": {
@@ -46,5 +46,5 @@
46
46
  "url": "https://github.com/pixiv/charcoal.git",
47
47
  "directory": "packages/icons-cli"
48
48
  },
49
- "gitHead": "9a017d7e402dfcf371a5ca9a2b61bcd095467d89"
49
+ "gitHead": "534223f15a5711138d9197945cadddd29dd8ad89"
50
50
  }