leds-spark-lib
Version:
Biblioteca de geração de código
208 lines (185 loc) • 5.4 kB
JavaScript
import fs from "fs";
import { expandToString } from "../../../../../util/template-string.js";
import path from "path";
import { generateAttributesAsParameters, generateAttributesValue, generateValuesEqualsAttributes, generateAttributesAsHeader } from "./generateAttributes.js";
export function generate(project_abstraction, cls, target_folder) {
fs.writeFileSync(path.join(target_folder, "Criar.vue"), generateCriar(project_abstraction, cls));
fs.writeFileSync(path.join(target_folder, "Listar.vue"), generateListar(project_abstraction, cls));
}
function generateCriar(project_abstraction, cls) {
return expandToString `
<script setup lang="ts">
import { ref, computed, onBeforeMount } from 'vue'
import { useRoute } from 'vue-router'
import {
criar${cls.getName()},
obter${cls.getName()},
atualizar${cls.getName()}
} from '../controllers/${cls.getName().toLowerCase()}'
import { useUiStore } from '@/stores/ui'
import type { ValidationResultFunction } from '@/utils/regras'
const route = useRoute()
const modo = computed<'criar' | 'editar'>(() => {
if (route.params.id) {
return 'editar'
}
return 'criar'
})
const ui = useUiStore()
const id = ref('')
${generateRefs(cls)}
const primeiraMaiuscula: ValidationResultFunction = (novoNome: string) => {
if (/^[A-Z].*$/.test(novoNome)) {
return true
}
return 'O nome deve começar com uma letra maiúscula'
}
const regrasNome = [primeiraMaiuscula]
const nomeValido = ref(false)
const updateNomeValido = (novoValor: boolean) => {
nomeValido.value = novoValor
}
const descricao = ref('')
const criar = async () => {
if (!nomeValido.value) {
ui.exibirAlerta({
text: 'Por favor, corrija os campos incorretos.',
color: 'error'
})
return false
}
const sucesso = await criar${cls.getName()}({
${generateAttributesAsParameters(cls)}
})
if (sucesso) {
${generateAttributesValue(cls)}
}
return true
}
const atualizar = async () => {
if (!nomeValido.value) {
ui.exibirAlerta({
text: 'Por favor, corrija os campos incorretos.',
color: 'error'
})
return false
}
const sucesso = await atualizar${cls.getName()}({
Id: id.value,
${generateAttributesAsParameters(cls)}
})
return true
}
const dispatchBotao = async () => {
if (modo.value === 'criar') {
return await criar()
}
return await atualizar()
}
onBeforeMount(async () => {
if (modo.value === 'editar') {
const routeId: string = Array.isArray(route.params.id) ? route.params.id[0] : route.params.id
const cls = await obter${cls.getName()}(routeId)
id.value = cls.Id
${generateValuesEqualsAttributes(cls)}
}
})
</script>
<template>
<card class="w-md">
${generateTextInputs(cls)}
<div class="flex justify-end">
<p-button
@click="dispatchBotao"
>
{{ modo === 'criar' ? 'Registrar' : 'Atualizar' }}
</p-button>
</div>
</card>
</template>
`;
}
function generateListar(project_abstraction, cls) {
return expandToString `
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import { useRouter } from 'vue-router'
import { useUiStore } from '@/stores/ui'
import {
listar${cls.getName()},
excluir${cls.getName()}s,
} from '../controllers/${cls.getName().toLowerCase()}'
import type { ${cls.getName()} } from '../types/${cls.getName().toLowerCase()}'
const ui = useUiStore()
const headers = [
${generateAttributesAsHeader(cls)}
]
const items = ref<${cls.getName()}[]>([])
const carregar${cls.getName()}s = async () => {
const ${cls.getName().toLowerCase()} = await listar${cls.getName()}()
items.value = ${cls.getName().toLowerCase()}
}
const router = useRouter()
const editar${cls.getName()} = (cls: ${cls.getName()}) => {
router.push({ name: '${cls.getName().toLowerCase()}-criar', params: { id: cls.Id }})
}
const excluir${cls.getName().toLowerCase()} = async (cls: ${cls.getName()}[]) => {
const ids = cls.map((a) => a.Id)
await excluir${cls.getName()}s(ids)
await carregar${cls.getName()}s()
}
onBeforeMount(carregar${cls.getName()}s)
</script>
<template>
<data-table
:headers="headers"
:items="items"
@editar="editar${cls.getName()}"
@excluir="excluir${cls.getName().toLowerCase()}"
/>
</template>
`;
}
// Gera as reactive variables para cada atributo da classe
function generateRefs(cls) {
let str = "";
for (const attr of cls.getAttributes()) {
str = str.concat(`const ${attr.getName()} = ref('')\n`);
}
return str;
}
// Gera text inputs para cada atributo da classe
function generateTextInputs(cls) {
let str = "";
for (const attr of cls.getAttributes()) {
if (attr.getName().toLowerCase() === "nome") {
str = str.concat(expandToString `
<text-input
class="w-full"
placeholder="Nome"
v-model="nome"
:rules="regrasNome"
@validationUpdate="updateNomeValido"
/>
`);
str = str.concat("\n");
}
else {
str = str.concat(expandToString `
<text-input
class="w-full"
placeholder="${capitalizeFirstLetter(attr.getName())}"
v-model="${attr.getName()}"
/>
`);
str = str.concat("\n");
}
}
return str;
}
function capitalizeFirstLetter(str) {
if (!str)
return str; // Retorna como está se a string for vazia
return str.charAt(0).toUpperCase() + str.slice(1);
}
//# sourceMappingURL=generate.js.map