From e3b7eb7bf45e3dd237da47a9dfa783cb9e1174e8 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Thu, 25 Nov 2021 21:45:51 +0200 Subject: [PATCH] feat(build): Add build icons.js. --- packages/build/src/build/buildIcons.js | 54 +++++++++++++++++++ .../writePluginImports/writeBlockImports.js | 2 +- .../writeConnectionImports.js | 2 +- .../writePluginImports/writeIconImports.js | 40 ++++++++++++++ packages/build/src/index.js | 5 +- 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 packages/build/src/build/buildIcons.js create mode 100644 packages/build/src/build/writePluginImports/writeIconImports.js diff --git a/packages/build/src/build/buildIcons.js b/packages/build/src/build/buildIcons.js new file mode 100644 index 000000000..5ac9b919c --- /dev/null +++ b/packages/build/src/build/buildIcons.js @@ -0,0 +1,54 @@ +/* + Copyright 2020-2021 Lowdefy, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +const iconPackages = { + 'react-icons/ai': /"(Ai[A-Z0-9]\w*)"/gm, + 'react-icons/bs': /"(Bs[A-Z0-9]\w*)"/gm, + 'react-icons/bi': /"(Bi[A-Z0-9]\w*)"/gm, + 'react-icons/di': /"(Di[A-Z0-9]\w*)"/gm, + 'react-icons/fi': /"(Fi[A-Z0-9]\w*)"/gm, + 'react-icons/fc': /"(Fc[A-Z0-9]\w*)"/gm, + 'react-icons/fa': /"(Fa[A-Z0-9]\w*)"/gm, + 'react-icons/gi': /"(Gi[A-Z0-9]\w*)"/gm, + 'react-icons/go': /"(Go[A-Z0-9]\w*)"/gm, + 'react-icons/gr': /"(Gr[A-Z0-9]\w*)"/gm, + 'react-icons/hi': /"(Hi[A-Z0-9]\w*)"/gm, + 'react-icons/im': /"(Im[A-Z0-9]\w*)"/gm, + 'react-icons/io': /"(IoIos[A-Z0-9]\w*)"/gm, + 'react-icons/io5': /"(Io[A-Z0-9]\w*)"/gm, + 'react-icons/md': /"(Md[A-Z0-9]\w*)"/gm, + 'react-icons/ri': /"(Ri[A-Z0-9]\w*)"/gm, + 'react-icons/si': /"(Si[A-Z0-9]\w*)"/gm, + 'react-icons/ti': /"(Ti[A-Z0-9]\w*)"/gm, + 'react-icons/vsc': /"(Vsc[A-Z0-9]\w*)"/gm, + 'react-icons/wi': /"(Wi[A-Z0-9]\w*)"/gm, + 'react-icons/cg': /"(Cg[A-Z0-9]\w*)"/gm, +}; + +function buildIcons({ components }) { + components.icons = []; + Object.entries(iconPackages).forEach(([iconPackage, regex]) => { + const icons = new Set(); + [...JSON.stringify(components.global || {}).matchAll(regex)].map((match) => + icons.add(match[1]) + ); + [...JSON.stringify(components.menus || []).matchAll(regex)].map((match) => icons.add(match[1])); + [...JSON.stringify(components.pages || []).matchAll(regex)].map((match) => icons.add(match[1])); + components.icons.push({ icons: [...icons], package: iconPackage }); + }); +} + +export default buildIcons; diff --git a/packages/build/src/build/writePluginImports/writeBlockImports.js b/packages/build/src/build/writePluginImports/writeBlockImports.js index 7c76d16df..603c513fd 100644 --- a/packages/build/src/build/writePluginImports/writeBlockImports.js +++ b/packages/build/src/build/writePluginImports/writeBlockImports.js @@ -20,7 +20,7 @@ const template = `{%- for block in blocks -%} import { {{ block.type }} } from '{{ block.package }}/blocks'; {% endfor -%} export default { - {%- for block in blocks -%} + {% for block in blocks -%} {{ block.type }}, {% endfor -%} }; diff --git a/packages/build/src/build/writePluginImports/writeConnectionImports.js b/packages/build/src/build/writePluginImports/writeConnectionImports.js index cb2d1866f..7f3061e92 100644 --- a/packages/build/src/build/writePluginImports/writeConnectionImports.js +++ b/packages/build/src/build/writePluginImports/writeConnectionImports.js @@ -20,7 +20,7 @@ const template = `{%- for connection in connections -%} import { {{ connection.type }} } from '{{ connection.package }}/connections'; {% endfor -%} export default { - {%- for connection in connections -%} + {% for connection in connections -%} {{ connection.type }}, {% endfor -%} }; diff --git a/packages/build/src/build/writePluginImports/writeIconImports.js b/packages/build/src/build/writePluginImports/writeIconImports.js new file mode 100644 index 000000000..cd1834055 --- /dev/null +++ b/packages/build/src/build/writePluginImports/writeIconImports.js @@ -0,0 +1,40 @@ +/* + Copyright 2020-2021 Lowdefy, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import { nunjucksFunction } from '@lowdefy/nunjucks'; + +const template = `{%- for package in packages -%} +{%- for icon in package.icons -%} +import { {{ icon }} } from '{{ package.package }}'; +{% endfor -%} +{% endfor -%} +export default { + {% for package in packages -%} + {%- for icon in package.icons -%} + {{ icon }}, + {% endfor -%}{%- endfor -%} +}; +`; + +async function writeIconImports({ components, context }) { + const templateFn = nunjucksFunction(template); + await context.writeBuildArtifact({ + filePath: 'plugins/icons.js', + content: templateFn({ packages: components.icons }), + }); +} + +export default writeIconImports; diff --git a/packages/build/src/index.js b/packages/build/src/index.js index b1700b89f..ae261034c 100644 --- a/packages/build/src/index.js +++ b/packages/build/src/index.js @@ -25,6 +25,7 @@ import createWriteBuildArtifact from './utils/files/writeBuildArtifact.js'; import addDefaultPages from './build/addDefaultPages/addDefaultPages.js'; import buildAuth from './build/buildAuth/buildAuth.js'; import buildConnections from './build/buildConnections.js'; +import buildIcons from './build/buildIcons.js'; import buildMenu from './build/buildMenu.js'; import buildPages from './build/buildPages/buildPages.js'; import buildRefs from './build/buildRefs/buildRefs.js'; @@ -40,6 +41,7 @@ import writeConfig from './build/writeConfig.js'; import writeConnectionImports from './build/writePluginImports/writeConnectionImports.js'; import writeConnections from './build/writeConnections.js'; import writeGlobal from './build/writeGlobal.js'; +import writeIconImports from './build/writePluginImports/writeIconImports.js'; import writeMenus from './build/writeMenus.js'; import writePages from './build/writePages.js'; import writeRequests from './build/writeRequests.js'; @@ -91,6 +93,7 @@ async function build(options) { await buildAuth({ components, context }); await buildConnections({ components, context }); await buildPages({ components, context }); + await buildIcons({ components }); await buildMenu({ components, context }); await buildTypes({ components, context }); await buildStyles({ components, context }); @@ -106,7 +109,7 @@ async function build(options) { await writeBlockImports({ components, context }); await writeConnectionImports({ components, context }); await writeStyleImports({ components, context }); - // TODO: write icons file + await writeIconImports({ components, context }); // TODO: add plugins to package.json } catch (error) { context.logger.error(error);