vtseditor
Version:
288 lines (240 loc) • 13.3 kB
text/typescript
// vite.config.ts
import { defineConfig, Plugin } from 'vite';
import express from 'express';
import fs from 'fs';
import path from 'path';
import {SchemaErrors} from 'vts';
import {SchemaConfig} from './Config/Config.js';
import {JsonData, SchemaJsonData} from './SchemaEditor/JsonData.js';
import {SchemaExternLoader} from './SchemaExtern/SchemaExternLoader.js';
import {SchemaGenerator} from './SchemaGenerator/SchemaGenerator.js';
import {SchemaProject} from './SchemaProject/SchemaProject.js';
import {SchemaProjectSave} from './SchemaProject/SchemaProjectSave.js';
import {ProjectsData, ProjectsResponse} from './SchemaProject/SchemaProjectsResponse.js';
import {SchemaScript} from './SchemaScript/SchemaScript.js';
/**
* Express middleware
*/
function expressMiddleware(): Plugin {
return {
name: 'vite-express-middleware',
configureServer(server) {
const app = express();
app.use(express.json());
// config load ---------------------------------------------------------------------------------------------
const configFile = process.env.VTSEDITOR_CONFIG_FILE;
const projectRoot = process.env.VTSEDITOR_PROJECT_ROOT ?? process.cwd();
const projects: Map<string, SchemaProject> = new Map<string, SchemaProject>();
if (configFile) {
const config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
const errors: SchemaErrors = [];
if (SchemaConfig.validate(config, errors)) {
for (const aSchemaProject of config.projects) {
const project: SchemaProject = {
name: 'Schema project',
schemaPath: path.resolve('schemas', 'schema.json'),
schemaPrefix: 'Schema',
createTypes: false,
createIndex: false,
autoGenerate: false,
destinationPath: path.resolve('schemas', 'src'),
destinationClear: false,
codeComment: false,
codeIndent: ' ',
scripts_before_generate: [],
scripts_after_generate: []
};
project.name = aSchemaProject.name ?? project.name;
project.schemaPath = path.resolve(projectRoot, aSchemaProject.schemaPath);
project.autoGenerate = aSchemaProject.autoGenerate ?? project.autoGenerate;
if (aSchemaProject.destinationPath) {
project.destinationPath = path.resolve(projectRoot, aSchemaProject.destinationPath);
}
if (aSchemaProject.destinationClear) {
project.destinationClear = aSchemaProject.destinationClear ?? project.destinationClear;
}
if (aSchemaProject.code) {
const pcode = aSchemaProject.code;
project.schemaPrefix = pcode.schemaPrefix ?? project.schemaPrefix;
project.createTypes = pcode.createTypes ?? project.createTypes;
project.createIndex = pcode.createIndex ?? project.createIndex;
project.codeComment = pcode.codeComment ?? project.codeComment;
project.codeIndent = pcode.codeIndent ?? project.codeIndent;
}
if (aSchemaProject.scripts) {
if (aSchemaProject.scripts.before_generate) {
for (const script of aSchemaProject.scripts.before_generate) {
project.scripts_before_generate.push({
script: script.script,
path: script.path
});
}
}
if (aSchemaProject.scripts.after_generate) {
for (const script of aSchemaProject.scripts.after_generate) {
project.scripts_after_generate.push({
script: script.script,
path: script.path
});
}
}
}
console.log(`VTS Project: ${project.name}`);
console.log(`\tSchema-Path: ${project.schemaPath}`);
console.log(`\tSchema-Prefix: ${project.schemaPrefix}`);
console.log(`\tCreate Types: ${project.createTypes ? 'true' : 'false'}`);
console.log(`\tCreate Index: ${project.createIndex ? 'true' : 'false'}`);
console.log(`\tAuto Generate files by save: ${project.autoGenerate ? 'true' : 'false'}`);
console.log(`\tDestination-Path: ${project.destinationPath}`);
console.log(`\tDestination-Clear: ${project.destinationClear ? 'true' : 'false'}`);
console.log(`\tCode comments: ${project.createIndex ? 'true' : 'false'}`);
console.log(' ');
console.log(' ');
projects.set(crypto.randomUUID(), project);
}
} else {
console.log('Your config file has an incorrect structure, please check the!');
console.log(errors);
return;
}
}
const loader = new SchemaExternLoader(projectRoot);
loader.scan().then();
// ---------------------------------------------------------------------------------------------------------
app.post('/api/save-schema', (req, res) => {
const bodyData = req.body;
if (SchemaProjectSave.validate(bodyData, [])) {
const projectsData = bodyData.data;
for (const project of projectsData.projects) {
const projectOption = projects.get(project.unid);
if (projectOption) {
const schema: JsonData = {
fs: project.fs,
editor: projectsData.editor ?? {
controls_width: 300
}
};
fs.mkdirSync(path.dirname(projectOption.schemaPath), { recursive: true });
fs.writeFileSync(projectOption.schemaPath, JSON.stringify(schema, null, 2), 'utf-8');
if (projectOption.autoGenerate) {
const gen = new SchemaGenerator({
schemaPrefix: projectOption.schemaPrefix,
createTypes: projectOption.createTypes,
createIndex: projectOption.createIndex,
destinationPath: projectOption.destinationPath,
destinationClear: projectOption.destinationClear,
code_indent: projectOption.codeIndent,
code_comment: projectOption.codeComment
});
try {
const externFiles = loader.getList();
for (const [, externSource] of externFiles.entries()) {
try {
if (fs.existsSync(externSource.schemaFile)) {
const content = fs.readFileSync(externSource.schemaFile, 'utf-8');
const schemaData = JSON.parse(content);
if (SchemaJsonData.validate(schemaData, [])) {
gen.setExternSource(externSource, schemaData.fs);
}
}
} catch (e) {
console.log('Error: ');
console.log(e);
}
}
SchemaScript.run(projectOption.scripts_before_generate).then();
gen.generate(schema.fs);
SchemaScript.run(projectOption.scripts_after_generate).then();
} catch (e) {
console.log(e);
}
}
}
}
} else {
console.log('Body is not validate!');
}
res.status(200).json({ success: true });
});
// ---------------------------------------------------------------------------------------------------------
app.get('/api/load-schema', (_req, res) => {
const projectsData: ProjectsData = {
projects: [],
extern: [],
editor: {
// default
controls_width: 300
}
};
// load projects schemas -------------------------------------------------------------------------------
for (const [punid, project] of projects.entries()) {
try {
if (fs.existsSync(project.schemaPath)) {
const content = fs.readFileSync(project.schemaPath, 'utf-8');
const schemaData = JSON.parse(content);
if (SchemaJsonData.validate(schemaData, [])) {
projectsData.projects.push({
unid: punid,
name: project.name,
fs: schemaData.fs
});
if (projectsData.editor === null) {
projectsData.editor = schemaData.editor;
}
}
} else {
projectsData.projects.push({
unid: punid,
name: project.name,
fs: {
unid: 'root',
name: 'root',
istoggle: true,
icon: 'root',
type: 'root',
entrys: [],
schemas: [],
enums: []
}
});
}
} catch (e) {
console.log('Error: ');
console.log(e);
}
}
// extern schemas --------------------------------------------------------------------------------------
const externFiles = loader.getList();
for (const [eunid, externSource] of externFiles.entries()) {
try {
if (fs.existsSync(externSource.schemaFile)) {
const content = fs.readFileSync(externSource.schemaFile, 'utf-8');
const schemaData = JSON.parse(content);
if (SchemaJsonData.validate(schemaData, [])) {
projectsData.extern.push({
unid: eunid,
name: externSource.name,
fs: schemaData.fs
});
}
}
} catch (e) {
console.log('Error: ');
console.log(e);
}
}
// -----------------------------------------------------------------------------------------------------
const response: ProjectsResponse = {
data: projectsData
};
res.status(200).json(response);
});
server.middlewares.use(app);
}
};
}
export default defineConfig({
plugins: [
expressMiddleware()
]
});