@charcoal-ui/icons-cli 1.0.0 → 1.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +25 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +25 -8
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +25 -8
- package/dist/index.module.js.map +1 -1
- package/package.json +2 -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 +4 -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
|
@@ -92,12 +92,15 @@ class FigmaFileClient {
|
|
|
92
92
|
static async runFromCli(url, token, outputRootDir, exportFormat) {
|
|
93
93
|
const client = new this(url, token, exportFormat);
|
|
94
94
|
const root = process.cwd();
|
|
95
|
-
const outputDir = path__default["default"].join(root, outputRootDir, exportFormat);
|
|
95
|
+
const outputDir = path__default["default"].join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
|
|
96
|
+
|
|
96
97
|
console.log(`Exporting ${url} components`);
|
|
97
|
-
await client.loadSvg(outputDir);
|
|
98
|
+
await client.loadSvg(outputDir); // eslint-disable-next-line no-console
|
|
99
|
+
|
|
98
100
|
console.log(`Exporting components type`);
|
|
99
101
|
const typedefDir = path__default["default"].join(root, outputRootDir, 'src');
|
|
100
|
-
await client.writeTypeDef(typedefDir);
|
|
102
|
+
await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
|
|
103
|
+
|
|
101
104
|
console.log('success!');
|
|
102
105
|
}
|
|
103
106
|
|
|
@@ -132,7 +135,8 @@ class FigmaFileClient {
|
|
|
132
135
|
const fullname = path__default["default"].resolve(outputDir, 'filenames.ts');
|
|
133
136
|
const KNOWN_ICON_FILES = Object.values(this.components).map(({
|
|
134
137
|
name
|
|
135
|
-
}) => filenamify(name));
|
|
138
|
+
}) => filenamify(name)); // eslint-disable-next-line no-console
|
|
139
|
+
|
|
136
140
|
console.log(`writing to ${outputDir}`);
|
|
137
141
|
await fsExtra.ensureFile(fullname);
|
|
138
142
|
await fsExtra.writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
|
|
@@ -169,6 +173,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
169
173
|
}
|
|
170
174
|
|
|
171
175
|
async loadImageUrls() {
|
|
176
|
+
// eslint-disable-next-line no-console
|
|
172
177
|
console.log('Getting export urls');
|
|
173
178
|
const {
|
|
174
179
|
data
|
|
@@ -198,13 +203,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
198
203
|
const filename = `${filenamify(component.name)}.${this.exportFormat}`;
|
|
199
204
|
const fullname = path__default["default"].join(outputDir, filename);
|
|
200
205
|
const dirname = path__default["default"].dirname(fullname);
|
|
201
|
-
await fsExtra.ensureDir(dirname);
|
|
206
|
+
await fsExtra.ensureDir(dirname); // eslint-disable-next-line no-console
|
|
207
|
+
|
|
202
208
|
console.log(`found: ${filename} => ✅ writing...`);
|
|
203
209
|
await fsExtra.writeFile(fullname, response.body, 'utf8');
|
|
204
210
|
}));
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
async getFile() {
|
|
214
|
+
// eslint-disable-next-line no-console
|
|
208
215
|
console.log('Processing response');
|
|
209
216
|
const {
|
|
210
217
|
data
|
|
@@ -489,10 +496,12 @@ async function collectGitStatus() {
|
|
|
489
496
|
class GithubClient {
|
|
490
497
|
static async runFromCli(repoOwner, repoName, token, defaultBranch) {
|
|
491
498
|
const client = new this(repoOwner, repoName, token, defaultBranch);
|
|
492
|
-
const diff = await client.createTreeFromDiff();
|
|
499
|
+
const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
|
|
500
|
+
|
|
493
501
|
console.log(`${diff.length} files are changed`);
|
|
494
502
|
|
|
495
503
|
if (diff.length === 0) {
|
|
504
|
+
// eslint-disable-next-line no-console
|
|
496
505
|
console.log('no changes. aborting');
|
|
497
506
|
return;
|
|
498
507
|
}
|
|
@@ -641,10 +650,12 @@ class GithubClient {
|
|
|
641
650
|
class GitlabClient {
|
|
642
651
|
static async runFromCli(host, projectId, privateToken, defaultBranch) {
|
|
643
652
|
const client = new this(host, projectId, privateToken, defaultBranch);
|
|
644
|
-
const diff = await client.createActionsFromDiff();
|
|
653
|
+
const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
|
|
654
|
+
|
|
645
655
|
console.log(`${diff.length} files are changed`);
|
|
646
656
|
|
|
647
657
|
if (diff.length === 0) {
|
|
658
|
+
// eslint-disable-next-line no-console
|
|
648
659
|
console.log('no changes. aborting');
|
|
649
660
|
return;
|
|
650
661
|
}
|
|
@@ -824,7 +835,9 @@ function colorEquals(self, other) {
|
|
|
824
835
|
}
|
|
825
836
|
|
|
826
837
|
function addViewboxToRootSvg(svg) {
|
|
827
|
-
|
|
838
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
839
|
+
const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
840
|
+
|
|
828
841
|
const height = svg.getAttribute('height');
|
|
829
842
|
svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
|
|
830
843
|
}
|
|
@@ -862,6 +875,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
|
|
|
862
875
|
mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
|
|
863
876
|
mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
|
|
864
877
|
void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
|
|
878
|
+
// eslint-disable-next-line no-console
|
|
865
879
|
console.error(e);
|
|
866
880
|
process.exit(1);
|
|
867
881
|
});
|
|
@@ -879,6 +893,7 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
|
|
|
879
893
|
void fsExtra.readFile(file, {
|
|
880
894
|
encoding: 'utf-8'
|
|
881
895
|
}).then(content => optimizeSvg(content, color)).then(optimized => fsExtra.writeFile(file, optimized)).catch(e => {
|
|
896
|
+
// eslint-disable-next-line no-console
|
|
882
897
|
console.error(e);
|
|
883
898
|
process.exit(1);
|
|
884
899
|
});
|
|
@@ -886,12 +901,14 @@ void yargs__default["default"].scriptName('icons-cli').command('figma:export', '
|
|
|
886
901
|
mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
|
|
887
902
|
mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
|
|
888
903
|
void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
904
|
+
// eslint-disable-next-line no-console
|
|
889
905
|
console.error(e);
|
|
890
906
|
process.exit(1);
|
|
891
907
|
});
|
|
892
908
|
}).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
|
|
893
909
|
mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
|
|
894
910
|
void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
911
|
+
// eslint-disable-next-line no-console
|
|
895
912
|
console.error(e);
|
|
896
913
|
process.exit(1);
|
|
897
914
|
});
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;SAEgBA,aAAaC;AAC3B,QAAMC,KAAK,GAAG,IAAIC,0BAAJ,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,kBAAK,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,6BAAS,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,wBAAI,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,wBAAI,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,yBAAK,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,cAAM,CAACf,SAAD,CAAZ;AACA,UAAMgB,iBAAS,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,wBAAI,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,kBAAU,CAACN,QAAD,CAAhB;AACA,UAAMO,iBAAS,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,uBAAG,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,wBAAI,CAACC,IAAL,CAAUF,SAAV,EAAqBqD,QAArB,CAAjB;AACA,YAAMC,OAAO,GAAGrD,wBAAI,CAACqD,OAAL,CAAalC,QAAb,CAAhB;AAEA,YAAMJ,iBAAS,CAACsC,OAAD,CAAf;AAEAnD,MAAAA,OAAO,CAACC,GAAR,WAAsBiD,0BAAtB;AACA,YAAM1B,iBAAS,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,kBAAI,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,wBAAI,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,WAAE,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,wBAAI,CAACoB,OAAL,CAAagD,SAAb,EAAwBE,GAAxB,CAAlB,CAD6B;;AAI7B,YAAMO,IAAI,8BAASL,WAAE,CAACK,IAAH,CAAQD,SAAR,CAAT,CAAV;;AACA,UAAI,CAACC,IAAI,CAACC,WAAL,EAAL,EAAyB;AACvB;AACD,OAP4B;;;AAU7B,YAAMC,KAAK,8BAASP,WAAE,CAACC,OAAH,CAAWG,SAAX,CAAT,CAAX;;AAEA,WAAK,MAAM1G,IAAX,IAAmB6G,KAAnB,EAA0B;AACxB,cAAMC,QAAQ,GAAGhF,wBAAI,CAACoB,OAAL,CAAagD,SAAb,EAAwBE,GAAxB,EAA6BpG,IAA7B,CAAjB;AACA,cAAM+G,YAAY,GAAGjF,wBAAI,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,WAAE,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,YAAJ,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,WAAJ,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,wBAAJ,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,WAAJ,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,mBAAU,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,yBAAK,CACPC,UADE,CACS,WADT,EAEF9I,OAFE,CAGD,cAHC,EAID,6CAJC,EAKD,MAAM6I,yBAAK,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,yBAAK,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,gBAAQ,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,iBAAS,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.cjs","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["import PQueue from 'p-queue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function concurrently(tasks: (() => Promise<any>)[]) {\n const queue = new PQueue({ concurrency: 3 })\n for (const task of tasks) {\n void queue.add(task)\n }\n queue.start()\n return queue.onIdle()\n}\n","import path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\n\ninterface Component {\n id: string\n name: string\n image?: string\n}\n\nexport class FigmaFileClient {\n private readonly fileId: string\n private readonly nodeId?: string\n private readonly exportFormat: ExportFormat\n private readonly client: Figma.ClientInterface\n\n private components: Record<string, Component> = {}\n private targets: Figma.Node[] = []\n\n static async runFromCli(\n url: string,\n token: string,\n outputRootDir: string,\n exportFormat: ExportFormat\n ) {\n const client = new this(url, token, exportFormat)\n\n const root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\n\n // eslint-disable-next-line no-console\n console.log('success!')\n }\n\n constructor(\n url: string,\n personalAccessToken: string,\n exportFormat: ExportFormat\n ) {\n this.client = Figma.Client({\n personalAccessToken,\n })\n\n this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\n this.exportFormat = exportFormat\n }\n\n async loadSvg(outputDir: string) {\n await remove(outputDir)\n await ensureDir(outputDir)\n\n await this.loadComponents()\n await this.loadImageUrls()\n await this.downloadImages(outputDir)\n }\n\n /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n // eslint-disable-next-line no-console\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\n // eslint-disable-next-line no-console\n console.log('Getting export urls')\n\n const { data } = await this.client.fileImages(this.fileId, {\n format: this.exportFormat,\n ids: Object.keys(this.components),\n scale: 1,\n })\n\n for (const [id, image] of Object.entries(data.images)) {\n this.components[id].image = image\n }\n }\n\n private async downloadImages(outputDir: string) {\n return concurrently(\n Object.values(this.components).map((component) => async () => {\n if (component.image === undefined) {\n return\n }\n\n const response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\n\n const filename = `${filenamify(component.name)}.${this.exportFormat}`\n const fullname = path.join(outputDir, filename)\n const dirname = path.dirname(fullname)\n\n await ensureDir(dirname)\n\n // eslint-disable-next-line no-console\n console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, response.body, 'utf8')\n })\n )\n }\n\n private async getFile() {\n // eslint-disable-next-line no-console\n console.log('Processing response')\n\n const { data } = await this.client.file(this.fileId.toString())\n\n return data\n }\n\n private findComponentsRecursively(child: Figma.Node) {\n if (child.type === 'COMPONENT') {\n const { name, id } = child\n\n if (isIconNode(child)) {\n this.components[id] = {\n name,\n id,\n }\n }\n } else if ('children' in child) {\n child.children.forEach((grandChild) =>\n this.findComponentsRecursively(grandChild)\n )\n }\n }\n}\n","import { exec } from 'child_process'\n\n/**\n * FIXME: util.promisify を使うと node-libs-browser に入っている方が使われてしまい、壊れる\n */\nexport const execp = (command: string) =>\n new Promise<string>((resolve, reject) => {\n exec(command, (err, stdout) => {\n if (err) {\n return reject(err)\n }\n\n return resolve(stdout)\n })\n })\n\nexport function mustBeDefined<T>(\n value: T,\n name: string\n): asserts value is NonNullable<T> {\n if (typeof value === 'undefined') {\n throw new TypeError(`${name} must be defined.`)\n }\n}\n","import { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\n s.slice(3),\n s.startsWith(' M')\n ? 'modified'\n : s.startsWith('??')\n ? 'untracked'\n : s.startsWith(' D')\n ? 'deleted'\n : null,\n ] as const\n )\n )\n}\n","import { Octokit } from '@octokit/rest'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype RefResponse = ReturnType<GithubClient['createBranch']> extends Promise<\n infer R\n>\n ? R\n : never\n\ninterface TreeItem {\n path?: string\n mode?: '100644' | '100755' | '040000' | '160000' | '120000'\n type?: 'blob' | 'commit' | 'tree'\n sha?: string | null\n content?: string\n}\n\nexport class GithubClient {\n private readonly api: Octokit\n private readonly now: Date\n\n static async runFromCli(\n repoOwner: string,\n repoName: string,\n token: string,\n defaultBranch: string\n ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n const newBranch = await client.createBranch()\n\n await client.createCommit(diff, newBranch)\n return client.createPullRequest(newBranch)\n }\n\n constructor(\n private readonly repoOwner: string,\n private readonly repoName: string,\n token: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Octokit({\n auth: token,\n })\n\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or pull request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createTreeFromDiff(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\n const item = {\n path: file.relativePath,\n // 100 はファイル 644 は実行不可なファイルであるという意味\n // @see https://octokit.github.io/rest.js/v18#git-create-tree\n mode: '100644' as const,\n content: file.content,\n }\n\n if (file.status === 'deleted') {\n // https://stackoverflow.com/questions/23637961/how-do-i-mark-a-file-as-deleted-in-a-tree-using-the-github-api\n tree.push({\n ...item,\n sha: null,\n })\n } else {\n tree.push(item)\n }\n }\n\n return tree\n }\n\n async createCommit(tree: TreeItem[], targetBranch: RefResponse) {\n const parentCommit = await this.api.git.getCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n commit_sha: targetBranch.data.object.sha,\n })\n\n const newTree = await this.api.git.createTree({\n owner: this.repoOwner,\n repo: this.repoName,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n base_tree: parentCommit.data.tree.sha,\n tree,\n })\n\n // この時点ではどのブランチにも属さないコミットができる\n const commit = await this.api.git.createCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n message: this.message,\n tree: newTree.data.sha,\n parents: [parentCommit.data.sha],\n })\n\n // ref を更新することで、commit が targetBranch に属するようになる\n await this.api.git.updateRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.branch}`,\n sha: commit.data.sha,\n })\n\n return commit\n }\n\n async createPullRequest(targetBranch: RefResponse) {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.pulls.create({\n owner: this.repoOwner,\n repo: this.repoName,\n head: targetBranch.data.ref,\n base: defaultBranch.data.ref,\n title: this.message,\n body: '',\n })\n }\n\n private getDefaultBranchRef() {\n return this.api.git.getRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.defaultBranch}`,\n })\n }\n\n async createBranch() {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.git.createRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `refs/heads/${this.branch}`,\n sha: defaultBranch.data.object.sha,\n })\n }\n}\n","import type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype GitlabApi = InstanceType<typeof Gitlab>\n\nexport class GitlabClient {\n private readonly api: GitlabApi\n private readonly now: Date\n\n static async runFromCli(\n host: string,\n projectId: number,\n privateToken: string,\n defaultBranch: string\n ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n await client.createCommit(diff)\n return client.createMergeRequest()\n }\n\n constructor(\n private readonly host: string,\n private readonly projectId: number,\n privateToken: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Gitlab({\n host: this.host,\n token: privateToken,\n })\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or merge request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createActionsFromDiff(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\n actions.push({\n action:\n file.status === 'untracked'\n ? 'create'\n : file.status === 'deleted'\n ? 'delete'\n : 'update',\n filePath: file.relativePath,\n content: file.content,\n })\n }\n\n return actions\n }\n\n async createCommit(diff: CommitAction[]) {\n return this.api.Commits.create(\n this.projectId,\n this.branch,\n this.message,\n diff,\n {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n start_branch: this.defaultBranch,\n }\n )\n }\n\n createMergeRequest() {\n return this.api.MergeRequests.create(\n this.projectId,\n this.branch,\n this.defaultBranch,\n this.message\n )\n }\n}\n","import { JSDOM } from 'jsdom'\nimport { parseToRgb } from 'polished'\nimport type { RgbColor, RgbaColor } from 'polished/lib/types/color'\nimport Svgo from 'svgo'\n\nexport const DEFAULT_CURRENT_COLOR_TARGET = '#858585'\n\nconst svgo = new Svgo({\n plugins: [\n // NOTICE: SVGO は「svg 内のすべての fill を currentColor に変える」機能しかない\n // icons-cli に必要なのは「特定の黒っぽい色だけ currentColor に変える」機能\n // なので、convertColors plugin は使わない\n // { convertColors: { currentColor: true } },\n { removeViewBox: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).window\n const svg = document.querySelector('svg')\n if (!svg) {\n throw new Error('optimizeSvg: input string seems not to have <svg>')\n }\n\n addViewboxToRootSvg(svg)\n convertToCurrentColor(svg, convertedColor)\n\n return svg.outerHTML\n}\n\nconst TARGET_ATTRS = ['fill', 'stroke']\n\nfunction convertToCurrentColor(svg: SVGSVGElement, convertedColor: string) {\n const targetColor = parseColor(convertedColor)\n if (!targetColor) {\n throw new Error(`${convertedColor} is not a valid color`)\n }\n\n for (const attr of TARGET_ATTRS) {\n const targets = Array.from(svg.querySelectorAll<SVGElement>(`[${attr}]`))\n\n for (const el of targets) {\n const value = parseColor(el.getAttribute(attr))\n if (!value) {\n continue\n }\n\n if (!colorEquals(value, targetColor)) {\n continue\n }\n\n el.setAttribute(attr, 'currentColor')\n }\n }\n}\n\nfunction parseColor(value: string | null) {\n if (value == null) {\n return null\n }\n\n try {\n return parseToRgb(value)\n } catch {\n return null\n }\n}\n\nfunction colorEquals(self: RgbColor | RgbaColor, other: RgbColor | RgbaColor) {\n if (self.red !== other.red) {\n return false\n }\n\n if (self.blue !== other.blue) {\n return false\n }\n\n if (self.green !== other.green) {\n return false\n }\n\n if ('alpha' in self) {\n if ('alpha' in other) {\n if (self.alpha !== other.alpha) {\n return false\n }\n }\n }\n\n return true\n}\n\nfunction addViewboxToRootSvg(svg: SVGSVGElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const width = svg.getAttribute('width')!\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\nimport { mustBeDefined } from './utils'\n\n/**\n * Figma\n */\nconst FIGMA_TOKEN = process.env.FIGMA_TOKEN\nconst FIGMA_FILE_URL = process.env.FIGMA_FILE_URL\nconst OUTPUT_ROOT_DIR = process.env.OUTPUT_ROOT_DIR\n\n/**\n * GitLab\n */\nconst GITLAB_ACCESS_TOKEN = process.env.GITLAB_ACCESS_TOKEN\nconst GITLAB_DEFAULT_BRANCH = process.env.GITLAB_DEFAULT_BRANCH\nconst GITLAB_HOST = process.env.GITLAB_HOST\nconst GITLAB_PROJECT_ID = process.env.GITLAB_PROJECT_ID\n\n/**\n * GitHub\n */\nconst GITHUB_ACCESS_TOKEN = process.env.GITHUB_ACCESS_TOKEN\nconst GITHUB_REPO_OWNER = process.env.GITHUB_REPO_OWNER\nconst GITHUB_REPO_NAME = process.env.GITHUB_REPO_NAME\nconst GITHUB_DEFAULT_BRANCH = process.env.GITHUB_DEFAULT_BRANCH\n\nvoid yargs\n .scriptName('icons-cli')\n .command(\n 'figma:export',\n 'Load all icons from Figma and save to files',\n () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ format }) => {\n mustBeDefined(FIGMA_FILE_URL, 'FIGMA_FILE_URL')\n mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'gitlab:mr',\n 'Create a merge request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
|
package/dist/index.modern.js
CHANGED
|
@@ -82,12 +82,15 @@ class FigmaFileClient {
|
|
|
82
82
|
static async runFromCli(url, token, outputRootDir, exportFormat) {
|
|
83
83
|
const client = new this(url, token, exportFormat);
|
|
84
84
|
const root = process.cwd();
|
|
85
|
-
const outputDir = path.join(root, outputRootDir, exportFormat);
|
|
85
|
+
const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
|
|
86
|
+
|
|
86
87
|
console.log(`Exporting ${url} components`);
|
|
87
|
-
await client.loadSvg(outputDir);
|
|
88
|
+
await client.loadSvg(outputDir); // eslint-disable-next-line no-console
|
|
89
|
+
|
|
88
90
|
console.log(`Exporting components type`);
|
|
89
91
|
const typedefDir = path.join(root, outputRootDir, 'src');
|
|
90
|
-
await client.writeTypeDef(typedefDir);
|
|
92
|
+
await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
|
|
93
|
+
|
|
91
94
|
console.log('success!');
|
|
92
95
|
}
|
|
93
96
|
|
|
@@ -122,7 +125,8 @@ class FigmaFileClient {
|
|
|
122
125
|
const fullname = path.resolve(outputDir, 'filenames.ts');
|
|
123
126
|
const KNOWN_ICON_FILES = Object.values(this.components).map(({
|
|
124
127
|
name
|
|
125
|
-
}) => filenamify(name));
|
|
128
|
+
}) => filenamify(name)); // eslint-disable-next-line no-console
|
|
129
|
+
|
|
126
130
|
console.log(`writing to ${outputDir}`);
|
|
127
131
|
await ensureFile(fullname);
|
|
128
132
|
await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
|
|
@@ -159,6 +163,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
159
163
|
}
|
|
160
164
|
|
|
161
165
|
async loadImageUrls() {
|
|
166
|
+
// eslint-disable-next-line no-console
|
|
162
167
|
console.log('Getting export urls');
|
|
163
168
|
const {
|
|
164
169
|
data
|
|
@@ -190,13 +195,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
190
195
|
const filename = `${filenamify(component.name)}.${_this.exportFormat}`;
|
|
191
196
|
const fullname = path.join(outputDir, filename);
|
|
192
197
|
const dirname = path.dirname(fullname);
|
|
193
|
-
await ensureDir(dirname);
|
|
198
|
+
await ensureDir(dirname); // eslint-disable-next-line no-console
|
|
199
|
+
|
|
194
200
|
console.log(`found: ${filename} => ✅ writing...`);
|
|
195
201
|
await writeFile(fullname, response.body, 'utf8');
|
|
196
202
|
}));
|
|
197
203
|
}
|
|
198
204
|
|
|
199
205
|
async getFile() {
|
|
206
|
+
// eslint-disable-next-line no-console
|
|
200
207
|
console.log('Processing response');
|
|
201
208
|
const {
|
|
202
209
|
data
|
|
@@ -481,10 +488,12 @@ async function collectGitStatus() {
|
|
|
481
488
|
class GithubClient {
|
|
482
489
|
static async runFromCli(repoOwner, repoName, token, defaultBranch) {
|
|
483
490
|
const client = new this(repoOwner, repoName, token, defaultBranch);
|
|
484
|
-
const diff = await client.createTreeFromDiff();
|
|
491
|
+
const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
|
|
492
|
+
|
|
485
493
|
console.log(`${diff.length} files are changed`);
|
|
486
494
|
|
|
487
495
|
if (diff.length === 0) {
|
|
496
|
+
// eslint-disable-next-line no-console
|
|
488
497
|
console.log('no changes. aborting');
|
|
489
498
|
return;
|
|
490
499
|
}
|
|
@@ -633,10 +642,12 @@ class GithubClient {
|
|
|
633
642
|
class GitlabClient {
|
|
634
643
|
static async runFromCli(host, projectId, privateToken, defaultBranch) {
|
|
635
644
|
const client = new this(host, projectId, privateToken, defaultBranch);
|
|
636
|
-
const diff = await client.createActionsFromDiff();
|
|
645
|
+
const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
|
|
646
|
+
|
|
637
647
|
console.log(`${diff.length} files are changed`);
|
|
638
648
|
|
|
639
649
|
if (diff.length === 0) {
|
|
650
|
+
// eslint-disable-next-line no-console
|
|
640
651
|
console.log('no changes. aborting');
|
|
641
652
|
return;
|
|
642
653
|
}
|
|
@@ -816,7 +827,9 @@ function colorEquals(self, other) {
|
|
|
816
827
|
}
|
|
817
828
|
|
|
818
829
|
function addViewboxToRootSvg(svg) {
|
|
819
|
-
|
|
830
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
831
|
+
const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
832
|
+
|
|
820
833
|
const height = svg.getAttribute('height');
|
|
821
834
|
svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
|
|
822
835
|
}
|
|
@@ -854,6 +867,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
854
867
|
mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
|
|
855
868
|
mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
|
|
856
869
|
void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
|
|
870
|
+
// eslint-disable-next-line no-console
|
|
857
871
|
console.error(e);
|
|
858
872
|
process.exit(1);
|
|
859
873
|
});
|
|
@@ -871,6 +885,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
871
885
|
void readFile(file, {
|
|
872
886
|
encoding: 'utf-8'
|
|
873
887
|
}).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
|
|
888
|
+
// eslint-disable-next-line no-console
|
|
874
889
|
console.error(e);
|
|
875
890
|
process.exit(1);
|
|
876
891
|
});
|
|
@@ -878,12 +893,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
878
893
|
mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
|
|
879
894
|
mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
|
|
880
895
|
void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
896
|
+
// eslint-disable-next-line no-console
|
|
881
897
|
console.error(e);
|
|
882
898
|
process.exit(1);
|
|
883
899
|
});
|
|
884
900
|
}).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
|
|
885
901
|
mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
|
|
886
902
|
void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
903
|
+
// eslint-disable-next-line no-console
|
|
887
904
|
console.error(e);
|
|
888
905
|
process.exit(1);
|
|
889
906
|
});
|
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","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\nimport { mustBeDefined } from './utils'\n\n/**\n * Figma\n */\nconst FIGMA_TOKEN = process.env.FIGMA_TOKEN\nconst FIGMA_FILE_URL = process.env.FIGMA_FILE_URL\nconst OUTPUT_ROOT_DIR = process.env.OUTPUT_ROOT_DIR\n\n/**\n * GitLab\n */\nconst GITLAB_ACCESS_TOKEN = process.env.GITLAB_ACCESS_TOKEN\nconst GITLAB_DEFAULT_BRANCH = process.env.GITLAB_DEFAULT_BRANCH\nconst GITLAB_HOST = process.env.GITLAB_HOST\nconst GITLAB_PROJECT_ID = process.env.GITLAB_PROJECT_ID\n\n/**\n * GitHub\n */\nconst GITHUB_ACCESS_TOKEN = process.env.GITHUB_ACCESS_TOKEN\nconst GITHUB_REPO_OWNER = process.env.GITHUB_REPO_OWNER\nconst GITHUB_REPO_NAME = process.env.GITHUB_REPO_NAME\nconst GITHUB_DEFAULT_BRANCH = process.env.GITHUB_DEFAULT_BRANCH\n\nvoid yargs\n .scriptName('icons-cli')\n .command(\n 'figma:export',\n 'Load all icons from Figma and save to files',\n () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ format }) => {\n mustBeDefined(FIGMA_FILE_URL, 'FIGMA_FILE_URL')\n mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'gitlab:mr',\n 'Create a merge request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
|
package/dist/index.module.js
CHANGED
|
@@ -82,12 +82,15 @@ class FigmaFileClient {
|
|
|
82
82
|
static async runFromCli(url, token, outputRootDir, exportFormat) {
|
|
83
83
|
const client = new this(url, token, exportFormat);
|
|
84
84
|
const root = process.cwd();
|
|
85
|
-
const outputDir = path.join(root, outputRootDir, exportFormat);
|
|
85
|
+
const outputDir = path.join(root, outputRootDir, exportFormat); // eslint-disable-next-line no-console
|
|
86
|
+
|
|
86
87
|
console.log(`Exporting ${url} components`);
|
|
87
|
-
await client.loadSvg(outputDir);
|
|
88
|
+
await client.loadSvg(outputDir); // eslint-disable-next-line no-console
|
|
89
|
+
|
|
88
90
|
console.log(`Exporting components type`);
|
|
89
91
|
const typedefDir = path.join(root, outputRootDir, 'src');
|
|
90
|
-
await client.writeTypeDef(typedefDir);
|
|
92
|
+
await client.writeTypeDef(typedefDir); // eslint-disable-next-line no-console
|
|
93
|
+
|
|
91
94
|
console.log('success!');
|
|
92
95
|
}
|
|
93
96
|
|
|
@@ -122,7 +125,8 @@ class FigmaFileClient {
|
|
|
122
125
|
const fullname = path.resolve(outputDir, 'filenames.ts');
|
|
123
126
|
const KNOWN_ICON_FILES = Object.values(this.components).map(({
|
|
124
127
|
name
|
|
125
|
-
}) => filenamify(name));
|
|
128
|
+
}) => filenamify(name)); // eslint-disable-next-line no-console
|
|
129
|
+
|
|
126
130
|
console.log(`writing to ${outputDir}`);
|
|
127
131
|
await ensureFile(fullname);
|
|
128
132
|
await writeFile(fullname, `/** This file is auto generated. DO NOT EDIT BY HAND. */
|
|
@@ -159,6 +163,7 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
159
163
|
}
|
|
160
164
|
|
|
161
165
|
async loadImageUrls() {
|
|
166
|
+
// eslint-disable-next-line no-console
|
|
162
167
|
console.log('Getting export urls');
|
|
163
168
|
const {
|
|
164
169
|
data
|
|
@@ -188,13 +193,15 @@ export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
|
188
193
|
const filename = `${filenamify(component.name)}.${this.exportFormat}`;
|
|
189
194
|
const fullname = path.join(outputDir, filename);
|
|
190
195
|
const dirname = path.dirname(fullname);
|
|
191
|
-
await ensureDir(dirname);
|
|
196
|
+
await ensureDir(dirname); // eslint-disable-next-line no-console
|
|
197
|
+
|
|
192
198
|
console.log(`found: ${filename} => ✅ writing...`);
|
|
193
199
|
await writeFile(fullname, response.body, 'utf8');
|
|
194
200
|
}));
|
|
195
201
|
}
|
|
196
202
|
|
|
197
203
|
async getFile() {
|
|
204
|
+
// eslint-disable-next-line no-console
|
|
198
205
|
console.log('Processing response');
|
|
199
206
|
const {
|
|
200
207
|
data
|
|
@@ -479,10 +486,12 @@ async function collectGitStatus() {
|
|
|
479
486
|
class GithubClient {
|
|
480
487
|
static async runFromCli(repoOwner, repoName, token, defaultBranch) {
|
|
481
488
|
const client = new this(repoOwner, repoName, token, defaultBranch);
|
|
482
|
-
const diff = await client.createTreeFromDiff();
|
|
489
|
+
const diff = await client.createTreeFromDiff(); // eslint-disable-next-line no-console
|
|
490
|
+
|
|
483
491
|
console.log(`${diff.length} files are changed`);
|
|
484
492
|
|
|
485
493
|
if (diff.length === 0) {
|
|
494
|
+
// eslint-disable-next-line no-console
|
|
486
495
|
console.log('no changes. aborting');
|
|
487
496
|
return;
|
|
488
497
|
}
|
|
@@ -631,10 +640,12 @@ class GithubClient {
|
|
|
631
640
|
class GitlabClient {
|
|
632
641
|
static async runFromCli(host, projectId, privateToken, defaultBranch) {
|
|
633
642
|
const client = new this(host, projectId, privateToken, defaultBranch);
|
|
634
|
-
const diff = await client.createActionsFromDiff();
|
|
643
|
+
const diff = await client.createActionsFromDiff(); // eslint-disable-next-line no-console
|
|
644
|
+
|
|
635
645
|
console.log(`${diff.length} files are changed`);
|
|
636
646
|
|
|
637
647
|
if (diff.length === 0) {
|
|
648
|
+
// eslint-disable-next-line no-console
|
|
638
649
|
console.log('no changes. aborting');
|
|
639
650
|
return;
|
|
640
651
|
}
|
|
@@ -814,7 +825,9 @@ function colorEquals(self, other) {
|
|
|
814
825
|
}
|
|
815
826
|
|
|
816
827
|
function addViewboxToRootSvg(svg) {
|
|
817
|
-
|
|
828
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
829
|
+
const width = svg.getAttribute('width'); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
830
|
+
|
|
818
831
|
const height = svg.getAttribute('height');
|
|
819
832
|
svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
|
|
820
833
|
}
|
|
@@ -852,6 +865,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
852
865
|
mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN');
|
|
853
866
|
mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR');
|
|
854
867
|
void FigmaFileClient.runFromCli(FIGMA_FILE_URL, FIGMA_TOKEN, OUTPUT_ROOT_DIR, format).catch(e => {
|
|
868
|
+
// eslint-disable-next-line no-console
|
|
855
869
|
console.error(e);
|
|
856
870
|
process.exit(1);
|
|
857
871
|
});
|
|
@@ -869,6 +883,7 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
869
883
|
void readFile(file, {
|
|
870
884
|
encoding: 'utf-8'
|
|
871
885
|
}).then(content => optimizeSvg(content, color)).then(optimized => writeFile(file, optimized)).catch(e => {
|
|
886
|
+
// eslint-disable-next-line no-console
|
|
872
887
|
console.error(e);
|
|
873
888
|
process.exit(1);
|
|
874
889
|
});
|
|
@@ -876,12 +891,14 @@ void yargs.scriptName('icons-cli').command('figma:export', 'Load all icons from
|
|
|
876
891
|
mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID');
|
|
877
892
|
mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN');
|
|
878
893
|
void GitlabClient.runFromCli(GITLAB_HOST != null ? GITLAB_HOST : 'https://gitlab.com', Number(GITLAB_PROJECT_ID), GITLAB_ACCESS_TOKEN, GITLAB_DEFAULT_BRANCH != null ? GITLAB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
894
|
+
// eslint-disable-next-line no-console
|
|
879
895
|
console.error(e);
|
|
880
896
|
process.exit(1);
|
|
881
897
|
});
|
|
882
898
|
}).command('github:pr', 'Create a pull request in the name of icons-cli', {}, () => {
|
|
883
899
|
mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN');
|
|
884
900
|
void GithubClient.runFromCli(GITHUB_REPO_OWNER != null ? GITHUB_REPO_OWNER : 'pixiv', GITHUB_REPO_NAME != null ? GITHUB_REPO_NAME : 'charcoal', GITHUB_ACCESS_TOKEN, GITHUB_DEFAULT_BRANCH != null ? GITHUB_DEFAULT_BRANCH : 'main').catch(e => {
|
|
901
|
+
// eslint-disable-next-line no-console
|
|
885
902
|
console.error(e);
|
|
886
903
|
process.exit(1);
|
|
887
904
|
});
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/concurrently.ts","../src/FigmaFileClient.ts","../src/utils.ts","../src/getChangedFiles.ts","../src/GitHubClient.ts","../src/GitlabClient.ts","../src/optimizeSvg.ts","../src/index.ts"],"sourcesContent":["import PQueue from 'p-queue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function concurrently(tasks: (() => Promise<any>)[]) {\n const queue = new PQueue({ concurrency: 3 })\n for (const task of tasks) {\n void queue.add(task)\n }\n queue.start()\n return queue.onIdle()\n}\n","import path from 'path'\nimport camelCase from 'camelcase'\nimport Figma from 'figma-js'\nimport { ensureDir, ensureFile, remove, writeFile } from 'fs-extra'\nimport got from 'got'\nimport { match } from 'path-to-regexp'\nimport { concurrently } from './concurrently'\n\nconst extracter = match<{ file: string; name: string }>('/file/:file/:name')\n\nfunction extractFileId(url: string) {\n const result = extracter(new URL(url).pathname)\n if (result === false) {\n throw new Error('no :file in url')\n }\n\n return result.params.file\n}\n\nfunction extractNodeId(url: string) {\n if (!url.includes('?')) {\n return undefined\n }\n\n const [, query] = url.split('?')\n const params = new URLSearchParams(query)\n const nodeId = params.get('node-id')\n if (nodeId === null) {\n return undefined\n }\n\n return decodeURIComponent(nodeId)\n}\n\nfunction filenamify(name: string) {\n return camelCase(name, { pascalCase: true }).replace(' ', '')\n}\n\n// eslint-disable-next-line prefer-named-capture-group\nconst iconName = /^(\\d|Inline)+\\s*\\/\\s*/u\n\nfunction isIconNode(node: Figma.Node) {\n return iconName.test(node.name)\n}\n\ntype ExportFormat = 'svg' | 'pdf'\n\nfunction getContentType(exportFormat: ExportFormat) {\n switch (exportFormat) {\n case 'svg':\n return 'image/svg+xml'\n case 'pdf':\n return 'application/pdf'\n }\n}\n\ninterface Component {\n id: string\n name: string\n image?: string\n}\n\nexport class FigmaFileClient {\n private readonly fileId: string\n private readonly nodeId?: string\n private readonly exportFormat: ExportFormat\n private readonly client: Figma.ClientInterface\n\n private components: Record<string, Component> = {}\n private targets: Figma.Node[] = []\n\n static async runFromCli(\n url: string,\n token: string,\n outputRootDir: string,\n exportFormat: ExportFormat\n ) {\n const client = new this(url, token, exportFormat)\n\n const root = process.cwd()\n\n const outputDir = path.join(root, outputRootDir, exportFormat)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting ${url} components`)\n await client.loadSvg(outputDir)\n\n // eslint-disable-next-line no-console\n console.log(`Exporting components type`)\n const typedefDir = path.join(root, outputRootDir, 'src')\n await client.writeTypeDef(typedefDir)\n\n // eslint-disable-next-line no-console\n console.log('success!')\n }\n\n constructor(\n url: string,\n personalAccessToken: string,\n exportFormat: ExportFormat\n ) {\n this.client = Figma.Client({\n personalAccessToken,\n })\n\n this.fileId = extractFileId(url)\n this.nodeId = extractNodeId(url)\n this.exportFormat = exportFormat\n }\n\n async loadSvg(outputDir: string) {\n await remove(outputDir)\n await ensureDir(outputDir)\n\n await this.loadComponents()\n await this.loadImageUrls()\n await this.downloadImages(outputDir)\n }\n\n /**\n * Generate union of file names for typing\n */\n async writeTypeDef(outputDir: string) {\n const fullname = path.resolve(outputDir, 'filenames.ts')\n const KNOWN_ICON_FILES = Object.values(this.components).map(({ name }) =>\n filenamify(name)\n )\n\n // eslint-disable-next-line no-console\n console.log(`writing to ${outputDir}`)\n\n await ensureFile(fullname)\n await writeFile(\n fullname,\n `/** This file is auto generated. DO NOT EDIT BY HAND. */\n\n/* eslint-disable */\n\n// prettier-ignore\nexport const KNOWN_ICON_FILES = ${JSON.stringify(KNOWN_ICON_FILES)} as const;\n\nexport type KnownIconFile = typeof KNOWN_ICON_FILES[number];\n\n/* eslint-enable */\n`,\n { encoding: 'utf8' }\n )\n }\n\n private async loadComponents() {\n const { document } = await this.getFile()\n\n this.targets = document.children.filter((node) => {\n if (this.nodeId !== undefined) {\n return node.id === this.nodeId\n }\n\n return false\n })\n\n this.targets.forEach((child) => this.findComponentsRecursively(child))\n\n if (Object.values(this.targets).length === 0) {\n throw new Error('No components found!')\n }\n }\n\n private async loadImageUrls() {\n // eslint-disable-next-line no-console\n console.log('Getting export urls')\n\n const { data } = await this.client.fileImages(this.fileId, {\n format: this.exportFormat,\n ids: Object.keys(this.components),\n scale: 1,\n })\n\n for (const [id, image] of Object.entries(data.images)) {\n this.components[id].image = image\n }\n }\n\n private async downloadImages(outputDir: string) {\n return concurrently(\n Object.values(this.components).map((component) => async () => {\n if (component.image === undefined) {\n return\n }\n\n const response = await got.get(component.image, {\n headers: {\n 'Content-Type': getContentType(this.exportFormat),\n },\n encoding: 'utf8',\n })\n\n const filename = `${filenamify(component.name)}.${this.exportFormat}`\n const fullname = path.join(outputDir, filename)\n const dirname = path.dirname(fullname)\n\n await ensureDir(dirname)\n\n // eslint-disable-next-line no-console\n console.log(`found: ${filename} => ✅ writing...`)\n await writeFile(fullname, response.body, 'utf8')\n })\n )\n }\n\n private async getFile() {\n // eslint-disable-next-line no-console\n console.log('Processing response')\n\n const { data } = await this.client.file(this.fileId.toString())\n\n return data\n }\n\n private findComponentsRecursively(child: Figma.Node) {\n if (child.type === 'COMPONENT') {\n const { name, id } = child\n\n if (isIconNode(child)) {\n this.components[id] = {\n name,\n id,\n }\n }\n } else if ('children' in child) {\n child.children.forEach((grandChild) =>\n this.findComponentsRecursively(grandChild)\n )\n }\n }\n}\n","import { exec } from 'child_process'\n\n/**\n * FIXME: util.promisify を使うと node-libs-browser に入っている方が使われてしまい、壊れる\n */\nexport const execp = (command: string) =>\n new Promise<string>((resolve, reject) => {\n exec(command, (err, stdout) => {\n if (err) {\n return reject(err)\n }\n\n return resolve(stdout)\n })\n })\n\nexport function mustBeDefined<T>(\n value: T,\n name: string\n): asserts value is NonNullable<T> {\n if (typeof value === 'undefined') {\n throw new TypeError(`${name} must be defined.`)\n }\n}\n","import { promises as fs } from 'fs'\nimport path from 'path'\nimport { execp } from './utils'\n\nexport const targetDir = path.resolve(process.cwd(), 'packages', 'icons', 'svg')\n\n/**\n * dir 内で変更があったファイル情報を for await で回せるようにするやつ\n */\nexport async function* getChangedFiles(dir = targetDir) {\n const directories = await fs.readdir(dir)\n const gitStatus = await collectGitStatus()\n\n for (const dir of directories) {\n const directory = path.resolve(targetDir, dir)\n\n // eslint-disable-next-line no-await-in-loop\n const stat = await fs.stat(directory)\n if (!stat.isDirectory()) {\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const files = await fs.readdir(directory)\n\n for (const file of files) {\n const fullpath = path.resolve(targetDir, dir, file)\n const relativePath = path.relative(process.cwd(), fullpath)\n\n const status = gitStatus[relativePath]\n if (status == null) {\n // Already up-to-date\n continue\n }\n\n // eslint-disable-next-line no-await-in-loop\n const content = await fs.readFile(fullpath, { encoding: 'utf-8' })\n\n yield { relativePath, content, status }\n }\n }\n}\n\nasync function collectGitStatus() {\n return Object.fromEntries(\n /**\n * @see https://git-scm.com/docs/git-status#_porcelain_format_version_1\n */\n (await execp(`git status --porcelain`))\n .split('\\n')\n .map(\n (s) =>\n [\n s.slice(3),\n s.startsWith(' M')\n ? 'modified'\n : s.startsWith('??')\n ? 'untracked'\n : s.startsWith(' D')\n ? 'deleted'\n : null,\n ] as const\n )\n )\n}\n","import { Octokit } from '@octokit/rest'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype RefResponse = ReturnType<GithubClient['createBranch']> extends Promise<\n infer R\n>\n ? R\n : never\n\ninterface TreeItem {\n path?: string\n mode?: '100644' | '100755' | '040000' | '160000' | '120000'\n type?: 'blob' | 'commit' | 'tree'\n sha?: string | null\n content?: string\n}\n\nexport class GithubClient {\n private readonly api: Octokit\n private readonly now: Date\n\n static async runFromCli(\n repoOwner: string,\n repoName: string,\n token: string,\n defaultBranch: string\n ) {\n const client = new this(repoOwner, repoName, token, defaultBranch)\n\n const diff = await client.createTreeFromDiff()\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n const newBranch = await client.createBranch()\n\n await client.createCommit(diff, newBranch)\n return client.createPullRequest(newBranch)\n }\n\n constructor(\n private readonly repoOwner: string,\n private readonly repoName: string,\n token: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Octokit({\n auth: token,\n })\n\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or pull request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createTreeFromDiff(): Promise<TreeItem[]> {\n const tree: TreeItem[] = []\n\n for await (const file of getChangedFiles()) {\n const item = {\n path: file.relativePath,\n // 100 はファイル 644 は実行不可なファイルであるという意味\n // @see https://octokit.github.io/rest.js/v18#git-create-tree\n mode: '100644' as const,\n content: file.content,\n }\n\n if (file.status === 'deleted') {\n // https://stackoverflow.com/questions/23637961/how-do-i-mark-a-file-as-deleted-in-a-tree-using-the-github-api\n tree.push({\n ...item,\n sha: null,\n })\n } else {\n tree.push(item)\n }\n }\n\n return tree\n }\n\n async createCommit(tree: TreeItem[], targetBranch: RefResponse) {\n const parentCommit = await this.api.git.getCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n commit_sha: targetBranch.data.object.sha,\n })\n\n const newTree = await this.api.git.createTree({\n owner: this.repoOwner,\n repo: this.repoName,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n base_tree: parentCommit.data.tree.sha,\n tree,\n })\n\n // この時点ではどのブランチにも属さないコミットができる\n const commit = await this.api.git.createCommit({\n owner: this.repoOwner,\n repo: this.repoName,\n message: this.message,\n tree: newTree.data.sha,\n parents: [parentCommit.data.sha],\n })\n\n // ref を更新することで、commit が targetBranch に属するようになる\n await this.api.git.updateRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.branch}`,\n sha: commit.data.sha,\n })\n\n return commit\n }\n\n async createPullRequest(targetBranch: RefResponse) {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.pulls.create({\n owner: this.repoOwner,\n repo: this.repoName,\n head: targetBranch.data.ref,\n base: defaultBranch.data.ref,\n title: this.message,\n body: '',\n })\n }\n\n private getDefaultBranchRef() {\n return this.api.git.getRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `heads/${this.defaultBranch}`,\n })\n }\n\n async createBranch() {\n const defaultBranch = await this.getDefaultBranchRef()\n\n return this.api.git.createRef({\n owner: this.repoOwner,\n repo: this.repoName,\n ref: `refs/heads/${this.branch}`,\n sha: defaultBranch.data.object.sha,\n })\n }\n}\n","import type { CommitAction } from '@gitbeaker/core/dist/types/services/Commits'\nimport { Gitlab } from '@gitbeaker/node'\nimport { getChangedFiles } from './getChangedFiles'\n\ntype GitlabApi = InstanceType<typeof Gitlab>\n\nexport class GitlabClient {\n private readonly api: GitlabApi\n private readonly now: Date\n\n static async runFromCli(\n host: string,\n projectId: number,\n privateToken: string,\n defaultBranch: string\n ) {\n const client = new this(host, projectId, privateToken, defaultBranch)\n\n const diff = await client.createActionsFromDiff()\n // eslint-disable-next-line no-console\n console.log(`${diff.length} files are changed`)\n if (diff.length === 0) {\n // eslint-disable-next-line no-console\n console.log('no changes. aborting')\n return\n }\n\n await client.createCommit(diff)\n return client.createMergeRequest()\n }\n\n constructor(\n private readonly host: string,\n private readonly projectId: number,\n privateToken: string,\n private readonly defaultBranch: string,\n now = new Date()\n ) {\n this.api = new Gitlab({\n host: this.host,\n token: privateToken,\n })\n this.now = now\n }\n\n get branch() {\n return `icons/update/${this.now.getTime()}`\n }\n\n /**\n * both used for commit message or merge request title\n */\n get message() {\n return `[icons-cli] Update icons ${this.now.toDateString()}`\n }\n\n async createActionsFromDiff(): Promise<CommitAction[]> {\n const actions: CommitAction[] = []\n\n for await (const file of getChangedFiles()) {\n actions.push({\n action:\n file.status === 'untracked'\n ? 'create'\n : file.status === 'deleted'\n ? 'delete'\n : 'update',\n filePath: file.relativePath,\n content: file.content,\n })\n }\n\n return actions\n }\n\n async createCommit(diff: CommitAction[]) {\n return this.api.Commits.create(\n this.projectId,\n this.branch,\n this.message,\n diff,\n {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n start_branch: this.defaultBranch,\n }\n )\n }\n\n createMergeRequest() {\n return this.api.MergeRequests.create(\n this.projectId,\n this.branch,\n this.defaultBranch,\n this.message\n )\n }\n}\n","import { JSDOM } from 'jsdom'\nimport { parseToRgb } from 'polished'\nimport type { RgbColor, RgbaColor } from 'polished/lib/types/color'\nimport Svgo from 'svgo'\n\nexport const DEFAULT_CURRENT_COLOR_TARGET = '#858585'\n\nconst svgo = new Svgo({\n plugins: [\n // NOTICE: SVGO は「svg 内のすべての fill を currentColor に変える」機能しかない\n // icons-cli に必要なのは「特定の黒っぽい色だけ currentColor に変える」機能\n // なので、convertColors plugin は使わない\n // { convertColors: { currentColor: true } },\n { removeViewBox: true },\n { removeAttrs: { attrs: ['stroke-opacity', 'fill-opacity'] } },\n ],\n})\n\nexport async function optimizeSvg(input: string, convertedColor: string) {\n const { data } = await svgo.optimize(input)\n\n const { document } = new JSDOM(data).window\n const svg = document.querySelector('svg')\n if (!svg) {\n throw new Error('optimizeSvg: input string seems not to have <svg>')\n }\n\n addViewboxToRootSvg(svg)\n convertToCurrentColor(svg, convertedColor)\n\n return svg.outerHTML\n}\n\nconst TARGET_ATTRS = ['fill', 'stroke']\n\nfunction convertToCurrentColor(svg: SVGSVGElement, convertedColor: string) {\n const targetColor = parseColor(convertedColor)\n if (!targetColor) {\n throw new Error(`${convertedColor} is not a valid color`)\n }\n\n for (const attr of TARGET_ATTRS) {\n const targets = Array.from(svg.querySelectorAll<SVGElement>(`[${attr}]`))\n\n for (const el of targets) {\n const value = parseColor(el.getAttribute(attr))\n if (!value) {\n continue\n }\n\n if (!colorEquals(value, targetColor)) {\n continue\n }\n\n el.setAttribute(attr, 'currentColor')\n }\n }\n}\n\nfunction parseColor(value: string | null) {\n if (value == null) {\n return null\n }\n\n try {\n return parseToRgb(value)\n } catch {\n return null\n }\n}\n\nfunction colorEquals(self: RgbColor | RgbaColor, other: RgbColor | RgbaColor) {\n if (self.red !== other.red) {\n return false\n }\n\n if (self.blue !== other.blue) {\n return false\n }\n\n if (self.green !== other.green) {\n return false\n }\n\n if ('alpha' in self) {\n if ('alpha' in other) {\n if (self.alpha !== other.alpha) {\n return false\n }\n }\n }\n\n return true\n}\n\nfunction addViewboxToRootSvg(svg: SVGSVGElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const width = svg.getAttribute('width')!\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const height = svg.getAttribute('height')!\n\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n}\n","import { readFile, writeFile } from 'fs-extra'\nimport yargs from 'yargs'\nimport { FigmaFileClient } from './FigmaFileClient'\nimport { GithubClient } from './GitHubClient'\nimport { GitlabClient } from './GitlabClient'\nimport { DEFAULT_CURRENT_COLOR_TARGET, optimizeSvg } from './optimizeSvg'\nimport { mustBeDefined } from './utils'\n\n/**\n * Figma\n */\nconst FIGMA_TOKEN = process.env.FIGMA_TOKEN\nconst FIGMA_FILE_URL = process.env.FIGMA_FILE_URL\nconst OUTPUT_ROOT_DIR = process.env.OUTPUT_ROOT_DIR\n\n/**\n * GitLab\n */\nconst GITLAB_ACCESS_TOKEN = process.env.GITLAB_ACCESS_TOKEN\nconst GITLAB_DEFAULT_BRANCH = process.env.GITLAB_DEFAULT_BRANCH\nconst GITLAB_HOST = process.env.GITLAB_HOST\nconst GITLAB_PROJECT_ID = process.env.GITLAB_PROJECT_ID\n\n/**\n * GitHub\n */\nconst GITHUB_ACCESS_TOKEN = process.env.GITHUB_ACCESS_TOKEN\nconst GITHUB_REPO_OWNER = process.env.GITHUB_REPO_OWNER\nconst GITHUB_REPO_NAME = process.env.GITHUB_REPO_NAME\nconst GITHUB_DEFAULT_BRANCH = process.env.GITHUB_DEFAULT_BRANCH\n\nvoid yargs\n .scriptName('icons-cli')\n .command(\n 'figma:export',\n 'Load all icons from Figma and save to files',\n () => yargs.option('format', { default: 'svg', choices: ['svg', 'pdf'] }),\n ({ format }) => {\n mustBeDefined(FIGMA_FILE_URL, 'FIGMA_FILE_URL')\n mustBeDefined(FIGMA_TOKEN, 'FIGMA_TOKEN')\n mustBeDefined(OUTPUT_ROOT_DIR, 'OUTPUT_ROOT_DIR')\n\n void FigmaFileClient.runFromCli(\n FIGMA_FILE_URL,\n FIGMA_TOKEN,\n OUTPUT_ROOT_DIR,\n format as 'svg' | 'pdf'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'svg:optimize',\n 'Optimize given .svg files and overwrite it',\n () =>\n yargs\n .option('file', { demandOption: true, type: 'string' })\n .option('color', {\n default: DEFAULT_CURRENT_COLOR_TARGET,\n type: 'string',\n defaultDescription:\n 'Color code that should be converted into `currentColor`',\n }),\n ({ file, color }) => {\n void readFile(file, { encoding: 'utf-8' })\n .then((content) => optimizeSvg(content, color))\n .then((optimized) => writeFile(file, optimized))\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'gitlab:mr',\n 'Create a merge request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITLAB_PROJECT_ID, 'GITLAB_PROJECT_ID')\n mustBeDefined(GITLAB_ACCESS_TOKEN, 'GITLAB_ACCESS_TOKEN')\n\n void GitlabClient.runFromCli(\n GITLAB_HOST ?? 'https://gitlab.com',\n Number(GITLAB_PROJECT_ID),\n GITLAB_ACCESS_TOKEN,\n GITLAB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .command(\n 'github:pr',\n 'Create a pull request in the name of icons-cli',\n {},\n () => {\n mustBeDefined(GITHUB_ACCESS_TOKEN, 'GITHUB_ACCESS_TOKEN')\n\n void GithubClient.runFromCli(\n GITHUB_REPO_OWNER ?? 'pixiv',\n GITHUB_REPO_NAME ?? 'charcoal',\n GITHUB_ACCESS_TOKEN,\n GITHUB_DEFAULT_BRANCH ?? 'main'\n ).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e)\n process.exit(1)\n })\n }\n )\n .demandCommand()\n .help()\n .parse()\n"],"names":["concurrently","tasks","queue","PQueue","concurrency","task","add","start","onIdle","extracter","match","extractFileId","url","result","URL","pathname","Error","params","file","extractNodeId","includes","undefined","query","split","URLSearchParams","nodeId","get","decodeURIComponent","filenamify","name","camelCase","pascalCase","replace","iconName","isIconNode","node","test","getContentType","exportFormat","FigmaFileClient","runFromCli","token","outputRootDir","client","root","process","cwd","outputDir","path","join","console","log","loadSvg","typedefDir","writeTypeDef","constructor","personalAccessToken","fileId","components","targets","Figma","Client","remove","ensureDir","loadComponents","loadImageUrls","downloadImages","fullname","resolve","KNOWN_ICON_FILES","Object","values","map","ensureFile","writeFile","JSON","stringify","encoding","document","getFile","children","filter","id","forEach","child","findComponentsRecursively","length","data","fileImages","format","ids","keys","scale","image","entries","images","component","response","got","headers","filename","dirname","body","toString","type","grandChild","execp","command","Promise","reject","exec","err","stdout","mustBeDefined","value","TypeError","targetDir","getChangedFiles","dir","directories","fs","readdir","gitStatus","collectGitStatus","directory","stat","isDirectory","files","fullpath","relativePath","relative","status","content","readFile","fromEntries","s","slice","startsWith","GithubClient","repoOwner","repoName","defaultBranch","diff","createTreeFromDiff","newBranch","createBranch","createCommit","createPullRequest","now","Date","api","Octokit","auth","branch","getTime","message","toDateString","tree","item","mode","push","sha","targetBranch","parentCommit","git","getCommit","owner","repo","commit_sha","object","newTree","createTree","base_tree","commit","parents","updateRef","ref","getDefaultBranchRef","pulls","create","head","base","title","getRef","createRef","GitlabClient","host","projectId","privateToken","createActionsFromDiff","createMergeRequest","Gitlab","actions","action","filePath","Commits","start_branch","MergeRequests","DEFAULT_CURRENT_COLOR_TARGET","svgo","Svgo","plugins","removeViewBox","removeAttrs","attrs","optimizeSvg","input","convertedColor","optimize","JSDOM","window","svg","querySelector","addViewboxToRootSvg","convertToCurrentColor","outerHTML","TARGET_ATTRS","targetColor","parseColor","attr","Array","from","querySelectorAll","el","getAttribute","colorEquals","setAttribute","parseToRgb","self","other","red","blue","green","alpha","width","height","FIGMA_TOKEN","env","FIGMA_FILE_URL","OUTPUT_ROOT_DIR","GITLAB_ACCESS_TOKEN","GITLAB_DEFAULT_BRANCH","GITLAB_HOST","GITLAB_PROJECT_ID","GITHUB_ACCESS_TOKEN","GITHUB_REPO_OWNER","GITHUB_REPO_NAME","GITHUB_DEFAULT_BRANCH","yargs","scriptName","option","default","choices","catch","e","error","exit","demandOption","defaultDescription","color","then","optimized","Number","demandCommand","help","parse"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@charcoal-ui/icons-cli",
|
|
3
|
-
"version": "1.0.0",
|
|
3
|
+
"version": "1.0.1-alpha.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"source": "./src/index.ts",
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "09667dc786134bbfb4348b686ec4fdf571d327d2"
|
|
54
54
|
}
|
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
|
@@ -46,6 +46,7 @@ void yargs
|
|
|
46
46
|
OUTPUT_ROOT_DIR,
|
|
47
47
|
format as 'svg' | 'pdf'
|
|
48
48
|
).catch((e) => {
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
49
50
|
console.error(e)
|
|
50
51
|
process.exit(1)
|
|
51
52
|
})
|
|
@@ -68,6 +69,7 @@ void yargs
|
|
|
68
69
|
.then((content) => optimizeSvg(content, color))
|
|
69
70
|
.then((optimized) => writeFile(file, optimized))
|
|
70
71
|
.catch((e) => {
|
|
72
|
+
// eslint-disable-next-line no-console
|
|
71
73
|
console.error(e)
|
|
72
74
|
process.exit(1)
|
|
73
75
|
})
|
|
@@ -87,6 +89,7 @@ void yargs
|
|
|
87
89
|
GITLAB_ACCESS_TOKEN,
|
|
88
90
|
GITLAB_DEFAULT_BRANCH ?? 'main'
|
|
89
91
|
).catch((e) => {
|
|
92
|
+
// eslint-disable-next-line no-console
|
|
90
93
|
console.error(e)
|
|
91
94
|
process.exit(1)
|
|
92
95
|
})
|
|
@@ -105,6 +108,7 @@ void yargs
|
|
|
105
108
|
GITHUB_ACCESS_TOKEN,
|
|
106
109
|
GITHUB_DEFAULT_BRANCH ?? 'main'
|
|
107
110
|
).catch((e) => {
|
|
111
|
+
// eslint-disable-next-line no-console
|
|
108
112
|
console.error(e)
|
|
109
113
|
process.exit(1)
|
|
110
114
|
})
|
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}`)
|