@charcoal-ui/icons-cli 1.0.0 → 1.0.1-alpha.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FigmaFileClient.d.ts","sourceRoot":"","sources":["../src/FigmaFileClient.ts"],"names":[],"mappings":"AA6CA,aAAK,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAiBjC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,OAAO,CAAmB;WAErB,UAAU,CACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,YAAY;gBAmB1B,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,YAAY;IAWtB,OAAO,CAAC,SAAS,EAAE,MAAM;IAS/B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM;YA0BtB,cAAc;YAkBd,aAAa;YAcb,cAAc;YA0Bd,OAAO;IAQrB,OAAO,CAAC,yBAAyB;CAgBlC"}
1
+ {"version":3,"file":"FigmaFileClient.d.ts","sourceRoot":"","sources":["../src/FigmaFileClient.ts"],"names":[],"mappings":"AA6CA,aAAK,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAiBjC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,OAAO,CAAmB;WAErB,UAAU,CACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,YAAY;gBAsB1B,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,YAAY;IAWtB,OAAO,CAAC,SAAS,EAAE,MAAM;IAS/B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM;YA2BtB,cAAc;YAkBd,aAAa;YAeb,cAAc;YA2Bd,OAAO;IASrB,OAAO,CAAC,yBAAyB;CAgBlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubClient.d.ts","sourceRoot":"","sources":["../src/GitHubClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitHubClient.d.ts","sourceRoot":"","sources":["../src/GitHubClient.ts"],"names":[],"mappings":"AAGA,aAAK,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,SAAS,OAAO,CACzE,MAAM,CAAC,CACR,GACG,CAAC,GACD,KAAK,CAAA;AAET,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,YAAY;IA4BrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IA9BhC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;WAEb,UAAU,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAoBJ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EACjC,KAAK,EAAE,MAAM,EACI,aAAa,EAAE,MAAM,EACtC,GAAG,OAAa;IASlB,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,OAAO,WAEV;IAEK,kBAAkB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0BzC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCxD,iBAAiB,CAAC,YAAY,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAajD,OAAO,CAAC,mBAAmB;IAQrB,YAAY;;;;;;;;;;CAUnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"GitlabClient.d.ts","sourceRoot":"","sources":["../src/GitlabClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAA;AAM/E,qBAAa,YAAY;IAwBrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IA1BhC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;WAEb,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM;gBAgBJ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAClC,YAAY,EAAE,MAAM,EACH,aAAa,EAAE,MAAM,EACtC,GAAG,OAAa;IASlB,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,OAAO,WAEV;IAEK,qBAAqB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBhD,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE;IAavC,kBAAkB;CAQnB"}
1
+ {"version":3,"file":"GitlabClient.d.ts","sourceRoot":"","sources":["../src/GitlabClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAA;AAM/E,qBAAa,YAAY;IA0BrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IA5BhC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;WAEb,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM;gBAkBJ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAClC,YAAY,EAAE,MAAM,EACH,aAAa,EAAE,MAAM,EACtC,GAAG,OAAa;IASlB,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,OAAO,WAEV;IAEK,qBAAqB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBhD,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE;IAavC,kBAAkB;CAQnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"concurrently.d.ts","sourceRoot":"","sources":["../src/concurrently.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,iBAOzD"}
1
+ {"version":3,"file":"concurrently.d.ts","sourceRoot":"","sources":["../src/concurrently.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,iBAOzD"}
package/dist/index.cjs CHANGED
@@ -92,12 +92,15 @@ class FigmaFileClient {
92
92
  static async runFromCli(url, token, outputRootDir, exportFormat) {
93
93
  const client = new this(url, token, exportFormat);
94
94
  const root = process.cwd();
95
- const outputDir = path__default["default"].join(root, outputRootDir, exportFormat);
95
+ const outputDir = path__default["default"].join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
96
+
96
97
  console.log(`Exporting ${url} components`);
97
- await client.loadSvg(outputDir);
98
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
99
+
98
100
  console.log(`Exporting components type`);
99
101
  const typedefDir = path__default["default"].join(root, outputRootDir, 'src');
100
- await client.writeTypeDef(typedefDir);
102
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
103
+
101
104
  console.log('success!');
102
105
  }
103
106
 
@@ -132,7 +135,8 @@ class FigmaFileClient {
132
135
  const fullname = path__default["default"].resolve(outputDir, 'filenames.ts');
133
136
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
134
137
  name
135
- }) => filenamify(name));
138
+ }) => filenamify(name)); // eslint-disable-next-line no-console
139
+
136
140
  console.log(`writing to ${outputDir}`);
137
141
  await fsExtra.ensureFile(fullname);
138
142
  await fsExtra.writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -169,6 +173,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
169
173
  }
170
174
 
171
175
  async loadImageUrls() {
176
+ // eslint-disable-next-line no-console
172
177
  console.log('Getting export urls');
173
178
  const {
174
179
  data
@@ -198,13 +203,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
198
203
  const filename = `${filenamify(component.name)}.${this.exportFormat}`;
199
204
  const fullname = path__default["default"].join(outputDir, filename);
200
205
  const dirname = path__default["default"].dirname(fullname);
201
- await fsExtra.ensureDir(dirname);
206
+ await fsExtra.ensureDir(dirname); // eslint-disable-next-line no-console
207
+
202
208
  console.log(`found: ${filename} => ✅ writing...`);
203
209
  await fsExtra.writeFile(fullname, response.body, 'utf8');
204
210
  }));
205
211
  }
206
212
 
207
213
  async getFile() {
214
+ // eslint-disable-next-line no-console
208
215
  console.log('Processing response');
209
216
  const {
210
217
  data
@@ -489,10 +496,12 @@ async function collectGitStatus() {
489
496
  class GithubClient {
490
497
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
491
498
  const client = new this(repoOwner, repoName, token, defaultBranch);
492
- const diff = await client.createTreeFromDiff();
499
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
500
+
493
501
  console.log(`${diff.length} files are changed`);
494
502
 
495
503
  if (diff.length === 0) {
504
+ // eslint-disable-next-line no-console
496
505
  console.log('no changes. aborting');
497
506
  return;
498
507
  }
@@ -641,10 +650,12 @@ class GithubClient {
641
650
  class GitlabClient {
642
651
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
643
652
  const client = new this(host, projectId, privateToken, defaultBranch);
644
- const diff = await client.createActionsFromDiff();
653
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
654
+
645
655
  console.log(`${diff.length} files are changed`);
646
656
 
647
657
  if (diff.length === 0) {
658
+ // eslint-disable-next-line no-console
648
659
  console.log('no changes. aborting');
649
660
  return;
650
661
  }
@@ -824,7 +835,9 @@ function colorEquals(self, other) {
824
835
  }
825
836
 
826
837
  function addViewboxToRootSvg(svg) {
827
- const width = svg.getAttribute('width');
838
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
839
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
840
+
828
841
  const height = svg.getAttribute('height');
829
842
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
830
843
  }
@@ -862,6 +875,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
862
875
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
863
876
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
864
877
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
878
+ // eslint-disable-next-line no-console
865
879
  console.error(e);
866
880
  process.exit(1);
867
881
  });
@@ -879,6 +893,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
879
893
  void fsExtra.readFile(file, {
880
894
  encoding: 'utf-8'
881
895
  }).then(content => optimizeSvg(content, color)).then(optimized => fsExtra.writeFile(file, optimized)).catch(e => {
896
+ // eslint-disable-next-line no-console
882
897
  console.error(e);
883
898
  process.exit(1);
884
899
  });
@@ -886,12 +901,14 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
886
901
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
887
902
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
888
903
  void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
904
+ // eslint-disable-next-line no-console
889
905
  console.error(e);
890
906
  process.exit(1);
891
907
  });
892
908
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
893
909
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
894
910
  void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
911
+ // eslint-disable-next-line no-console
895
912
  console.error(e);
896
913
  process.exit(1);
897
914
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["import PQueue from 'p-queue'\n\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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\n\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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 console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, response.body, 'utf8')\n })\n )\n }\n\n private async getFile() {\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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 const width = svg.getAttribute('width')!\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n // eslint-disable-next-line no-console\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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, response.body, '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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
@@ -82,12 +82,15 @@ class FigmaFileClient {
82
82
  static async runFromCli(url, token, outputRootDir, exportFormat) {
83
83
  const client = new this(url, token, exportFormat);
84
84
  const root = process.cwd();
85
- const outputDir = path.join(root, outputRootDir, exportFormat);
85
+ const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
86
+
86
87
  console.log(`Exporting ${url} components`);
87
- await client.loadSvg(outputDir);
88
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
89
+
88
90
  console.log(`Exporting components type`);
89
91
  const typedefDir = path.join(root, outputRootDir, 'src');
90
- await client.writeTypeDef(typedefDir);
92
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
93
+
91
94
  console.log('success!');
92
95
  }
93
96
 
@@ -122,7 +125,8 @@ class FigmaFileClient {
122
125
  const fullname = path.resolve(outputDir, 'filenames.ts');
123
126
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
124
127
  name
125
- }) => filenamify(name));
128
+ }) => filenamify(name)); // eslint-disable-next-line no-console
129
+
126
130
  console.log(`writing to ${outputDir}`);
