Track HiveGrid Cloud planning reference

This commit is contained in:
david committed 2026-06-26 20:48:01 +02:00
1 parent b3d5ea6764
commit e341c5938a
5784 files changed
+1104929 -3

No files matched your search

@@ -0,0 +1,271 @@
import { EntityWithDetails } from "~/utils/db/entities/entities.db.server";
import { t as i18nT } from "i18next";
import CodeTemplateForm from "../templates/components/CodeTemplate.Form";
import CodeTemplateDto from "../templates/dtos/CodeTemplate.Dto";
import CodeTemplateDtoCreate from "../templates/dtos/CodeTemplate.Dto.Create";
import CodeTemplateHelper from "../templates/helpers/CodeTemplate.Helper";
import CodeTemplateRoutesActivityApi from "../templates/routes/api/CodeTemplate.Routes.Activity.Api";
import CodeTemplateRoutesEditApi from "../templates/routes/api/CodeTemplate.Routes.Edit.Api";
import CodeTemplateRoutesIndexApi from "../templates/routes/api/CodeTemplate.Routes.Index.Api";
import CodeTemplateRoutesNewApi from "../templates/routes/api/CodeTemplate.Routes.New.Api";
import CodeTemplateRoutesShareApi from "../templates/routes/api/CodeTemplate.Routes.Share.Api";
import CodeTemplateRoutesTagsApi from "../templates/routes/api/CodeTemplate.Routes.Tags.Api";
import CodeTemplateRoutesActivityComponent from "../templates/routes/components/CodeTemplate.Routes.Activity.Component";
import CodeTemplateRoutesEditComponent from "../templates/routes/components/CodeTemplate.Routes.Edit.Component";
import CodeTemplateRoutesIndexComponent from "../templates/routes/components/CodeTemplate.Routes.Index.Component";
import CodeTemplateRoutesNewComponent from "../templates/routes/components/CodeTemplate.Routes.New.Component";
import CodeTemplateRoutesShareComponent from "../templates/routes/components/CodeTemplate.Routes.Share.Component";
import CodeTemplateRoutesTagsComponent from "../templates/routes/components/CodeTemplate.Routes.Tags.Component";
import CodeTemplateRoutesActivityView from "../templates/routes/views/CodeTemplate.Routes.Activity.View";
import CodeTemplateRoutesEditView from "../templates/routes/views/CodeTemplate.Routes.Edit.View";
import CodeTemplateRoutesIndexView from "../templates/routes/views/CodeTemplate.Routes.Index.View";
import CodeTemplateRoutesNewView from "../templates/routes/views/CodeTemplate.Routes.New.View";
import CodeTemplateRoutesShareView from "../templates/routes/views/CodeTemplate.Routes.Share.View";
import CodeTemplateRoutesTagsView from "../templates/routes/views/CodeTemplate.Routes.Tags.View";
import CodeTemplateModelSchemaPrisma from "../templates/schemas/CodeTemplate.Model.Schema.Prisma";
import CodeTemplateService from "../templates/services/CodeTemplate.Service";
import CodeGeneratorHelper from "../utils/CodeGeneratorHelper";
import Constants from "~/application/Constants";
export type CodeGeneratorOptions = {
entity: EntityWithDetails;
type: string;
moduleDirectory: string;
routesDirectory: string;
deleteFilesOnFinish: boolean;
};
export type CodeGeneratorFileDto = {
type: "module" | "route" | "model";
directory?: string;
file: string;
content: string;
description: string;
};
function getModuleFiles(options: CodeGeneratorOptions): CodeGeneratorFileDto[] {
const { entity } = options;
const { capitalized } = CodeGeneratorHelper.getNames(entity);
const files: CodeGeneratorFileDto[] = [
{
type: "module",
directory: `dtos`,
file: `${capitalized}Dto.ts`,
content: CodeTemplateDto.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.dto.rowInterface"),
},
{
type: "module",
directory: `dtos`,
file: `${capitalized}CreateDto.ts`,
content: CodeTemplateDtoCreate.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.dto.createInput"),
},
{
type: "module",
directory: `components`,
file: `${capitalized}Form.tsx`,
content: CodeTemplateForm.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.components.form"),
},
{
type: "module",
directory: `helpers`,
file: `${capitalized}Helpers.ts`,
content: CodeTemplateHelper.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.helpers.formDataTransformers"),
},
{
type: "module",
directory: `services`,
file: `${capitalized}Service.ts`,
content: CodeTemplateService.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.services.crud"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.Index.Api.ts`,
content: CodeTemplateRoutesIndexApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.index"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.New.Api.ts`,
content: CodeTemplateRoutesNewApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.new"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.Edit.Api.ts`,
content: CodeTemplateRoutesEditApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.edit"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.Activity.Api.ts`,
content: CodeTemplateRoutesActivityApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.activity"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.Share.Api.ts`,
content: CodeTemplateRoutesShareApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.share"),
},
{
type: "module",
directory: `routes/api`,
file: `${capitalized}Routes.Tags.Api.ts`,
content: CodeTemplateRoutesTagsApi.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.api.tags"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.Index.View.tsx`,
content: CodeTemplateRoutesIndexView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.index"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.New.View.tsx`,
content: CodeTemplateRoutesNewView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.new"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.Edit.View.tsx`,
content: CodeTemplateRoutesEditView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.edit"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.Activity.View.tsx`,
content: CodeTemplateRoutesActivityView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.activity"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.Share.View.tsx`,
content: CodeTemplateRoutesShareView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.share"),
},
{
type: "module",
directory: `routes/views`,
file: `${capitalized}Routes.Tags.View.tsx`,
content: CodeTemplateRoutesTagsView.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.views.tags"),
},
];
if (options.type === "custom") {
files.unshift({
type: "model",
file: `schema.prisma`,
content: CodeTemplateModelSchemaPrisma.generate({ entity }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.schema.prisma"),
});
}
addTopComments(files, entity);
return files;
}
function getRouteFiles({ type, entity, moduleDirectory }: CodeGeneratorOptions) {
let moduleLocation = moduleDirectory.replace("./app", "");
if (moduleLocation.startsWith("/")) {
moduleLocation = moduleLocation.substring(1);
}
const files: CodeGeneratorFileDto[] = [
{
type: "route",
file: `index.tsx`,
content: CodeTemplateRoutesIndexComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.index"),
},
{
type: "route",
file: `new.tsx`,
content: CodeTemplateRoutesNewComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.new"),
},
{
type: "route",
file: `$id.tsx`,
content: CodeTemplateRoutesEditComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.edit"),
},
{
type: "route",
file: `activity.tsx`,
directory: "$id",
content: CodeTemplateRoutesActivityComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.activity"),
},
{
type: "route",
file: `share.tsx`,
directory: "$id",
content: CodeTemplateRoutesShareComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.share"),
},
{
type: "route",
file: `tags.tsx`,
directory: "$id",
content: CodeTemplateRoutesTagsComponent.generate({ entity, moduleLocation }),
description: i18nT("models.entity.codeGenerator.fileDescriptions.routeShells.tags"),
},
];
addTopComments(files, entity);
return files;
}
function addTopComments(files: CodeGeneratorFileDto[], entity: EntityWithDetails) {
const rawLabelWarnings = CodeGeneratorHelper.getRawLabelWarnings(entity);
files.forEach((file) => {
const comments: string[] = [];
comments.push(file.description);
comments.push(...rawLabelWarnings);
comments.push("Date: " + new Date().toISOString().slice(0, 10));
comments.push("Version: App v" + Constants.VERSION);
file.content = comments.map((comment) => `// ${comment}`).join("\n") + "\n\n" + file.content;
});
}
function moduleDirectoryOptions(entity: EntityWithDetails) {
let tests = `./apps/web/app/modules/codeGeneratorTests/` + entity.slug;
let app = `./apps/web/app/modules/` + entity.slug;
return [
{ name: tests, value: tests },
{ name: app, value: app },
];
}
function routeDirectoryOptions(entity: EntityWithDetails) {
let tests = `./apps/web/app/routes/admin/entities/code-generator/tests/` + entity.slug;
let app = `./apps/web/app/routes/app.$tenant/` + entity.slug;
return [
{ name: tests, value: tests },
{ name: app, value: app },
];
}
export default {
getModuleFiles,
getRouteFiles,
moduleDirectoryOptions,
routeDirectoryOptions,
};