diff --git a/src/blocks/VueGenerator.ts b/src/blocks/VueGenerator.ts new file mode 100644 index 0000000..723a193 --- /dev/null +++ b/src/blocks/VueGenerator.ts @@ -0,0 +1,49 @@ +import {javascriptGenerator, JavascriptGenerator} from "blockly/javascript"; +import {Names, Variables, Workspace} from "blockly"; +import NameType = Names.NameType; + +class VueGenerator extends JavascriptGenerator { + init(workspace: Workspace) { + super.init(workspace); + + if (!this.nameDB_) { + this.nameDB_ = new Names(this.RESERVED_WORDS_); + } else { + this.nameDB_.reset(); + } + + this.nameDB_.setVariableMap(workspace.getVariableMap()); + this.nameDB_.populateVariables(workspace); + this.nameDB_.populateProcedures(workspace); + + const defvars = []; + // Add developer variables (not created or named by the user). + const devVarList = Variables.allDeveloperVariables(workspace); + for (let i = 0; i < devVarList.length; i++) { + defvars.push( + this.nameDB_.getName(devVarList[i], NameType.DEVELOPER_VARIABLE), + ); + } + + // Add user variables, but only ones that are being used. + const variables = Variables.allUsedVarModels(workspace); + for (let i = 0; i < variables.length; i++) { + defvars.push( + this.nameDB_.getName(variables[i].getId(), NameType.VARIABLE), + ); + } + + // Declare all of the variables. + if (defvars.length) { + this.definitions_['variables'] = `let state = reactive({${defvars.map(v => `${v}: null`).join(',')}})`; + } + this.isInitialized = true; + } +} + +export const vueGenerator = new VueGenerator('vue'); + + +for (const name in javascriptGenerator.forBlock) { + vueGenerator.forBlock[name] = javascriptGenerator.forBlock[name]; +} \ No newline at end of file diff --git a/src/blocks/codegen.ts b/src/blocks/codegen.ts index d297462..fb30d1b 100644 --- a/src/blocks/codegen.ts +++ b/src/blocks/codegen.ts @@ -2,11 +2,14 @@ import {javascriptGenerator} from "blockly/javascript"; import {BaseDirectory, mkdir, writeTextFile} from '@tauri-apps/plugin-fs'; import {dirname, join} from "@tauri-apps/api/path"; import Blockly from "blockly"; +import "./jigsaw.ts"; +import {vueGenerator} from "./VueGenerator.ts"; const JIGSAW_PROJECTS_DIR = './JigsawProjects' export async function generateAppCode(projectName: string, workspace: Blockly.Workspace) { - const code = javascriptGenerator.workspaceToCode(workspace); + // const code = javascriptGenerator.workspaceToCode(workspace); + const code = vueGenerator.workspaceToCode(workspace); const projectPath = await join(JIGSAW_PROJECTS_DIR, projectName); @@ -21,6 +24,7 @@ async function writeProjectFiles(projectName: string, projectPath: string, code: // language=Vue 'src/App.vue': `