127
131
  await ensureFile(fullname);
128
132
  await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -159,6 +163,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
159
163
  }
160
164
 
161
165
  async loadImageUrls() {
166
+ // eslint-disable-next-line no-console
162
167
  console.log('Getting export urls');
163
168
  const {
164
169
  data
@@ -190,13 +195,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
190
195
  const filename = `${filenamify(component.name)}.${_this.exportFormat}`;
191
196
  const fullname = path.join(outputDir, filename);
192
197
  const dirname = path.dirname(fullname);
193
- await ensureDir(dirname);
198
+ await ensureDir(dirname); // eslint-disable-next-line no-console
199
+
194
200
  console.log(`found: ${filename} => ✅ writing...`);
195
201
  await writeFile(fullname, response.body, 'utf8');
196
202
  }));
197
203
  }
198
204
 
199
205
  async getFile() {
206
+ // eslint-disable-next-line no-console
200
207
  console.log('Processing response');
201
208
  const {
202
209
  data
@@ -481,10 +488,12 @@ async function collectGitStatus() {
481
488
  class GithubClient {
482
489
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
483
490
  const client = new this(repoOwner, repoName, token, defaultBranch);
484
- const diff = await client.createTreeFromDiff();
491
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
492
+
485
493
  console.log(`${diff.length} files are changed`);
486
494
 
487
495
  if (diff.length === 0) {
496
+ // eslint-disable-next-line no-console
488
497
  console.log('no changes. aborting');
489
498
  return;
490
499
  }
@@ -633,10 +642,12 @@ class GithubClient {
633
642
  class GitlabClient {
634
643
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
635
644
  const client = new this(host, projectId, privateToken, defaultBranch);
636
- const diff = await client.createActionsFromDiff();
645
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
646
+
637
647
  console.log(`${diff.length} files are changed`);
638
648
 
639
649
  if (diff.length === 0) {
650
+ // eslint-disable-next-line no-console
640
651
  console.log('no changes. aborting');
641
652
  return;
642
653
  }
@@ -816,7 +827,9 @@ function colorEquals(self, other) {
816
827
  }
817
828
 
818
829
  function addViewboxToRootSvg(svg) {
819
- const width = svg.getAttribute('width');
830
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
831
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
832
+
820
833
  const height = svg.getAttribute('height');
821
834
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
822
835
  }
@@ -854,6 +867,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
854
867
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
855
868
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
856
869
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
870
+ // eslint-disable-next-line no-console
857
871
  console.error(e);
858
872
  process.exit(1);
859
873
  });
@@ -871,6 +885,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
871
885
  void readFile(file, {
872
886
  encoding: 'utf-8'
873
887
  }).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
888
+ // eslint-disable-next-line no-console
874
889
  console.error(e);
875
890
  process.exit(1);
876
891
  });
@@ -878,12 +893,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
878
893
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
879
894
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
880
895
  void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
896
+ // eslint-disable-next-line no-console
881
897
  console.error(e);
882
898
  process.exit(1);
883
899
  });
884
900
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
885
901
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
886
902
  void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
903
+ // eslint-disable-next-line no-console
887
904
  console.error(e);
888
905
  process.exit(1);
889
906
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["import PQueue from 'p-queue'\n\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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\n\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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 console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, response.body, 'utf8')\n })\n )\n }\n\n private async getFile() {\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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 const width = svg.getAttribute('width')!\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
1
+ {"version":3,"file":"index.modern.js","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n // eslint-disable-next-line no-console\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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, response.body, '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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
@@ -82,12 +82,15 @@ class FigmaFileClient {
82
82
  static async runFromCli(url, token, outputRootDir, exportFormat) {
83
83
  const client = new this(url, token, exportFormat);
84
84
  const root = process.cwd();
85
- const outputDir = path.join(root, outputRootDir, exportFormat);
85
+ const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
86
+
86
87
  console.log(`Exporting ${url} components`);
87
- await client.loadSvg(outputDir);
88
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
89
+
88
90
  console.log(`Exporting components type`);
89
91
  const typedefDir = path.join(root, outputRootDir, 'src');
90
- await client.writeTypeDef(typedefDir);
92
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
93
+
91
94
  console.log('success!');
92
95
  }
93
96
 
@@ -122,7 +125,8 @@ class FigmaFileClient {
122
125
  const fullname = path.resolve(outputDir, 'filenames.ts');
123
126
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
124
127
  name
125
- }) => filenamify(name));
128
+ }) => filenamify(name)); // eslint-disable-next-line no-console
129
+
126
130
  console.log(`writing to ${outputDir}`);
127
131
  await ensureFile(fullname);
128
132
  await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -159,6 +163,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
159
163
  }
160
164
 
161
165
  async loadImageUrls() {
166
+ // eslint-disable-next-line no-console
162
167
  console.log('Getting export urls');
163
168
  const {
164
169
  data
@@ -188,13 +193,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
188
193
  const filename = `${filenamify(component.name)}.${this.exportFormat}`;
189
194
  const fullname = path.join(outputDir, filename);
190
195
  const dirname = path.dirname(fullname);
191
- await ensureDir(dirname);
196
+ await ensureDir(dirname); // eslint-disable-next-line no-console
197
+
192
198
  console.log(`found: ${filename} => ✅ writing...`);
193
199
  await writeFile(fullname, response.body, 'utf8');
194
200
  }));
195
201
  }
196
202
 
197
203
  async getFile() {
204
+ // eslint-disable-next-line no-console
198
205
  console.log('Processing response');
199
206
  const {
200
207
  data
@@ -479,10 +486,12 @@ async function collectGitStatus() {
479
486
  class GithubClient {
480
487
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
481
488
  const client = new this(repoOwner, repoName, token, defaultBranch);
482
- const diff = await client.createTreeFromDiff();
489
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
490
+
483
491
  console.log(`${diff.length} files are changed`);
484
492
 
485
493
  if (diff.length === 0) {
494
+ // eslint-disable-next-line no-console
486
495
  console.log('no changes. aborting');
487
496
  return;
488
497
  }
@@ -631,10 +640,12 @@ class GithubClient {
631
640
  class GitlabClient {
632
641
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
633
642
  const client = new this(host, projectId, privateToken, defaultBranch);
634
- const diff = await client.createActionsFromDiff();
643
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
644
+
635
645
  console.log(`${diff.length} files are changed`);
636
646
 
637
647
  if (diff.length === 0) {
648
+ // eslint-disable-next-line no-console
638
649
  console.log('no changes. aborting');
639
650
  return;
640
651
  }
@@ -814,7 +825,9 @@ function colorEquals(self, other) {
814
825
  }
815
826
 
816
827
  function addViewboxToRootSvg(svg) {
817
- const width = svg.getAttribute('width');
828
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
829
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
830
+
818
831
  const height = svg.getAttribute('height');
819
832
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
820
833
  }
@@ -852,6 +865,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
852
865
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
853
866
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
854
867
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
868
+ // eslint-disable-next-line no-console
855
869
  console.error(e);
856
870
  process.exit(1);
857
871
  });
@@ -869,6 +883,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
869
883
  void readFile(file, {
870
884
  encoding: 'utf-8'
871
885
  }).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
886
+ // eslint-disable-next-line no-console
872
887
  console.error(e);
873
888
  process.exit(1);
874
889
  });
@@ -876,12 +891,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
876
891
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
877
892
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
878
893
  void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
894
+ // eslint-disable-next-line no-console
879
895
  console.error(e);
880
896
  process.exit(1);
881
897
  });
