diff --git a/.changeset/odd-yaks-wash.md b/.changeset/odd-yaks-wash.md new file mode 100644 index 0000000..f2dd092 --- /dev/null +++ b/.changeset/odd-yaks-wash.md @@ -0,0 +1,10 @@ +--- +"@icona/generator": minor +"@icona/types": minor +"@icona/utils": minor +--- + +feat: add generate mode option + +- `overwrite` (default): overwrite existing files in folder +- `recreate`: rm -rf all files and generate new files in folder diff --git a/README.md b/README.md index b364f90..8719c9e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Shorten the process between designers (Figma) and developers (GitHub). - **Designer**: Build icon set in Figma and click deploy button, that's it. - **Developer**: Check the PR and use the icon svg set in your project. (Make react component, Make Pdf, Make XML, ...etc) +## Boilerplate + +- [junghyeonsu/test-icona](https://github.com/junghyeonsu/test-icona) + ## Preview ![preview](./images/preview.png) diff --git a/packages/generator/src/core/drawable.ts b/packages/generator/src/core/drawable.ts index 1475bfe..f5626d0 100644 --- a/packages/generator/src/core/drawable.ts +++ b/packages/generator/src/core/drawable.ts @@ -1,5 +1,6 @@ import type { GenerateDrawableConfig, IconaIconData } from "@icona/types"; import { + deleteAllFilesInDir, getIconaIconsFile, getProjectRootPath, makeFolderIfNotExistFromRoot, @@ -30,6 +31,10 @@ export const generateDrawable = ({ throw new Error("There is no icons data"); } + if (config.genMode === "recreate") { + deleteAllFilesInDir(resolve(projectPath, path)); + } + // TODO: Name transform option Object.entries(icons).forEach(async ([name, data]) => { const { svg } = data; diff --git a/packages/generator/src/core/pdf.ts b/packages/generator/src/core/pdf.ts index 4769072..b94254b 100644 --- a/packages/generator/src/core/pdf.ts +++ b/packages/generator/src/core/pdf.ts @@ -1,5 +1,6 @@ import type { GeneratePDFConfig, IconaIconData } from "@icona/types"; import { + deleteAllFilesInDir, getIconaIconsFile, getProjectRootPath, makeFolderIfNotExistFromRoot, @@ -31,6 +32,10 @@ export const generatePDF = ({ throw new Error("There is no icons data"); } + if (config.genMode === "recreate") { + deleteAllFilesInDir(resolve(projectPath, path)); + } + // TODO: Name transform option Object.entries(icons).forEach(async ([name, data]) => { const { svg } = data; diff --git a/packages/generator/src/core/png.ts b/packages/generator/src/core/png.ts index c11b22c..a1b9b13 100644 --- a/packages/generator/src/core/png.ts +++ b/packages/generator/src/core/png.ts @@ -1,5 +1,6 @@ import type { GeneratePNGConfig, IconaIconData } from "@icona/types"; import { + deleteAllFilesInDir, getIconaIconsFile, getProjectRootPath, makeFolderIfNotExistFromRoot, @@ -27,6 +28,10 @@ export const generatePNG = ({ throw new Error("There is no icons data"); } + if (config.genMode === "recreate") { + deleteAllFilesInDir(resolve(projectPath, path)); + } + // TODO: Name transform option Object.entries(icons).forEach(([name, data]) => { const { png } = data; diff --git a/packages/generator/src/core/react.ts b/packages/generator/src/core/react.ts index 0782ad5..2972b31 100644 --- a/packages/generator/src/core/react.ts +++ b/packages/generator/src/core/react.ts @@ -1,5 +1,6 @@ import type { GenerateReactConfig, IconaIconData } from "@icona/types"; import { + deleteAllFilesInDir, getIconaIconsFile, getProjectRootPath, makeFolderIfNotExistFromRoot, @@ -30,6 +31,10 @@ export const generateReact = ({ throw new Error("There is no icons data"); } + if (config.genMode === "recreate") { + deleteAllFilesInDir(resolve(projectPath, path)); + } + // TODO: Name transform option Object.entries(icons).forEach(async ([name, data]) => { const { svg } = data; diff --git a/packages/generator/src/core/svg.ts b/packages/generator/src/core/svg.ts index 35d3309..96f266f 100644 --- a/packages/generator/src/core/svg.ts +++ b/packages/generator/src/core/svg.ts @@ -1,5 +1,6 @@ import type { GenerateSVGConfig, IconaIconData } from "@icona/types"; import { + deleteAllFilesInDir, getIconaIconsFile, getProjectRootPath, makeFolderIfNotExistFromRoot, @@ -29,6 +30,10 @@ export const generateSVG = ({ throw new Error("There is no icons data"); } + if (config.genMode === "recreate") { + deleteAllFilesInDir(resolve(projectPath, path)); + } + // TODO: Name transform option Object.entries(icons).forEach(([name, data]) => { const { svg } = data; diff --git a/packages/types/package.json b/packages/types/package.json index b480f7f..9b47682 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -6,9 +6,8 @@ "url": "git+https://github.com/daangn/icona.git", "directory": "packages/types" }, - "main": "./dist/index.d.ts", + "main": "./src/index.d.ts", "files": [ - "dist", "src" ], "scripts": { diff --git a/packages/types/src/data.ts b/packages/types/src/data.d.ts similarity index 100% rename from packages/types/src/data.ts rename to packages/types/src/data.d.ts diff --git a/packages/types/src/index.ts b/packages/types/src/index.d.ts similarity index 100% rename from packages/types/src/index.ts rename to packages/types/src/index.d.ts diff --git a/packages/types/src/lib.ts b/packages/types/src/lib.d.ts similarity index 87% rename from packages/types/src/lib.ts rename to packages/types/src/lib.d.ts index e41bac4..1958c38 100644 --- a/packages/types/src/lib.ts +++ b/packages/types/src/lib.d.ts @@ -30,7 +30,18 @@ export interface SvgToPdfOptions extends SVGtoPDFOptions { x?: number; y?: number; } +/** + * @param overwrite overwrite existing files in folder + * @param recreate rm -rf all files and generate new files in folder + */ +export type GenerateMode = "recreate" | "overwrite"; + export interface GeneratePDFConfig { + /** + * @default overwrite + */ + genMode?: GenerateMode; + /** * generate drawable pdf files * @default false @@ -60,6 +71,11 @@ export interface GeneratePDFConfig { } export interface GenerateReactConfig { + /** + * @default overwrite + */ + genMode?: GenerateMode; + /** * generate drawable react files * @default false @@ -80,6 +96,11 @@ export interface GenerateReactConfig { } export interface GenerateSVGConfig { + /** + * @default overwrite + */ + genMode?: GenerateMode; + /** * generate drawable svg files * @default true @@ -108,6 +129,11 @@ interface Svg2vectordrawableOptions { } export interface GenerateDrawableConfig { + /** + * @default overwrite + */ + genMode?: GenerateMode; + /** * generate drawable xml files * @default false @@ -135,6 +161,11 @@ export interface GenerateDrawableConfig { } export interface GeneratePNGConfig { + /** + * @default overwrite + */ + genMode?: GenerateMode; + /** * generate drawable xml files * @default false diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index 4b309db..8107e1d 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -1,12 +1,5 @@ { - "extends": "../../tsconfig.json", "compilerOptions": { - "isolatedModules": true, - "esModuleInterop": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "emitDeclarationOnly": true }, - "include": ["./src"], + "include": ["./src/**/*"], } diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 99e3261..efd7e97 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,8 +1,15 @@ // TODO: Need test code for this file. import type { IconaIconData } from "@icona/types"; import findup from "findup-sync"; -import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; -import { dirname, resolve } from "path"; +import { + existsSync, + mkdirSync, + readdirSync, + readFileSync, + unlinkSync, + writeFileSync, +} from "fs"; +import path, { dirname, resolve } from "path"; export const ICONA_FOLDER = ".icona"; export const ICONA_ICONS_FILE = "icons.json"; @@ -70,3 +77,13 @@ export const generateConfigFile = (config: string) => { writeFileSync(configPath, config); }; + +export const deleteAllFilesInDir = (dirPath: string) => { + try { + readdirSync(dirPath).forEach((file) => { + unlinkSync(path.join(dirPath, file)); + }); + } catch (error) { + console.log(error); + } +};