From b2299ecee5ca9a5bdbd1133dad62030fc0e20149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vasconcellos?= Date: Wed, 30 Aug 2023 00:44:02 -0300 Subject: [PATCH] [ENG-1029] Fix `pnpm assets gen` not working with Prettier 3.0 (#1272) Fix assets generation breaking due to prettier update to 3.0 - Make assets generation async - Update prettier and babel deps --- apps/desktop/package.json | 2 +- apps/mobile/package.json | 2 +- interface/package.json | 2 +- package.json | 4 +- packages/assets/icons/index.ts | 2 + packages/assets/scripts/generate.mjs | 101 ++++++++++++++------------- packages/ui/package.json | 2 +- pnpm-lock.yaml | Bin 948540 -> 897110 bytes 8 files changed, 60 insertions(+), 55 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index a37424c97..bb56cb90c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -30,7 +30,7 @@ "@iarna/toml": "^2.2.5", "@sd/config": "workspace:*", "@tauri-apps/cli": "1.3.1", - "@types/babel-core": "^6.25.7", + "@types/babel__core": "^7.20.1", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", "@vitejs/plugin-react": "^2.1.0", diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 189b1d6ff..b58c57c36 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -61,7 +61,7 @@ "zod": "~3.22.2" }, "devDependencies": { - "@babel/core": "^7.22.1", + "@babel/core": "^7.22.11", "@rnx-kit/metro-config": "^1.3.8", "@sd/config": "workspace:*", "@types/react": "~18.0.38", diff --git a/interface/package.json b/interface/package.json index 42f158f3c..5dbb7ad93 100644 --- a/interface/package.json +++ b/interface/package.json @@ -77,7 +77,7 @@ }, "devDependencies": { "@sd/config": "workspace:*", - "@types/babel-core": "^6.25.7", + "@types/babel__core": "^7.20.1", "@types/loadable__component": "^5.13.4", "@types/node": "^18.11.9", "@types/react": "^18.0.21", diff --git a/package.json b/package.json index 74a4f33bb..a3d25209a 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "@storybook/react-vite": "^7.0.20", "@trivago/prettier-plugin-sort-imports": "^4.2.0", "cspell": "^6.31.1", - "prettier": "^3.0.1", - "prettier-plugin-tailwindcss": "^0.4.1", + "prettier": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.3", "rimraf": "^4.4.1", "turbo": "^1.10.2", "turbo-ignore": "^0.3.0", diff --git a/packages/assets/icons/index.ts b/packages/assets/icons/index.ts index 49216e21e..cd55b1d32 100644 --- a/packages/assets/icons/index.ts +++ b/packages/assets/icons/index.ts @@ -36,6 +36,7 @@ import Entity from './Entity.png'; import Entity_Light from './Entity_Light.png'; import Executable from './Executable.png'; import Executable_Light from './Executable_Light.png'; +import Executable_Light_old from './Executable_Light_old.png'; import Executable_old from './Executable_old.png'; import Face_Light from './Face_Light.png'; import Folder from './Folder.png'; @@ -129,6 +130,7 @@ export { Entity_Light, Executable, Executable_Light, + Executable_Light_old, Executable_old, Face_Light, Folder, diff --git a/packages/assets/scripts/generate.mjs b/packages/assets/scripts/generate.mjs index fcbb00df6..e6b8be71e 100644 --- a/packages/assets/scripts/generate.mjs +++ b/packages/assets/scripts/generate.mjs @@ -8,62 +8,65 @@ * * The generated index files will have the name `index.ts` and will be located in the root of each asset folder. */ -import fs from 'fs'; -import { dirname, join } from 'path'; +import fs from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; import prettier from 'prettier'; -import { fileURLToPath } from 'url'; const assetFolders = ['icons', 'images', 'svgs/brands', 'svgs/ext/Extras', 'svgs/ext/Code']; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -assetFolders.forEach((folder) => { - const indexFilePath = join(__dirname, '..', folder, 'index.ts'); - const assetsFolderPath = join(__dirname, '..', folder); +prettier.resolveConfig(join(__dirname, '..', '..', '..', '.prettierrc.js')).then((options) => + Promise.all( + assetFolders.map(async (folder) => { + const indexFilePath = join(__dirname, '..', folder, 'index.ts'); + const assetsFolderPath = join(__dirname, '..', folder); - // Delete the index file if it already exists. - if (fs.existsSync(indexFilePath)) { - fs.unlinkSync(indexFilePath); - } - - const fileNames = fs.readdirSync(assetsFolderPath); - - // Generate the import statements for each asset. - const assetImports = fileNames - .filter((fileName) => fileName !== 'index.ts' && !/(^|\/)\.[^\/\.]/g.test(fileName)) - .map((fileName) => { - const variableName = fileName.split('.')[0].replace(/-/g, ''); - if (folder.startsWith('svgs')) { - return `import { ReactComponent as ${variableName} } from './${fileName}';`; + if (await fs.access(indexFilePath).then(() => true, () => false)) { + // Delete the index file if it already exists. + await fs.unlink(indexFilePath); } - return `import ${variableName} from './${fileName}';`; + + const fileNames = await fs.readdir(assetsFolderPath); + + // Generate the import statements for each asset. + const assetImports = fileNames + .filter((fileName) => fileName !== 'index.ts' && !/(^|\/)\.[^\/\.]/g.test(fileName)) + .map((fileName) => { + const variableName = fileName.split('.')[0].replace(/-/g, ''); + if (folder.startsWith('svgs')) { + return `import { ReactComponent as ${variableName} } from './${fileName}';`; + } + return `import ${variableName} from './${fileName}';`; + }) + .join('\n'); + + // Generate the export statements for each asset. + const assetExports = fileNames + .filter((fileName) => fileName !== 'index.ts' && !/(^|\/)\.[^\/\.]/g.test(fileName)) + .map((fileName) => `${fileName.split('.')[0].replace(/-/g, '')}`) + .join(',\n'); + + // Generate the index file content. + const indexFileContent = await prettier.format( + ` + /* + * This file was automatically generated by a script. + * To regenerate this file, run: pnpm assets gen + */ + + ${assetImports} + + export { + ${assetExports} + };`, + { ...options, parser: 'typescript' } + ); + + // Write the index file. + await fs.writeFile(indexFilePath, indexFileContent); }) - .join('\n'); - - // Generate the export statements for each asset. - const assetExports = fileNames - .filter((fileName) => fileName !== 'index.ts' && !/(^|\/)\.[^\/\.]/g.test(fileName)) - .map((fileName) => { - const variableName = fileName.split('.')[0].replace(/-/g, ''); - return `${variableName},`; - }) - .join('\n'); - - // Generate the index file content. - const indexFileContent = ` - /* - * This file was automatically generated by a script. - * To regenerate this file, run: pnpm assets gen - */ - -${assetImports}\n\nexport {\n ${assetExports}\n};\n`; - - // Write the index file. - prettier.resolveConfig(join(__dirname, '..', '..', '..', '.prettierrc.js')).then((options) => { - fs.writeFileSync( - indexFilePath, - prettier.format(indexFileContent, { ...options, parser: 'typescript' }) - ); - }); -}); + ) +); diff --git a/packages/ui/package.json b/packages/ui/package.json index fa38032b8..20248dfbc 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -49,7 +49,7 @@ "zod": "~3.22.2" }, "devDependencies": { - "@babel/core": "^7.19.3", + "@babel/core": "^7.22.11", "@sd/config": "workspace:*", "@storybook/types": "^7.0.24", "@tailwindcss/typography": "^0.5.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5c00d531b27a67dbb55f637164b770d368ae987..5140e7ba5bbb0ea24c3693085bb57d9eddba2659 100644 GIT binary patch delta 7686 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 Am;e9( delta 12231 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