From 0e3fe555a0912b3917f4fcc18d287ff2676edf64 Mon Sep 17 00:00:00 2001 From: Miguel Franken Date: Tue, 23 Apr 2024 10:19:49 +0200 Subject: [PATCH 01/30] chore: update IDE config --- .idea/misc.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.idea/misc.xml b/.idea/misc.xml index 03f397c..8c4f656 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,8 @@ + + From 8b301f737ebdb24334072465237e61c0360e95f0 Mon Sep 17 00:00:00 2001 From: Miguel Franken Date: Tue, 23 Apr 2024 10:20:02 +0200 Subject: [PATCH 02/30] feat: retrieve all instances from selected node --- packages/code/src/generate.ts | 5 ++++- packages/code/src/utils.ts | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/code/src/generate.ts b/packages/code/src/generate.ts index 9cd4c3f..1a298ce 100644 --- a/packages/code/src/generate.ts +++ b/packages/code/src/generate.ts @@ -1,6 +1,6 @@ import FigmaNodeParser from './parsers/figma-node.parser' import HTMLGenerator from './generators/html.generator' -import { getSelectedNodes } from './utils' +import { getInstanceNodes, getSelectedNodes } from './utils' import ComponentSetProcessor from './set/component-set-processor' import { sendExecutionTimeMessage, @@ -24,6 +24,9 @@ export default async function generate(config: Configuration): Promise Date: Tue, 23 Apr 2024 10:23:29 +0200 Subject: [PATCH 03/30] chore: rename html event to generated component event --- packages/code/src/generate.ts | 4 ++-- packages/code/src/messages.ts | 6 +++--- packages/types/src/events.ts | 6 +++--- packages/ui/src/stores/useCode.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/code/src/generate.ts b/packages/code/src/generate.ts index 1a298ce..603aa95 100644 --- a/packages/code/src/generate.ts +++ b/packages/code/src/generate.ts @@ -4,7 +4,7 @@ import { getInstanceNodes, getSelectedNodes } from './utils' import ComponentSetProcessor from './set/component-set-processor' import { sendExecutionTimeMessage, - sendHtmlMessage, + sendGeneratedComponentsMessage, sendIsLoadingMessage, sendSelectedMessage, sendUnselectedMessage, @@ -91,7 +91,7 @@ export default async function generate(config: Configuration): Promise +export type GeneratedComponentsPluginMessage = BasePluginMessage<'generated-components', GeneratedComponentsPluginMessageData> -interface HtmlPluginMessageData { +interface GeneratedComponentsPluginMessageData { html: string } @@ -110,7 +110,7 @@ interface SelectedPluginMessageData { export type PluginMessage = | RendererPluginMessage - | HtmlPluginMessage + | GeneratedComponentsPluginMessage | UnselectedPluginMessage | ExecutionTimePluginMessage | IsLoadingPluginMessage diff --git a/packages/ui/src/stores/useCode.ts b/packages/ui/src/stores/useCode.ts index d6d3c45..4b1aaca 100644 --- a/packages/ui/src/stores/useCode.ts +++ b/packages/ui/src/stores/useCode.ts @@ -18,7 +18,7 @@ export const useCode = defineStore('code', () => { const { onPluginMessage } = usePluginMessage() - onPluginMessage('html', ({ html }) => { + onPluginMessage('generated-components', ({ html }) => { code.value = html }) From 892c985fcc630adbc82f65aed20b5a3f45a95c86 Mon Sep 17 00:00:00 2001 From: Miguel Franken Date: Tue, 23 Apr 2024 10:31:23 +0200 Subject: [PATCH 04/30] feat: add ability to send multiple components via the event bus --- packages/code/src/generate.ts | 11 +++++++---- packages/code/src/messages.ts | 8 +++++--- packages/types/src/events.ts | 8 ++++++-- packages/ui/src/stores/useCode.ts | 5 +++-- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/code/src/generate.ts b/packages/code/src/generate.ts index 603aa95..2128147 100644 --- a/packages/code/src/generate.ts +++ b/packages/code/src/generate.ts @@ -90,10 +90,13 @@ export default async function generate(config: Configuration): Promise -interface GeneratedComponentsPluginMessageData { - html: string +type ComponentName = string +type GeneratedComponent = string + +export interface GeneratedComponentsPluginMessageData { + mainComponent: string + components: Record } export type ConfigurationPluginMessage = BasePluginMessage<'configuration', ConfigurationPluginMessageData> diff --git a/packages/ui/src/stores/useCode.ts b/packages/ui/src/stores/useCode.ts index 4b1aaca..a279cec 100644 --- a/packages/ui/src/stores/useCode.ts +++ b/packages/ui/src/stores/useCode.ts @@ -18,8 +18,9 @@ export const useCode = defineStore('code', () => { const { onPluginMessage } = usePluginMessage() - onPluginMessage('generated-components', ({ html }) => { - code.value = html + onPluginMessage('generated-components', ({ mainComponent, components }) => { + console.log('Received generated components', mainComponent, components) + code.value = components[mainComponent] }) onPluginMessage('unselected', () => { From 9ffdc2240503a322116139323f3d4203bb9b4e1d Mon Sep 17 00:00:00 2001 From: Miguel Franken Date: Tue, 23 Apr 2024 11:00:17 +0200 Subject: [PATCH 05/30] feat: generate code for instance node in selected node sub-tree --- packages/code/src/generate.ts | 34 +++++++++++++++++++++++++++---- packages/ui/src/stores/useCode.ts | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/code/src/generate.ts b/packages/code/src/generate.ts index 2128147..1d216f4 100644 --- a/packages/code/src/generate.ts +++ b/packages/code/src/generate.ts @@ -24,9 +24,6 @@ export default async function generate(config: Configuration): Promise getInstanceNodes(selectedNode)) + .filter(instanceNode => !config.ignoredComponentInstances.includes(instanceNode.name)) + .map(async instanceNode => await instanceNode.getMainComponentAsync()) + .filter(c => c !== null) as Promise[], + ) + console.log('Found instanceNodes', instanceNodes) + + const generatedInstances: Record = {} + + instanceNodes.map(async (instanceNode) => { + console.log('Processing instanceNode', instanceNode.name) + + const parser = new FigmaNodeParser({ default: 'default' }, config) + const tree = await parser.parse(instanceNode) + + if (tree) { + const generator = new HTMLGenerator([], {}, config) + generatedInstances[instanceNode.name] = await generator.generate(tree) + + console.log('Generated HTML for instanceNode', instanceNode.name, generatedInstances[instanceNode.name]) + } + else { + console.error('It was not possible to generate HTML code for the selected node.') + figma.notify('Error during HTML generation') + } + }) + // only send message if html is not empty if (html) { sendGeneratedComponentsMessage({ mainComponent: 'main', - components: { main: html }, + components: { main: html, ...generatedInstances }, }) } else { sendUnselectedMessage() } diff --git a/packages/ui/src/stores/useCode.ts b/packages/ui/src/stores/useCode.ts index a279cec..a82a417 100644 --- a/packages/ui/src/stores/useCode.ts +++ b/packages/ui/src/stores/useCode.ts @@ -19,7 +19,7 @@ export const useCode = defineStore('code', () => { const { onPluginMessage } = usePluginMessage() onPluginMessage('generated-components', ({ mainComponent, components }) => { - console.log('Received generated components', mainComponent, components) + console.log('Received generated components', { mainComponent, components }) code.value = components[mainComponent] }) From 15fe2628d775be1636a9dd2d5628f63408849d1d Mon Sep 17 00:00:00 2001 From: Miguel Franken Date: Tue, 23 Apr 2024 11:46:23 +0200 Subject: [PATCH 06/30] feat: emit generated components to UI code component --- packages/ui/src/components/code.vue | 4 +++- packages/ui/src/stores/useCode.ts | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/code.vue b/packages/ui/src/components/code.vue index 6408c45..7c57006 100644 --- a/packages/ui/src/components/code.vue +++ b/packages/ui/src/components/code.vue @@ -7,7 +7,7 @@ import { useNotification } from '@/composables/useNotification' import { useCode } from '@/stores/useCode' import Wrapper from '@/components/layout/wrapper.vue' -const { code, isLoading, executionTime } = storeToRefs(useCode()) +const { code, isLoading, executionTime, components } = storeToRefs(useCode()) const { theme } = useTheme() @@ -30,6 +30,8 @@ function onCopy() {