882
898
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
883
899
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
884
900
  void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
901
+ // eslint-disable-next-line no-console
885
902
  console.error(e);
886
903
  process.exit(1);
887
904
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["import PQueue from 'p-queue'\n\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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\n\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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 console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, response.body, 'utf8')\n })\n )\n }\n\n private async getFile() {\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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 const width = svg.getAttribute('width')!\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":";;;;;;;;;;;;;;;;SAEgBA,aAAaC;AAC3B,QAAMC,KAAK,GAAG,IAAIC,MAAJ,CAAW;AAAEC,IAAAA,WAAW,EAAE;AAAf,GAAX,CAAd;;AACA,OAAK,MAAMC,IAAX,IAAmBJ,KAAnB,EAA0B;AACxB,SAAKC,KAAK,CAACI,GAAN,CAAUD,IAAV,CAAL;AACD;;AACDH,EAAAA,KAAK,CAACK,KAAN;AACA,SAAOL,KAAK,CAACM,MAAN,EAAP;AACD;;ACDD,MAAMC,SAAS,GAAGC,KAAK,CAAiC,mBAAjC,CAAvB;;AAEA,SAASC,aAAT,CAAuBC,GAAvB;AACE,QAAMC,MAAM,GAAGJ,SAAS,CAAC,IAAIK,GAAJ,CAAQF,GAAR,EAAaG,QAAd,CAAxB;;AACA,MAAIF,MAAM,KAAK,KAAf,EAAsB;AACpB,UAAM,IAAIG,KAAJ,CAAU,iBAAV,CAAN;AACD;;AAED,SAAOH,MAAM,CAACI,MAAP,CAAcC,IAArB;AACD;;AAED,SAASC,aAAT,CAAuBP,GAAvB;AACE,MAAI,CAACA,GAAG,CAACQ,QAAJ,CAAa,GAAb,CAAL,EAAwB;AACtB,WAAOC,SAAP;AACD;;AAED,QAAM,GAAGC,KAAH,IAAYV,GAAG,CAACW,KAAJ,CAAU,GAAV,CAAlB;AACA,QAAMN,MAAM,GAAG,IAAIO,eAAJ,CAAoBF,KAApB,CAAf;AACA,QAAMG,MAAM,GAAGR,MAAM,CAACS,GAAP,CAAW,SAAX,CAAf;;AACA,MAAID,MAAM,KAAK,IAAf,EAAqB;AACnB,WAAOJ,SAAP;AACD;;AAED,SAAOM,kBAAkB,CAACF,MAAD,CAAzB;AACD;;AAED,SAASG,UAAT,CAAoBC,IAApB;AACE,SAAOC,SAAS,CAACD,IAAD,EAAO;AAAEE,IAAAA,UAAU,EAAE;AAAd,GAAP,CAAT,CAAsCC,OAAtC,CAA8C,GAA9C,EAAmD,EAAnD,CAAP;AACD;;;AAGD,MAAMC,QAAQ,GAAG,wBAAjB;;AAEA,SAASC,UAAT,CAAoBC,IAApB;AACE,SAAOF,QAAQ,CAACG,IAAT,CAAcD,IAAI,CAACN,IAAnB,CAAP;AACD;;AAID,SAASQ,cAAT,CAAwBC,YAAxB;AACE,UAAQA,YAAR;AACE,SAAK,KAAL;AACE,aAAO,eAAP;;AACF,SAAK,KAAL;AACE,aAAO,iBAAP;AAJJ;AAMD;;MAQYC;AASY,eAAVC,UAAU,CACrB5B,GADqB,EAErB6B,KAFqB,EAGrBC,aAHqB,EAIrBJ,YAJqB;AAMrB,UAAMK,MAAM,GAAG,IAAI,IAAJ,CAAS/B,GAAT,EAAc6B,KAAd,EAAqBH,YAArB,CAAf;AAEA,UAAMM,IAAI,GAAGC,OAAO,CAACC,GAAR,EAAb;AAEA,UAAMC,SAAS,GAAGC,IAAI,CAACC,IAAL,CAAUL,IAAV,EAAgBF,aAAhB,EAA+BJ,YAA/B,CAAlB;AAEAY,IAAAA,OAAO,CAACC,GAAR,cAAyBvC,gBAAzB;AACA,UAAM+B,MAAM,CAACS,OAAP,CAAeL,SAAf,CAAN;AAEAG,IAAAA,OAAO,CAACC,GAAR,4BAAA;AACA,UAAME,UAAU,GAAGL,IAAI,CAACC,IAAL,CAAUL,IAAV,EAAgBF,aAAhB,EAA+B,KAA/B,CAAnB;AACA,UAAMC,MAAM,CAACW,YAAP,CAAoBD,UAApB,CAAN;AAEAH,IAAAA,OAAO,CAACC,GAAR,CAAY,UAAZ;AACD;;AAEDI,EAAAA,YACE3C,KACA4C,qBACAlB;SAjCemB;SACAhC;SACAa;SACAK;SAETe,aAAwC;SACxCC,UAAwB;AA6B9B,SAAKhB,MAAL,GAAciB,KAAK,CAACC,MAAN,CAAa;AACzBL,MAAAA;AADyB,KAAb,CAAd;AAIA,SAAKC,MAAL,GAAc9C,aAAa,CAACC,GAAD,CAA3B;AACA,SAAKa,MAAL,GAAcN,aAAa,CAACP,GAAD,CAA3B;AACA,SAAK0B,YAAL,GAAoBA,YAApB;AACD;;AAEY,QAAPc,OAAO,CAACL,SAAD;AACX,UAAMe,MAAM,CAACf,SAAD,CAAZ;AACA,UAAMgB,SAAS,CAAChB,SAAD,CAAf;AAEA,UAAM,KAAKiB,cAAL,EAAN;AACA,UAAM,KAAKC,aAAL,EAAN;AACA,UAAM,KAAKC,cAAL,CAAoBnB,SAApB,CAAN;AACD;AAED;;;;;AAGkB,QAAZO,YAAY,CAACP,SAAD;AAChB,UAAMoB,QAAQ,GAAGnB,IAAI,CAACoB,OAAL,CAAarB,SAAb,EAAwB,cAAxB,CAAjB;AACA,UAAMsB,gBAAgB,GAAGC,MAAM,CAACC,MAAP,CAAc,KAAKb,UAAnB,EAA+Bc,GAA/B,CAAmC,CAAC;AAAE3C,MAAAA;AAAF,KAAD,KAC1DD,UAAU,CAACC,IAAD,CADa,CAAzB;AAIAqB,IAAAA,OAAO,CAACC,GAAR,eAA0BJ,WAA1B;AAEA,UAAM0B,UAAU,CAACN,QAAD,CAAhB;AACA,UAAMO,SAAS,CACbP,QADa;;;;;kCAOeQ,IAAI,CAACC,SAAL,CAAeP,gBAAf;;;;;CAPf,EAab;AAAEQ,MAAAA,QAAQ,EAAE;AAAZ,KAba,CAAf;AAeD;;AAE2B,QAAdb,cAAc;AAC1B,UAAM;AAAEc,MAAAA;AAAF,QAAe,MAAM,KAAKC,OAAL,EAA3B;AAEA,SAAKpB,OAAL,GAAemB,QAAQ,CAACE,QAAT,CAAkBC,MAAlB,CAA0B9C,IAAD;AACtC,UAAI,KAAKV,MAAL,KAAgBJ,SAApB,EAA+B;AAC7B,eAAOc,IAAI,CAAC+C,EAAL,KAAY,KAAKzD,MAAxB;AACD;;AAED,aAAO,KAAP;AACD,KANc,CAAf;AAQA,SAAKkC,OAAL,CAAawB,OAAb,CAAsBC,KAAD,IAAW,KAAKC,yBAAL,CAA+BD,KAA/B,CAAhC;;AAEA,QAAId,MAAM,CAACC,MAAP,CAAc,KAAKZ,OAAnB,EAA4B2B,MAA5B,KAAuC,CAA3C,EAA8C;AAC5C,YAAM,IAAItE,KAAJ,CAAU,sBAAV,CAAN;AACD;AACF;;AAE0B,QAAbiD,aAAa;AACzBf,IAAAA,OAAO,CAACC,GAAR,CAAY,qBAAZ;AAEA,UAAM;AAAEoC,MAAAA;AAAF,QAAW,MAAM,KAAK5C,MAAL,CAAY6C,UAAZ,CAAuB,KAAK/B,MAA5B,EAAoC;AACzDgC,MAAAA,MAAM,EAAE,KAAKnD,YAD4C;AAEzDoD,MAAAA,GAAG,EAAEpB,MAAM,CAACqB,IAAP,CAAY,KAAKjC,UAAjB,CAFoD;AAGzDkC,MAAAA,KAAK,EAAE;AAHkD,KAApC,CAAvB;;AAMA,SAAK,MAAM,CAACV,EAAD,EAAKW,KAAL,CAAX,IAA0BvB,MAAM,CAACwB,OAAP,CAAeP,IAAI,CAACQ,MAApB,CAA1B,EAAuD;AACrD,WAAKrC,UAAL,CAAgBwB,EAAhB,EAAoBW,KAApB,GAA4BA,KAA5B;AACD;AACF;;AAE2B,QAAd3B,cAAc,CAACnB,SAAD;AAC1B,WAAO/C,YAAY,CACjBsE,MAAM,CAACC,MAAP,CAAc,KAAKb,UAAnB,EAA+Bc,GAA/B,CAAoCwB,SAAD,IAAe;AAChD,UAAIA,SAAS,CAACH,KAAV,KAAoBxE,SAAxB,EAAmC;AACjC;AACD;;AAED,YAAM4E,QAAQ,GAAG,MAAMC,GAAG,CAACxE,GAAJ,CAAQsE,SAAS,CAACH,KAAlB,EAAyB;AAC9CM,QAAAA,OAAO,EAAE;AACP,0BAAgB9D,cAAc,CAAC,KAAKC,YAAN;AADvB,SADqC;AAI9CuC,QAAAA,QAAQ,EAAE;AAJoC,OAAzB,CAAvB;AAOA,YAAMuB,QAAQ,MAAMxE,UAAU,CAACoE,SAAS,CAACnE,IAAX,KAAoB,KAAKS,cAAvD;AACA,YAAM6B,QAAQ,GAAGnB,IAAI,CAACC,IAAL,CAAUF,SAAV,EAAqBqD,QAArB,CAAjB;AACA,YAAMC,OAAO,GAAGrD,IAAI,CAACqD,OAAL,CAAalC,QAAb,CAAhB;AAEA,YAAMJ,SAAS,CAACsC,OAAD,CAAf;AAEAnD,MAAAA,OAAO,CAACC,GAAR,WAAsBiD,0BAAtB;AACA,YAAM1B,SAAS,CAACP,QAAD,EAAW8B,QAAQ,CAACK,IAApB,EAA0B,MAA1B,CAAf;AACD,KApBD,CADiB,CAAnB;AAuBD;;AAEoB,QAAPvB,OAAO;AACnB7B,IAAAA,OAAO,CAACC,GAAR,CAAY,qBAAZ;AAEA,UAAM;AAAEoC,MAAAA;AAAF,QAAW,MAAM,KAAK5C,MAAL,CAAYzB,IAAZ,CAAiB,KAAKuC,MAAL,CAAY8C,QAAZ,EAAjB,CAAvB;AAEA,WAAOhB,IAAP;AACD;;AAEOF,EAAAA,yBAAyB,CAACD,KAAD;AAC/B,QAAIA,KAAK,CAACoB,IAAN,KAAe,WAAnB,EAAgC;AAC9B,YAAM;AAAE3E,QAAAA,IAAF;AAAQqD,QAAAA;AAAR,UAAeE,KAArB;;AAEA,UAAIlD,UAAU,CAACkD,KAAD,CAAd,EAAuB;AACrB,aAAK1B,UAAL,CAAgBwB,EAAhB,IAAsB;AACpBrD,UAAAA,IADoB;AAEpBqD,UAAAA;AAFoB,SAAtB;AAID;AACF,KATD,MASO,IAAI,cAAcE,KAAlB,EAAyB;AAC9BA,MAAAA,KAAK,CAACJ,QAAN,CAAeG,OAAf,CAAwBsB,UAAD,IACrB,KAAKpB,yBAAL,CAA+BoB,UAA/B,CADF;AAGD;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChOH;;;;AAGO,MAAMC,KAAK,GAAIC,OAAD,IACnB,IAAIC,OAAJ,CAAoB,CAACxC,OAAD,EAAUyC,MAAV;AAClBC,EAAAA,IAAI,CAACH,OAAD,EAAU,CAACI,GAAD,EAAMC,MAAN;AACZ,QAAID,GAAJ,EAAS;AACP,aAAOF,MAAM,CAACE,GAAD,CAAb;AACD;;AAED,WAAO3C,OAAO,CAAC4C,MAAD,CAAd;AACD,GANG,CAAJ;AAOD,CARD,CADK;SAWSC,cACdC,OACArF;AAEA,MAAI,OAAOqF,KAAP,KAAiB,WAArB,EAAkC;AAChC,UAAM,IAAIC,SAAJ,IAAiBtF,uBAAjB,CAAN;AACD;AACF;;ACnBM,MAAMuF,SAAS,GAAGpE,IAAI,CAACoB,OAAL,CAAavB,OAAO,CAACC,GAAR,EAAb,EAA4B,UAA5B,EAAwC,OAAxC,EAAiD,KAAjD,CAAlB;AAEP;;;;SAGuBuE,eAAvB;AAAA;AAAA;;;yCAAO,WAAgCC,GAAG,GAAGF,SAAtC;AACL,UAAMG,WAAW,8BAASC,QAAE,CAACC,OAAH,CAAWH,GAAX,CAAT,CAAjB;AACA,UAAMI,SAAS,8BAASC,gBAAgB,EAAzB,CAAf;;AAEA,SAAK,MAAML,GAAX,IAAkBC,WAAlB,EAA+B;AAC7B,YAAMK,SAAS,GAAG5E,IAAI,CAACoB,OAAL,CAAagD,SAAb,EAAwBE,GAAxB,CAAlB,CAD6B;;AAI7B,YAAMO,IAAI,8BAASL,QAAE,CAACK,IAAH,CAAQD,SAAR,CAAT,CAAV;;AACA,UAAI,CAACC,IAAI,CAACC,WAAL,EAAL,EAAyB;AACvB;AACD,OAP4B;;;AAU7B,YAAMC,KAAK,8BAASP,QAAE,CAACC,OAAH,CAAWG,SAAX,CAAT,CAAX;;AAEA,WAAK,MAAM1G,IAAX,IAAmB6G,KAAnB,EAA0B;AACxB,cAAMC,QAAQ,GAAGhF,IAAI,CAACoB,OAAL,CAAagD,SAAb,EAAwBE,GAAxB,EAA6BpG,IAA7B,CAAjB;AACA,cAAM+G,YAAY,GAAGjF,IAAI,CAACkF,QAAL,CAAcrF,OAAO,CAACC,GAAR,EAAd,EAA6BkF,QAA7B,CAArB;AAEA,cAAMG,MAAM,GAAGT,SAAS,CAACO,YAAD,CAAxB;;AACA,YAAIE,MAAM,IAAI,IAAd,EAAoB;AAClB;AACA;AACD,SARuB;;;AAWxB,cAAMC,OAAO,8BAASZ,QAAE,CAACa,QAAH,CAAYL,QAAZ,EAAsB;AAAEnD,UAAAA,QAAQ,EAAE;AAAZ,SAAtB,CAAT,CAAb;AAEA,cAAM;AAAEoD,UAAAA,YAAF;AAAgBG,UAAAA,OAAhB;AAAyBD,UAAAA;AAAzB,SAAN;AACD;AACF;AACF;;;;AAED,eAAeR,gBAAf;AACE,SAAOrD,MAAM,CAACgE,WAAP;AACL;;;AAGA,GAAC,MAAM5B,KAAK,yBAAA,CAAZ,EACGnF,KADH,CACS,IADT,EAEGiD,GAFH,CAGK+D,CAAD,IACE,CACEA,CAAC,CAACC,KAAF,CAAQ,CAAR,CADF,EAEED,CAAC,CAACE,UAAF,CAAa,IAAb,IACI,UADJ,GAEIF,CAAC,CAACE,UAAF,CAAa,IAAb,IACA,WADA,GAEAF,CAAC,CAACE,UAAF,CAAa,IAAb,IACA,SADA,GAEA,IARN,CAJN,CAJK,CAAP;AAoBD;;MC/CYC;AAIY,eAAVlG,UAAU,CACrBmG,SADqB,EAErBC,QAFqB,EAGrBnG,KAHqB,EAIrBoG,aAJqB;AAMrB,UAAMlG,MAAM,GAAG,IAAI,IAAJ,CAASgG,SAAT,EAAoBC,QAApB,EAA8BnG,KAA9B,EAAqCoG,aAArC,CAAf;AAEA,UAAMC,IAAI,GAAG,MAAMnG,MAAM,CAACoG,kBAAP,EAAnB;AACA7F,IAAAA,OAAO,CAACC,GAAR,IAAe2F,IAAI,CAACxD,0BAApB;;AACA,QAAIwD,IAAI,CAACxD,MAAL,KAAgB,CAApB,EAAuB;AACrBpC,MAAAA,OAAO,CAACC,GAAR,CAAY,sBAAZ;AACA;AACD;;AAED,UAAM6F,SAAS,GAAG,MAAMrG,MAAM,CAACsG,YAAP,EAAxB;AAEA,UAAMtG,MAAM,CAACuG,YAAP,CAAoBJ,IAApB,EAA0BE,SAA1B,CAAN;AACA,WAAOrG,MAAM,CAACwG,iBAAP,CAAyBH,SAAzB,CAAP;AACD;;AAEDzF,EAAAA,YACmBoF,WACAC,UACjBnG,OACiBoG,eACjBO,GAAG,GAAG,IAAIC,IAAJ;SAJWV;SACAC;SAEAC;SA5BFS;SACAF;AAwBE,kBAAA,GAAAT,SAAA;AACA,iBAAA,GAAAC,QAAA;AAEA,sBAAA,GAAAC,aAAA;AAGjB,SAAKS,GAAL,GAAW,IAAIC,OAAJ,CAAY;AACrBC,MAAAA,IAAI,EAAE/G;AADe,KAAZ,CAAX;AAIA,SAAK2G,GAAL,GAAWA,GAAX;AACD;;AAES,MAANK,MAAM;AACR,2BAAuB,KAAKL,GAAL,CAASM,OAAT,IAAvB;AACD;AAED;;;;;AAGW,MAAPC,OAAO;AACT,uCAAmC,KAAKP,GAAL,CAASQ,YAAT,IAAnC;AACD;;AAEuB,QAAlBb,kBAAkB;AACtB,UAAMc,IAAI,GAAe,EAAzB;;;;;;;AAEA,0CAAyBxC,eAAe,EAAxC,iHAA4C;AAAA,cAA3BnG,IAA2B;AAC1C,cAAM4I,IAAI,GAAG;AACX9G,UAAAA,IAAI,EAAE9B,IAAI,CAAC+G,YADA;AAEX;AACA;AACA8B,UAAAA,IAAI,EAAE,QAJK;AAKX3B,UAAAA,OAAO,EAAElH,IAAI,CAACkH;AALH,SAAb;;AAQA,YAAIlH,IAAI,CAACiH,MAAL,KAAgB,SAApB,EAA+B;AAC7B;AACA0B,UAAAA,IAAI,CAACG,IAAL,cACKF,IADL;AAEEG,YAAAA,GAAG,EAAE;AAFP;AAID,SAND,MAMO;AACLJ,UAAAA,IAAI,CAACG,IAAL,CAAUF,IAAV;AACD;AACF;;;;;;;;;;;;;;;;AAED,WAAOD,IAAP;AACD;;AAEiB,QAAZX,YAAY,CAACW,IAAD,EAAmBK,YAAnB;AAChB,UAAMC,YAAY,GAAG,MAAM,KAAKb,GAAL,CAASc,GAAT,CAAaC,SAAb,CAAuB;AAChDC,MAAAA,KAAK,EAAE,KAAK3B,SADoC;AAEhD4B,MAAAA,IAAI,EAAE,KAAK3B,QAFqC;AAGhD;AACA4B,MAAAA,UAAU,EAAEN,YAAY,CAAC3E,IAAb,CAAkBkF,MAAlB,CAAyBR;AAJW,KAAvB,CAA3B;AAOA,UAAMS,OAAO,GAAG,MAAM,KAAKpB,GAAL,CAASc,GAAT,CAAaO,UAAb,CAAwB;AAC5CL,MAAAA,KAAK,EAAE,KAAK3B,SADgC;AAE5C4B,MAAAA,IAAI,EAAE,KAAK3B,QAFiC;AAG5C;AACAgC,MAAAA,SAAS,EAAET,YAAY,CAAC5E,IAAb,CAAkBsE,IAAlB,CAAuBI,GAJU;AAK5CJ,MAAAA;AAL4C,KAAxB,CAAtB;;AASA,UAAMgB,MAAM,GAAG,MAAM,KAAKvB,GAAL,CAASc,GAAT,CAAalB,YAAb,CAA0B;AAC7CoB,MAAAA,KAAK,EAAE,KAAK3B,SADiC;AAE7C4B,MAAAA,IAAI,EAAE,KAAK3B,QAFkC;AAG7Ce,MAAAA,OAAO,EAAE,KAAKA,OAH+B;AAI7CE,MAAAA,IAAI,EAAEa,OAAO,CAACnF,IAAR,CAAa0E,GAJ0B;AAK7Ca,MAAAA,OAAO,EAAE,CAACX,YAAY,CAAC5E,IAAb,CAAkB0E,GAAnB;AALoC,KAA1B,CAArB;;AASA,UAAM,KAAKX,GAAL,CAASc,GAAT,CAAaW,SAAb,CAAuB;AAC3BT,MAAAA,KAAK,EAAE,KAAK3B,SADe;AAE3B4B,MAAAA,IAAI,EAAE,KAAK3B,QAFgB;AAG3BoC,MAAAA,GAAG,WAAW,KAAKvB,QAHQ;AAI3BQ,MAAAA,GAAG,EAAEY,MAAM,CAACtF,IAAP,CAAY0E;AAJU,KAAvB,CAAN;AAOA,WAAOY,MAAP;AACD;;AAEsB,QAAjB1B,iBAAiB,CAACe,YAAD;AACrB,UAAMrB,aAAa,GAAG,MAAM,KAAKoC,mBAAL,EAA5B;AAEA,WAAO,KAAK3B,GAAL,CAAS4B,KAAT,CAAeC,MAAf,CAAsB;AAC3Bb,MAAAA,KAAK,EAAE,KAAK3B,SADe;AAE3B4B,MAAAA,IAAI,EAAE,KAAK3B,QAFgB;AAG3BwC,MAAAA,IAAI,EAAElB,YAAY,CAAC3E,IAAb,CAAkByF,GAHG;AAI3BK,MAAAA,IAAI,EAAExC,aAAa,CAACtD,IAAd,CAAmByF,GAJE;AAK3BM,MAAAA,KAAK,EAAE,KAAK3B,OALe;AAM3BrD,MAAAA,IAAI,EAAE;AANqB,KAAtB,CAAP;AAQD;;AAEO2E,EAAAA,mBAAmB;AACzB,WAAO,KAAK3B,GAAL,CAASc,GAAT,CAAamB,MAAb,CAAoB;AACzBjB,MAAAA,KAAK,EAAE,KAAK3B,SADa;AAEzB4B,MAAAA,IAAI,EAAE,KAAK3B,QAFc;AAGzBoC,MAAAA,GAAG,WAAW,KAAKnC;AAHM,KAApB,CAAP;AAKD;;AAEiB,QAAZI,YAAY;AAChB,UAAMJ,aAAa,GAAG,MAAM,KAAKoC,mBAAL,EAA5B;AAEA,WAAO,KAAK3B,GAAL,CAASc,GAAT,CAAaoB,SAAb,CAAuB;AAC5BlB,MAAAA,KAAK,EAAE,KAAK3B,SADgB;AAE5B4B,MAAAA,IAAI,EAAE,KAAK3B,QAFiB;AAG5BoC,MAAAA,GAAG,gBAAgB,KAAKvB,QAHI;AAI5BQ,MAAAA,GAAG,EAAEpB,aAAa,CAACtD,IAAd,CAAmBkF,MAAnB,CAA0BR;AAJH,KAAvB,CAAP;AAMD;;;;MCzJUwB;AAIY,eAAVjJ,UAAU,CACrBkJ,IADqB,EAErBC,SAFqB,EAGrBC,YAHqB,EAIrB/C,aAJqB;AAMrB,UAAMlG,MAAM,GAAG,IAAI,IAAJ,CAAS+I,IAAT,EAAeC,SAAf,EAA0BC,YAA1B,EAAwC/C,aAAxC,CAAf;AAEA,UAAMC,IAAI,GAAG,MAAMnG,MAAM,CAACkJ,qBAAP,EAAnB;AACA3I,IAAAA,OAAO,CAACC,GAAR,IAAe2F,IAAI,CAACxD,0BAApB;;AACA,QAAIwD,IAAI,CAACxD,MAAL,KAAgB,CAApB,EAAuB;AACrBpC,MAAAA,OAAO,CAACC,GAAR,CAAY,sBAAZ;AACA;AACD;;AAED,UAAMR,MAAM,CAACuG,YAAP,CAAoBJ,IAApB,CAAN;AACA,WAAOnG,MAAM,CAACmJ,kBAAP,EAAP;AACD;;AAEDvI,EAAAA,YACmBmI,MACAC,WACjBC,cACiB/C,eACjBO,GAAG,GAAG,IAAIC,IAAJ;SAJWqC;SACAC;SAEA9C;SA1BFS;SACAF;AAsBE,aAAA,GAAAsC,IAAA;AACA,kBAAA,GAAAC,SAAA;AAEA,sBAAA,GAAA9C,aAAA;AAGjB,SAAKS,GAAL,GAAW,IAAIyC,MAAJ,CAAW;AACpBL,MAAAA,IAAI,EAAE,KAAKA,IADS;AAEpBjJ,MAAAA,KAAK,EAAEmJ;AAFa,KAAX,CAAX;AAIA,SAAKxC,GAAL,GAAWA,GAAX;AACD;;AAES,MAANK,MAAM;AACR,2BAAuB,KAAKL,GAAL,CAASM,OAAT,IAAvB;AACD;AAED;;;;;AAGW,MAAPC,OAAO;AACT,uCAAmC,KAAKP,GAAL,CAASQ,YAAT,IAAnC;AACD;;AAE0B,QAArBiC,qBAAqB;AACzB,UAAMG,OAAO,GAAmB,EAAhC;;;;;;;AAEA,0CAAyB3E,eAAe,EAAxC,iHAA4C;AAAA,cAA3BnG,IAA2B;AAC1C8K,QAAAA,OAAO,CAAChC,IAAR,CAAa;AACXiC,UAAAA,MAAM,EACJ/K,IAAI,CAACiH,MAAL,KAAgB,WAAhB,GACI,QADJ,GAEIjH,IAAI,CAACiH,MAAL,KAAgB,SAAhB,GACA,QADA,GAEA,QANK;AAOX+D,UAAAA,QAAQ,EAAEhL,IAAI,CAAC+G,YAPJ;AAQXG,UAAAA,OAAO,EAAElH,IAAI,CAACkH;AARH,SAAb;AAUD;;;;;;;;;;;;;;;;AAED,WAAO4D,OAAP;AACD;;AAEiB,QAAZ9C,YAAY,CAACJ,IAAD;AAChB,WAAO,KAAKQ,GAAL,CAAS6C,OAAT,CAAiBhB,MAAjB,CACL,KAAKQ,SADA,EAEL,KAAKlC,MAFA,EAGL,KAAKE,OAHA,EAILb,IAJK,EAKL;AACE;AACAsD,MAAAA,YAAY,EAAE,KAAKvD;AAFrB,KALK,CAAP;AAUD;;AAEDiD,EAAAA,kBAAkB;AAChB,WAAO,KAAKxC,GAAL,CAAS+C,aAAT,CAAuBlB,MAAvB,CACL,KAAKQ,SADA,EAEL,KAAKlC,MAFA,EAGL,KAAKZ,aAHA,EAIL,KAAKc,OAJA,CAAP;AAMD;;;;ACxFI,MAAM2C,4BAA4B,GAAG,SAArC;AAEP,MAAMC,IAAI,GAAG,IAAIC,IAAJ,CAAS;AACpBC,EAAAA,OAAO,EAAE;AAEP;AACA;AACA;AACA;AAAEC,IAAAA,aAAa,EAAE;AAAjB,GALO,EAMP;AAAEC,IAAAA,WAAW,EAAE;AAAEC,MAAAA,KAAK,EAAE,CAAC,gBAAD,EAAmB,cAAnB;AAAT;AAAf,GANO;AADW,CAAT,CAAb;AAWO,eAAeC,WAAf,CAA2BC,KAA3B,EAA0CC,cAA1C;AACL,QAAM;AAAExH,IAAAA;AAAF,MAAW,MAAMgH,IAAI,CAACS,QAAL,CAAcF,KAAd,CAAvB;AAEA,QAAM;AAAEhI,IAAAA;AAAF,MAAe,IAAImI,KAAJ,CAAU1H,IAAV,EAAgB2H,MAArC;AACA,QAAMC,GAAG,GAAGrI,QAAQ,CAACsI,aAAT,CAAuB,KAAvB,CAAZ;;AACA,MAAI,CAACD,GAAL,EAAU;AACR,UAAM,IAAInM,KAAJ,CAAU,mDAAV,CAAN;AACD;;AAEDqM,EAAAA,mBAAmB,CAACF,GAAD,CAAnB;AACAG,EAAAA,qBAAqB,CAACH,GAAD,EAAMJ,cAAN,CAArB;AAEA,SAAOI,GAAG,CAACI,SAAX;AACD;AAED,MAAMC,YAAY,GAAG,CAAC,MAAD,EAAS,QAAT,CAArB;;AAEA,SAASF,qBAAT,CAA+BH,GAA/B,EAAmDJ,cAAnD;AACE,QAAMU,WAAW,GAAGC,UAAU,CAACX,cAAD,CAA9B;;AACA,MAAI,CAACU,WAAL,EAAkB;AAChB,UAAM,IAAIzM,KAAJ,IAAa+L,qCAAb,CAAN;AACD;;AAED,OAAK,MAAMY,IAAX,IAAmBH,YAAnB,EAAiC;AAC/B,UAAM7J,OAAO,GAAGiK,KAAK,CAACC,IAAN,CAAWV,GAAG,CAACW,gBAAJ,KAAqCH,OAArC,CAAX,CAAhB;;AAEA,SAAK,MAAMI,EAAX,IAAiBpK,OAAjB,EAA0B;AACxB,YAAMuD,KAAK,GAAGwG,UAAU,CAACK,EAAE,CAACC,YAAH,CAAgBL,IAAhB,CAAD,CAAxB;;AACA,UAAI,CAACzG,KAAL,EAAY;AACV;AACD;;AAED,UAAI,CAAC+G,WAAW,CAAC/G,KAAD,EAAQuG,WAAR,CAAhB,EAAsC;AACpC;AACD;;AAEDM,MAAAA,EAAE,CAACG,YAAH,CAAgBP,IAAhB,EAAsB,cAAtB;AACD;AACF;AACF;;AAED,SAASD,UAAT,CAAoBxG,KAApB;AACE,MAAIA,KAAK,IAAI,IAAb,EAAmB;AACjB,WAAO,IAAP;AACD;;AAED,MAAI;AACF,WAAOiH,UAAU,CAACjH,KAAD,CAAjB;AACD,GAFD,CAEE,gBAAM;AACN,WAAO,IAAP;AACD;AACF;;AAED,SAAS+G,WAAT,CAAqBG,IAArB,EAAiDC,KAAjD;AACE,MAAID,IAAI,CAACE,GAAL,KAAaD,KAAK,CAACC,GAAvB,EAA4B;AAC1B,WAAO,KAAP;AACD;;AAED,MAAIF,IAAI,CAACG,IAAL,KAAcF,KAAK,CAACE,IAAxB,EAA8B;AAC5B,WAAO,KAAP;AACD;;AAED,MAAIH,IAAI,CAACI,KAAL,KAAeH,KAAK,CAACG,KAAzB,EAAgC;AAC9B,WAAO,KAAP;AACD;;AAED,MAAI,WAAWJ,IAAf,EAAqB;AACnB,QAAI,WAAWC,KAAf,EAAsB;AACpB,UAAID,IAAI,CAACK,KAAL,KAAeJ,KAAK,CAACI,KAAzB,EAAgC;AAC9B,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,IAAP;AACD;;AAED,SAASpB,mBAAT,CAA6BF,GAA7B;AACE,QAAMuB,KAAK,GAAGvB,GAAG,CAACa,YAAJ,CAAiB,OAAjB,CAAd;AACA,QAAMW,MAAM,GAAGxB,GAAG,CAACa,YAAJ,CAAiB,QAAjB,CAAf;AAEAb,EAAAA,GAAG,CAACe,YAAJ,CAAiB,SAAjB,SAAmCQ,SAASC,QAA5C;AACD;;AC5FD;;;;AAGA,MAAMC,WAAW,GAAG/L,OAAO,CAACgM,GAAR,CAAYD,WAAhC;AACA,MAAME,cAAc,GAAGjM,OAAO,CAACgM,GAAR,CAAYC,cAAnC;AACA,MAAMC,eAAe,GAAGlM,OAAO,CAACgM,GAAR,CAAYE,eAApC;AAEA;;;;AAGA,MAAMC,mBAAmB,GAAGnM,OAAO,CAACgM,GAAR,CAAYG,mBAAxC;AACA,MAAMC,qBAAqB,GAAGpM,OAAO,CAACgM,GAAR,CAAYI,qBAA1C;AACA,MAAMC,WAAW,GAAGrM,OAAO,CAACgM,GAAR,CAAYK,WAAhC;AACA,MAAMC,iBAAiB,GAAGtM,OAAO,CAACgM,GAAR,CAAYM,iBAAtC;AAEA;;;;AAGA,MAAMC,mBAAmB,GAAGvM,OAAO,CAACgM,GAAR,CAAYO,mBAAxC;AACA,MAAMC,iBAAiB,GAAGxM,OAAO,CAACgM,GAAR,CAAYQ,iBAAtC;AACA,MAAMC,gBAAgB,GAAGzM,OAAO,CAACgM,GAAR,CAAYS,gBAArC;AACA,MAAMC,qBAAqB,GAAG1M,OAAO,CAACgM,GAAR,CAAYU,qBAA1C;AAEA,KAAKC,KAAK,CACPC,UADE,CACS,WADT,EAEF9I,OAFE,CAGD,cAHC,EAID,6CAJC,EAKD,MAAM6I,KAAK,CAACE,MAAN,CAAa,QAAb,EAAuB;AAAEC,EAAAA,OAAO,EAAE,KAAX;AAAkBC,EAAAA,OAAO,EAAE,CAAC,KAAD,EAAQ,KAAR;AAA3B,CAAvB,CALL,EAMD,CAAC;AAAEnK,EAAAA;AAAF,CAAD;AACEwB,EAAAA,aAAa,CAAC6H,cAAD,EAAiB,gBAAjB,CAAb;AACA7H,EAAAA,aAAa,CAAC2H,WAAD,EAAc,aAAd,CAAb;AACA3H,EAAAA,aAAa,CAAC8H,eAAD,EAAkB,iBAAlB,CAAb;AAEA,OAAKxM,eAAe,CAACC,UAAhB,CACHsM,cADG,EAEHF,WAFG,EAGHG,eAHG,EAIHtJ,MAJG,EAKHoK,KALG,CAKIC,CAAD;AACN5M,IAAAA,OAAO,CAAC6M,KAAR,CAAcD,CAAd;AACAjN,IAAAA,OAAO,CAACmN,IAAR,CAAa,CAAb;AACD,GARI,CAAL;AASD,CApBA,EAsBFrJ,OAtBE,CAuBD,cAvBC,EAwBD,4CAxBC,EAyBD,MACE6I,KAAK,CACFE,MADH,CACU,MADV,EACkB;AAAEO,EAAAA,YAAY,EAAE,IAAhB;AAAsBzJ,EAAAA,IAAI,EAAE;AAA5B,CADlB,EAEGkJ,MAFH,CAEU,OAFV,EAEmB;AACfC,EAAAA,OAAO,EAAErD,4BADM;AAEf9F,EAAAA,IAAI,EAAE,QAFS;AAGf0J,EAAAA,kBAAkB,EAChB;AAJa,CAFnB,CA1BD,EAkCD,CAAC;AAAEhP,EAAAA,IAAF;AAAQiP,EAAAA;AAAR,CAAD;AACE,OAAK9H,QAAQ,CAACnH,IAAD,EAAO;AAAE2D,IAAAA,QAAQ,EAAE;AAAZ,GAAP,CAAR,CACFuL,IADE,CACIhI,OAAD,IAAayE,WAAW,CAACzE,OAAD,EAAU+H,KAAV,CAD3B,EAEFC,IAFE,CAEIC,SAAD,IAAe3L,SAAS,CAACxD,IAAD,EAAOmP,SAAP,CAF3B,EAGFR,KAHE,CAGKC,CAAD;AACL5M,IAAAA,OAAO,CAAC6M,KAAR,CAAcD,CAAd;AACAjN,IAAAA,OAAO,CAACmN,IAAR,CAAa,CAAb;AACD,GANE,CAAL;AAOD,CA1CA,EA4CFrJ,OA5CE,CA6CD,WA7CC,EA8CD,iDA9CC,EA+CD,EA/CC,EAgDD;AACEM,EAAAA,aAAa,CAACkI,iBAAD,EAAoB,mBAApB,CAAb;AACAlI,EAAAA,aAAa,CAAC+H,mBAAD,EAAsB,qBAAtB,CAAb;AAEA,OAAKvD,YAAY,CAACjJ,UAAb,CACH0M,WADG,WACHA,WADG,GACY,oBADZ,EAEHoB,MAAM,CAACnB,iBAAD,CAFH,EAGHH,mBAHG,EAIHC,qBAJG,WAIHA,qBAJG,GAIsB,MAJtB,EAKHY,KALG,CAKIC,CAAD;AACN5M,IAAAA,OAAO,CAAC6M,KAAR,CAAcD,CAAd;AACAjN,IAAAA,OAAO,CAACmN,IAAR,CAAa,CAAb;AACD,GARI,CAAL;AASD,CA7DA,EA+DFrJ,OA/DE,CAgED,WAhEC,EAiED,gDAjEC,EAkED,EAlEC,EAmED;AACEM,EAAAA,aAAa,CAACmI,mBAAD,EAAsB,qBAAtB,CAAb;AAEA,OAAK1G,YAAY,CAAClG,UAAb,CACH6M,iBADG,WACHA,iBADG,GACkB,OADlB,EAEHC,gBAFG,WAEHA,gBAFG,GAEiB,UAFjB,EAGHF,mBAHG,EAIHG,qBAJG,WAIHA,qBAJG,GAIsB,MAJtB,EAKHM,KALG,CAKIC,CAAD;AACN5M,IAAAA,OAAO,CAAC6M,KAAR,CAAcD,CAAd;AACAjN,IAAAA,OAAO,CAACmN,IAAR,CAAa,CAAb;AACD,GARI,CAAL;AASD,CA/EA,EAiFFO,aAjFE,GAkFFC,IAlFE,GAmFFC,KAnFE,EAAL"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["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 path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\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 private targets: Figma.Node[] = []\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 root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\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 this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\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 /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n // eslint-disable-next-line no-console\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).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 response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\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, response.body, '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 { 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 { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\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 { Octokit } from '@octokit/rest'\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 ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\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(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\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 ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\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(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).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, convertedColor)\n\n return svg.outerHTML\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 { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\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 () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ 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 void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .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 () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@charcoal-ui/icons-cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.1-alpha.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "source": "./src/index.ts",
@@ -50,5 +50,5 @@
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "gitHead": "addc6d8f443865a8b56327ef9a4ff2e69942a30b"
53
+ "gitHead": "09667dc786134bbfb4348b686ec4fdf571d327d2"
54
54
  }
@@ -81,13 +81,16 @@ export class FigmaFileClient {
81
81
 
82
82
  const outputDir = path.join(root, outputRootDir, exportFormat)
83
83
 
84
+ // eslint-disable-next-line no-console
84
85
  console.log(`Exporting ${url} components`)
85
86
  await client.loadSvg(outputDir)
86
87
 
88
+ // eslint-disable-next-line no-console
87
89
  console.log(`Exporting components type`)
88
90
  const typedefDir = path.join(root, outputRootDir, 'src')
89
91
  await client.writeTypeDef(typedefDir)
90
92
 
93
+ // eslint-disable-next-line no-console
91
94
  console.log('success!')
92
95
  }
93
96
 
@@ -123,6 +126,7 @@ export class FigmaFileClient {
123
126
  filenamify(name)
124
127
  )
125
128
 
129
+ // eslint-disable-next-line no-console
126
130
  console.log(`writing to ${outputDir}`)
127
131
 
128
132
  await ensureFile(fullname)
@@ -162,6 +166,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
162
166
  }
