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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  var fsExtra = require('fs-extra');
2
3
  var yargs = require('yargs');
3
4
  var path = require('path');
@@ -92,12 +93,15 @@ class FigmaFileClient {
92
93
  static async runFromCli(url, token, outputRootDir, exportFormat) {
93
94
  const client = new this(url, token, exportFormat);
94
95
  const root = process.cwd();
95
- const outputDir = path__default["default"].join(root, outputRootDir, exportFormat);
96
+ const outputDir = path__default["default"].join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
97
+
96
98
  console.log(`Exporting ${url} components`);
97
- await client.loadSvg(outputDir);
99
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
100
+
98
101
  console.log(`Exporting components type`);
99
102
  const typedefDir = path__default["default"].join(root, outputRootDir, 'src');
100
- await client.writeTypeDef(typedefDir);
103
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
104
+
101
105
  console.log('success!');
102
106
  }
103
107
 
@@ -132,7 +136,8 @@ class FigmaFileClient {
132
136
  const fullname = path__default["default"].resolve(outputDir, 'filenames.ts');
133
137
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
134
138
  name
135
- }) => filenamify(name));
139
+ }) => filenamify(name)); // eslint-disable-next-line no-console
140
+
136
141
  console.log(`writing to ${outputDir}`);
137
142
  await fsExtra.ensureFile(fullname);
138
143
  await fsExtra.writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -169,6 +174,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
169
174
  }
170
175
 
171
176
  async loadImageUrls() {
177
+ // eslint-disable-next-line no-console
172
178
  console.log('Getting export urls');
173
179
  const {
174
180
  data
@@ -198,13 +204,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
198
204
  const filename = `${filenamify(component.name)}.${this.exportFormat}`;
199
205
  const fullname = path__default["default"].join(outputDir, filename);
200
206
  const dirname = path__default["default"].dirname(fullname);
201
- await fsExtra.ensureDir(dirname);
207
+ await fsExtra.ensureDir(dirname); // eslint-disable-next-line no-console
208
+
202
209
  console.log(`found: ${filename} => ✅ writing...`);
203
210
  await fsExtra.writeFile(fullname, response.body, 'utf8');
204
211
  }));
205
212
  }
206
213
 
