Files
create-better-t-stack/apps/web/scripts/generate-schema.ts
2025-07-05 15:51:26 +05:30

150 lines
3.3 KiB
TypeScript

import path from "node:path";
import fs from "fs-extra";
import {
AddonsSchema,
APISchema,
BackendSchema,
DatabaseSchema,
DatabaseSetupSchema,
ExamplesSchema,
FrontendSchema,
ORMSchema,
PackageManagerSchema,
RuntimeSchema,
WebDeploySchema,
} from "../../cli/src/types";
const DATABASE_VALUES = DatabaseSchema.options;
const ORM_VALUES = ORMSchema.options;
const BACKEND_VALUES = BackendSchema.options;
const RUNTIME_VALUES = RuntimeSchema.options;
const FRONTEND_VALUES = FrontendSchema.options;
const ADDONS_VALUES = AddonsSchema.options;
const EXAMPLES_VALUES = ExamplesSchema.options;
const PACKAGE_MANAGER_VALUES = PackageManagerSchema.options;
const DATABASE_SETUP_VALUES = DatabaseSetupSchema.options;
const API_VALUES = APISchema.options;
const WEB_DEPLOY_VALUES = WebDeploySchema.options;
const configSchema = {
$schema: "http://json-schema.org/draft-07/schema#",
$id: "https://better-t-stack.dev/schema.json",
title: "Better-T-Stack Configuration",
description: "Configuration file for Better-T-Stack projects",
type: "object",
properties: {
$schema: {
type: "string",
description: "JSON Schema reference for validation",
},
version: {
type: "string",
description: "CLI version used to create this project",
pattern: "^\\d+\\.\\d+\\.\\d+$",
},
createdAt: {
type: "string",
format: "date-time",
description: "Timestamp when the project was created",
},
database: {
type: "string",
enum: DATABASE_VALUES,
description: DatabaseSchema.description,
},
orm: {
type: "string",
enum: ORM_VALUES,
description: ORMSchema.description,
},
backend: {
type: "string",
enum: BACKEND_VALUES,
description: BackendSchema.description,
},
runtime: {
type: "string",
enum: RUNTIME_VALUES,
description: RuntimeSchema.description,
},
frontend: {
type: "array",
items: {
type: "string",
enum: FRONTEND_VALUES,
},
description: FrontendSchema.description,
},
addons: {
type: "array",
items: {
type: "string",
enum: ADDONS_VALUES,
},
description: AddonsSchema.description,
},
examples: {
type: "array",
items: {
type: "string",
enum: EXAMPLES_VALUES,
},
description: ExamplesSchema.description,
},
auth: {
type: "boolean",
description: "Whether authentication is enabled",
},
packageManager: {
type: "string",
enum: PACKAGE_MANAGER_VALUES,
description: PackageManagerSchema.description,
},
dbSetup: {
type: "string",
enum: DATABASE_SETUP_VALUES,
description: DatabaseSetupSchema.description,
},
api: {
type: "string",
enum: API_VALUES,
description: APISchema.description,
},
webDeploy: {
type: "string",
enum: WEB_DEPLOY_VALUES,
description: WebDeploySchema.description,
},
},
required: [
"version",
"createdAt",
"database",
"orm",
"backend",
"runtime",
"frontend",
"addons",
"examples",
"auth",
"packageManager",
"dbSetup",
"api",
"webDeploy",
],
additionalProperties: false,
};
async function generateSchema() {
const schemaPath = path.join(process.cwd(), "public", "schema.json");
await fs.ensureDir(path.dirname(schemaPath));
await fs.writeFile(
schemaPath,
JSON.stringify(configSchema, null, 2),
"utf-8",
);
console.log("✅ Generated schema.json from shared types package");
}
generateSchema().catch(console.error);