163
167
 
164
168
  private async loadImageUrls() {
169
+ // eslint-disable-next-line no-console
165
170
  console.log('Getting export urls')
166
171
 
167
172
  const { data } = await this.client.fileImages(this.fileId, {
@@ -195,6 +200,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
195
200
 
196
201
  await ensureDir(dirname)
197
202
 
203
+ // eslint-disable-next-line no-console
198
204
  console.log(`found: ${filename} => ✅ writing...`)
199
205
  await writeFile(fullname, response.body, 'utf8')
200
206
  })
@@ -202,6 +208,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
202
208
  }
203
209
 
204
210
  private async getFile() {
211
+ // eslint-disable-next-line no-console
205
212
  console.log('Processing response')
206
213
 
207
214
  const { data } = await this.client.file(this.fileId.toString())
@@ -28,8 +28,10 @@ export class GithubClient {
28
28
  const client = new this(repoOwner, repoName, token, defaultBranch)
29
29
 
30
30
  const diff = await client.createTreeFromDiff()
31
+ // eslint-disable-next-line no-console
31
32
  console.log(`${diff.length} files are changed`)
32
33
  if (diff.length === 0) {
34
+ // eslint-disable-next-line no-console
33
35
  console.log('no changes. aborting')
34
36
  return
35
37
  }
@@ -17,8 +17,10 @@ export class GitlabClient {
17
17
  const client = new this(host, projectId, privateToken, defaultBranch)
18
18
 
19
19
  const diff = await client.createActionsFromDiff()
20
+ // eslint-disable-next-line no-console
20
21
  console.log(`${diff.length} files are changed`)
21
22
  if (diff.length === 0) {
23
+ // eslint-disable-next-line no-console
22
24
  console.log('no changes. aborting')
23
25
  return
24
26
  }
@@ -1,5 +1,6 @@
1
1
  import PQueue from 'p-queue'
2
2
 
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
4
  export function concurrently(tasks: (() => Promise<any>)[]) {
4
5
  const queue = new PQueue({ concurrency: 3 })
5
6
  for (const task of tasks) {
package/src/index.ts CHANGED
@@ -46,6 +46,7 @@ void yargs
46
46
  OUTPUT_ROOT_DIR,
47
47
  format as 'svg' | 'pdf'
48
48
  ).catch((e) => {
49
+ // eslint-disable-next-line no-console
49
50
  console.error(e)
50
51
  process.exit(1)
51
52
  })
@@ -68,6 +69,7 @@ void yargs
68
69
  .then((content) => optimizeSvg(content, color))
69
70
  .then((optimized) => writeFile(file, optimized))
70
71
  .catch((e) => {
72
+ // eslint-disable-next-line no-console
71
73
  console.error(e)
72
74
  process.exit(1)
73
75
  })
@@ -87,6 +89,7 @@ void yargs
87
89
  GITLAB_ACCESS_TOKEN,
88
90
  GITLAB_DEFAULT_BRANCH ?? 'main'
89
91
  ).catch((e) => {
92
+ // eslint-disable-next-line no-console
90
93
  console.error(e)
91
94
  process.exit(1)
92
95
  })
@@ -105,6 +108,7 @@ void yargs
105
108
  GITHUB_ACCESS_TOKEN,
106
109
  GITHUB_DEFAULT_BRANCH ?? 'main'
107
110
  ).catch((e) => {
111
+ // eslint-disable-next-line no-console
108
112
  console.error(e)
109
113
  process.exit(1)
110
114
  })
@@ -94,7 +94,9 @@ function colorEquals(self: RgbColor | RgbaColor, other: RgbColor | RgbaColor) {
94
94
  }
95
95
 
96
96
  function addViewboxToRootSvg(svg: SVGSVGElement) {
97
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
97
98
  const width = svg.getAttribute('width')!
99
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
98
100
  const height = svg.getAttribute('height')!
99
101
 
100
102
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`)