207
214
  async getFile() {
215
+ // eslint-disable-next-line no-console
208
216
  console.log('Processing response');
209
217
  const {
210
218
  data
@@ -489,10 +497,12 @@ async function collectGitStatus() {
489
497
  class GithubClient {
490
498
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
491
499
  const client = new this(repoOwner, repoName, token, defaultBranch);
492
- const diff = await client.createTreeFromDiff();
500
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
501
+
493
502
  console.log(`${diff.length} files are changed`);
494
503
 
495
504
  if (diff.length === 0) {
505
+ // eslint-disable-next-line no-console
496
506
  console.log('no changes. aborting');
497
507
  return;
498
508
  }
@@ -641,10 +651,12 @@ class GithubClient {
641
651
  class GitlabClient {
642
652
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
643
653
  const client = new this(host, projectId, privateToken, defaultBranch);
644
- const diff = await client.createActionsFromDiff();
654
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
655
+
645
656
  console.log(`${diff.length} files are changed`);
646
657
 
647
658
  if (diff.length === 0) {
659
+ // eslint-disable-next-line no-console
648
660
  console.log('no changes. aborting');
649
661
  return;
650
662
  }
@@ -824,7 +836,9 @@ function colorEquals(self, other) {
824
836
  }
825
837
 
826
838
  function addViewboxToRootSvg(svg) {
827
- const width = svg.getAttribute('width');
839
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
840
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
841
+
828
842
  const height = svg.getAttribute('height');
829
843
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
830
844
  }
@@ -862,6 +876,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
862
876
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
863
877
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
864
878
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
879
+ // eslint-disable-next-line no-console
865
880
  console.error(e);
866
881
  process.exit(1);
867
882
  });
@@ -879,6 +894,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
879
894
  void fsExtra.readFile(file, {
880
895
  encoding: 'utf-8'
881
896
  }).then(content => optimizeSvg(content, color)).then(optimized => fsExtra.writeFile(file, optimized)).catch(e => {
897
+ // eslint-disable-next-line no-console
882
898
  console.error(e);
883
899
  process.exit(1);
884
900
  });
@@ -886,12 +902,14 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
886
902
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
887
903
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
888
904
  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 => {
905
+ // eslint-disable-next-line no-console
889
906
  console.error(e);
890
907
  process.exit(1);
891
908
  });
892
909
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
893
910
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
894
911
  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 => {
912
+ // eslint-disable-next-line no-console
895
913
  console.error(e);
896
914
  process.exit(1);
897
915
  });
@@ -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","#!/usr/bin/env node\n\nimport { 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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"}
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  import { remove, ensureDir, ensureFile, writeFile, readFile } from 'fs-extra';
2
3
  import yargs from 'yargs';
3
4
  import path from 'path';
@@ -82,12 +83,15 @@ class FigmaFileClient {
82
83
  static async runFromCli(url, token, outputRootDir, exportFormat) {
83
84
  const client = new this(url, token, exportFormat);
84
85
  const root = process.cwd();
85
- const outputDir = path.join(root, outputRootDir, exportFormat);
86
+ const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
87
+
86
88
  console.log(`Exporting ${url} components`);
87
- await client.loadSvg(outputDir);
89
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
90
+
88
91
  console.log(`Exporting components type`);
89
92
  const typedefDir = path.join(root, outputRootDir, 'src');
90
- await client.writeTypeDef(typedefDir);
93
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
94
+
91
95
  console.log('success!');
92
96
  }
93
97
 
@@ -122,7 +126,8 @@ class FigmaFileClient {
122
126
  const fullname = path.resolve(outputDir, 'filenames.ts');
123
127
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
124
128
  name
125
- }) => filenamify(name));
129
+ }) => filenamify(name)); // eslint-disable-next-line no-console
130
+
126
131
  console.log(`writing to ${outputDir}`);
127
132
  await ensureFile(fullname);
128
133
  await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -159,6 +164,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
159
164
  }
160
165
 
161
166
  async loadImageUrls() {
167
+ // eslint-disable-next-line no-console
162
168
  console.log('Getting export urls');
163
169
  const {
164
170
  data
@@ -190,13 +196,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
190
196
  const filename = `${filenamify(component.name)}.${_this.exportFormat}`;
191
197
  const fullname = path.join(outputDir, filename);
192
198
  const dirname = path.dirname(fullname);
193
- await ensureDir(dirname);
199
+ await ensureDir(dirname); // eslint-disable-next-line no-console
200
+
194
201
  console.log(`found: ${filename} => ✅ writing...`);
195
202
  await writeFile(fullname, response.body, 'utf8');
196
203
  }));
197
204
  }
198
205
 
199
206
  async getFile() {
207
+ // eslint-disable-next-line no-console
200
208
  console.log('Processing response');
201
209
  const {
202
210
  data
@@ -481,10 +489,12 @@ async function collectGitStatus() {
481
489
  class GithubClient {
482
490
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
483
491
  const client = new this(repoOwner, repoName, token, defaultBranch);
484
- const diff = await client.createTreeFromDiff();
492
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
493
+
485
494
  console.log(`${diff.length} files are changed`);
486
495
 
487
496
  if (diff.length === 0) {
497
+ // eslint-disable-next-line no-console
488
498
  console.log('no changes. aborting');
489
499
  return;
490
500
  }
@@ -633,10 +643,12 @@ class GithubClient {
633
643
  class GitlabClient {
634
644
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
635
645
  const client = new this(host, projectId, privateToken, defaultBranch);
636
- const diff = await client.createActionsFromDiff();
646
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
647
+
637
648
  console.log(`${diff.length} files are changed`);
638
649
 
639
650
  if (diff.length === 0) {
651
+ // eslint-disable-next-line no-console
640
652
  console.log('no changes. aborting');
641
653
  return;
642
654
  }
@@ -816,7 +828,9 @@ function colorEquals(self, other) {
816
828
  }
817
829
 
818
830
  function addViewboxToRootSvg(svg) {
819
- const width = svg.getAttribute('width');
831
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
832
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
833
+
820
834
  const height = svg.getAttribute('height');
821
835
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
822
836
  }
@@ -854,6 +868,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
854
868
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
855
869
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
856
870
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
871
+ // eslint-disable-next-line no-console
857
872
  console.error(e);
858
873
  process.exit(1);
859
874
  });
@@ -871,6 +886,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
871
886
  void readFile(file, {
872
887
  encoding: 'utf-8'
873
888
  }).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
889
+ // eslint-disable-next-line no-console
874
890
  console.error(e);
875
891
  process.exit(1);
876
892
  });
@@ -878,12 +894,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
878
894
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
879
895
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
880
896
  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 => {
897
+ // eslint-disable-next-line no-console
881
898
  console.error(e);
882
899
  process.exit(1);
883
900
  });
884
901
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
885
902
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
886
903
  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 => {
904
+ // eslint-disable-next-line no-console
887
905
  console.error(e);
888
906
  process.exit(1);
889
907
  });
