@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.
- package/dist/FigmaFileClient.d.ts.map +1 -1
- package/dist/GitHubClient.d.ts.map +1 -1
- package/dist/GitlabClient.d.ts.map +1 -1
- package/dist/concurrently.d.ts.map +1 -1
- package/dist/index.cjs +26 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +26 -8
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +26 -8
- package/dist/index.module.js.map +1 -1
- package/package.json +7 -2
- package/src/FigmaFileClient.ts +7 -0
- package/src/GitHubClient.ts +2 -0
- package/src/GitlabClient.ts +2 -0
- package/src/concurrently.ts +1 -0
- package/src/index.ts +6 -0
- package/src/optimizeSvg.ts +2 -0
|
@@ -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;
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"GitHubClient.d.ts","sourceRoot":"","sources":["../src/GitHubClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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":"
|
|
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
|
-
|
|
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
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -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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"}
|
package/dist/index.modern.js
CHANGED
|
@@ -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
|
-
|
|
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
|
});
|
package/dist/index.modern.js.map
CHANGED
|
@@ -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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"}
|
package/dist/index.module.js
CHANGED
|
@@ -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
|
-
|
|
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
|
});
|
package/dist/index.module.js.map
CHANGED
|
@@ -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.
|
|
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
|
-
"
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/pixiv/charcoal.git",
|
|
56
|
+
"directory": "packages/icons-cli"
|
|
57
|
+
},
|
|
58
|
+
"gitHead": "172c6cd4b52fb2c60caed41e3035296e237ec32f"
|
|
54
59
|
}
|
package/src/FigmaFileClient.ts
CHANGED
|
@@ -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())
|
package/src/GitHubClient.ts
CHANGED
|
@@ -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
|
}
|
package/src/GitlabClient.ts
CHANGED
|
@@ -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
|
}
|
package/src/concurrently.ts
CHANGED
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
|
})
|
package/src/optimizeSvg.ts
CHANGED
|
@@ -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}`)
|