@@ -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","#!/usr/bin/env node\n\nimport { 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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"}
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  import { remove, ensureDir, ensureFile, writeFile, readFile } from 'fs-extra';
2
3
  import yargs from 'yargs';
3
4
  import path from 'path';
@@ -82,12 +83,15 @@ class FigmaFileClient {
82
83
  static async runFromCli(url, token, outputRootDir, exportFormat) {
83
84
  const client = new this(url, token, exportFormat);
84
85
  const root = process.cwd();
85
- const outputDir = path.join(root, outputRootDir, exportFormat);
86
+ const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
87
+
86
88
  console.log(`Exporting ${url} components`);
87
- await client.loadSvg(outputDir);
89
+ await client.loadSvg(outputDir); // eslint-disable-next-line no-console
90
+
88
91
  console.log(`Exporting components type`);
89
92
  const typedefDir = path.join(root, outputRootDir, 'src');
90
- await client.writeTypeDef(typedefDir);
93
+ await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
94
+
91
95
  console.log('success!');
92
96
  }
93
97
 
@@ -122,7 +126,8 @@ class FigmaFileClient {
122
126
  const fullname = path.resolve(outputDir, 'filenames.ts');
123
127
  const KNOWN_ICON_FILES = Object.values(this.components).map(({
124
128
  name
125
- }) => filenamify(name));
129
+ }) => filenamify(name)); // eslint-disable-next-line no-console
130
+
126
131
  console.log(`writing to ${outputDir}`);
127
132
  await ensureFile(fullname);
128
133
  await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
@@ -159,6 +164,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
159
164
  }
160
165
 
161
166
  async loadImageUrls() {
167
+ // eslint-disable-next-line no-console
162
168
  console.log('Getting export urls');
163
169
  const {
164
170
  data
@@ -188,13 +194,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
188
194
  const filename = `${filenamify(component.name)}.${this.exportFormat}`;
189
195
  const fullname = path.join(outputDir, filename);
190
196
  const dirname = path.dirname(fullname);
191
- await ensureDir(dirname);
197
+ await ensureDir(dirname); // eslint-disable-next-line no-console
198
+
192
199
  console.log(`found: ${filename} => ✅ writing...`);
193
200
  await writeFile(fullname, response.body, 'utf8');
194
201
  }));
195
202
  }
196
203
 
197
204
  async getFile() {
205
+ // eslint-disable-next-line no-console
198
206
  console.log('Processing response');
199
207
  const {
200
208
  data
@@ -479,10 +487,12 @@ async function collectGitStatus() {
479
487
  class GithubClient {
480
488
  static async runFromCli(repoOwner, repoName, token, defaultBranch) {
481
489
  const client = new this(repoOwner, repoName, token, defaultBranch);
482
- const diff = await client.createTreeFromDiff();
490
+ const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
491
+
483
492
  console.log(`${diff.length} files are changed`);
484
493
 
485
494
  if (diff.length === 0) {
495
+ // eslint-disable-next-line no-console
486
496
  console.log('no changes. aborting');
487
497
  return;
488
498
  }
@@ -631,10 +641,12 @@ class GithubClient {
631
641
  class GitlabClient {
632
642
  static async runFromCli(host, projectId, privateToken, defaultBranch) {
633
643
  const client = new this(host, projectId, privateToken, defaultBranch);
634
- const diff = await client.createActionsFromDiff();
644
+ const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
645
+
635
646
  console.log(`${diff.length} files are changed`);
636
647
 
637
648
  if (diff.length === 0) {
649
+ // eslint-disable-next-line no-console
638
650
  console.log('no changes. aborting');
639
651
  return;
640
652
  }
@@ -814,7 +826,9 @@ function colorEquals(self, other) {
814
826
  }
815
827
 
816
828
  function addViewboxToRootSvg(svg) {
817
- const width = svg.getAttribute('width');
829
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
830
+ const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
831
+
818
832
  const height = svg.getAttribute('height');
819
833
  svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
820
834
  }
@@ -852,6 +866,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
852
866
  mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
853
867
  mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
854
868
  void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
869
+ // eslint-disable-next-line no-console
855
870
  console.error(e);
856
871
  process.exit(1);
857
872
  });
@@ -869,6 +884,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
869
884
  void readFile(file, {
870
885
  encoding: 'utf-8'
871
886
  }).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
887
+ // eslint-disable-next-line no-console
872
888
  console.error(e);
873
889
  process.exit(1);
874
890
  });
@@ -876,12 +892,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
876
892
  mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
877
893
  mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
878
894
  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 => {
895
+ // eslint-disable-next-line no-console
879
896
  console.error(e);
880
897
  process.exit(1);
881
898
  });
882
899
  }).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
883
900
  mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
884
901
  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 => {
902
+ // eslint-disable-next-line no-console
885
903
  console.error(e);
886
904
  process.exit(1);
887
905
  });
@@ -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","#!/usr/bin/env node\n\nimport { 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.2",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "source": "./src/index.ts",
@@ -50,5 +50,10 @@
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "gitHead": "addc6d8f443865a8b56327ef9a4ff2e69942a30b"
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/pixiv/charcoal.git",
56
+ "directory": "packages/icons-cli"
57
+ },
58
+ "gitHead": "172c6cd4b52fb2c60caed41e3035296e237ec32f"
54
59
  }
@@ -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
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env node
2
+
1
3
  import { readFile, writeFile } from 'fs-extra'
2
4
  import yargs from 'yargs'
3
5
  import { FigmaFileClient } from './FigmaFileClient'
@@ -46,6 +48,7 @@ void yargs
46
48
  OUTPUT_ROOT_DIR,
47
49
  format as 'svg' | 'pdf'
48
50
  ).catch((e) => {
51
+ // eslint-disable-next-line no-console
49
52
  console.error(e)
50
53
  process.exit(1)
51
54
  })
@@ -68,6 +71,7 @@ void yargs
68
71
  .then((content) => optimizeSvg(content, color))
69
72
  .then((optimized) => writeFile(file, optimized))
70
73
  .catch((e) => {
74
+ // eslint-disable-next-line no-console
71
75
  console.error(e)
72
76
  process.exit(1)
73
77
  })
@@ -87,6 +91,7 @@ void yargs
87
91
  GITLAB_ACCESS_TOKEN,
88
92
  GITLAB_DEFAULT_BRANCH ?? 'main'
89
93
  ).catch((e) => {
94
+ // eslint-disable-next-line no-console
90
95
  console.error(e)
91
96
  process.exit(1)
92
97
  })
@@ -105,6 +110,7 @@ void yargs
105
110
  GITHUB_ACCESS_TOKEN,
106
111
  GITHUB_DEFAULT_BRANCH ?? 'main'
107
112
  ).catch((e) => {
113
+ // eslint-disable-next-line no-console
108
114
  console.error(e)
109
115
  process.exit(1)
110
116
  })
@@ -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}`)