diff --git a/.vscode/launch.json b/.vscode/launch.json index 0fc9eb19..7b2b8af6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -71,7 +71,7 @@ "type": "node", "request": "launch", // Debug app in VSCode - "program": "${workspaceFolder}/src/backend/utils/SchemaStaticUtil.ts", + "program": "${workspaceFolder}/src/backend/utils/SchemaDocsStaticUtils.ts", "runtimeExecutable": "node", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", diff --git a/src/backend/common/infrastructure/config/client/koito.ts b/src/backend/common/infrastructure/config/client/koito.ts index a43be41e..19640e05 100644 --- a/src/backend/common/infrastructure/config/client/koito.ts +++ b/src/backend/common/infrastructure/config/client/koito.ts @@ -74,11 +74,11 @@ export const koitoDataSchema = z.object({ username: z.string().meta({ description: "Username of the user to scrobble for" }), -}); +}).meta({title: 'KoitoData'}); export type KoitoData = z.infer; -export const koitoClientDataSchema = koitoDataSchema.extend(commonClientDataSchema.shape); +export const koitoClientDataSchema = koitoDataSchema.extend(commonClientDataSchema.shape).meta({title: 'KoitoData'}); export type KoitoClientData = z.infer; diff --git a/src/backend/utils/SchemaDocsStaticUtils.ts b/src/backend/utils/SchemaDocsStaticUtils.ts index 643fa5a0..e251e517 100644 --- a/src/backend/utils/SchemaDocsStaticUtils.ts +++ b/src/backend/utils/SchemaDocsStaticUtils.ts @@ -1,21 +1,57 @@ import { writeFileSync, mkdirSync } from "node:fs"; import { resolve } from "path"; +import * as z from 'zod'; import {getTypeSchemaFromConfigGenerator} from "./SchemaUtils.ts"; import { atomicClientInterfaces } from '../common/infrastructure/config/client/clients.ts'; import { atomicSourceInterfaces } from '../common/infrastructure/config/source/sources.ts'; import { projectRootDir } from "../common/infrastructure/Atomic.ts"; +import { koitoClientConfigSchema } from "../common/infrastructure/config/client/koito.ts"; mkdirSync(resolve(projectRootDir, 'docsite/static/schemas'), {recursive: true}); -const aio = getTypeSchemaFromConfigGenerator('AIOConfig'); -writeFileSync(resolve(projectRootDir, 'docsite/static/schemas/aio.json'), JSON.stringify(aio)); +const jsonSchema = z.toJSONSchema(koitoClientConfigSchema, { + io: "input", + //reused: "ref", + unrepresentable: "any", + override: (ctx) => { + //const def = ctx.zodSchema._zod.def; + if(ctx.jsonSchema.anyOf !== undefined && Array.isArray(ctx.jsonSchema.anyOf)) { + for(const a of ctx.jsonSchema.anyOf) { + if(a.const !== undefined) { + a.enum = [a.const]; + delete a.const; + } + } + } + if(ctx.jsonSchema.oneOf !== undefined) { + for(const a of ctx.jsonSchema.oneOf) { + if(a.const !== undefined) { + a.enum = [a.const]; + delete a.const; + } + } + } + if(ctx.jsonSchema.const !== undefined) { + ctx.jsonSchema.enum = [ctx.jsonSchema.const]; + delete ctx.jsonSchema.const; + } + // if (ctx.jsonSchema.anyOf) { + // ctx.jsonSchema.oneOf = ctx.jsonSchema.anyOf; + // delete ctx.jsonSchema.anyOf; + // } + } + }); +writeFileSync(resolve(projectRootDir, `docsite/static/schemas/KoitoClientConfig.json`), JSON.stringify(jsonSchema)); -for(const inter of atomicSourceInterfaces) { - const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); - writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); -} +// const aio = getTypeSchemaFromConfigGenerator('AIOConfig'); +// writeFileSync(resolve(projectRootDir, 'docsite/static/schemas/aio.json'), JSON.stringify(aio)); -for(const inter of atomicClientInterfaces) { - const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); - writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); -} \ No newline at end of file +// for(const inter of atomicSourceInterfaces) { +// const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); +// writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); +// } + +// for(const inter of atomicClientInterfaces) { +// const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); +// writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); +// } \ No newline at end of file diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index 2faf06d0..5bb9508e 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -13,7 +13,7 @@ export const COMPONENT_TYPE_CLIENT: ComponentTypeClient = 'client'; export const componentTypeSourceSchema = z.literal('source'); export type ComponentTypeSource = z.infer; export const COMPONENT_TYPE_SOURCE: ComponentTypeSource = 'source'; -export const componentTypeSchema = z.union([componentTypeClientSchema, componentTypeSourceSchema]); +export const componentTypeSchema = z.enum(['client','source']); // z.union([componentTypeClientSchema, componentTypeSourceSchema]); export type ComponentType = z.infer; export const COMPONENT_TYPES: ComponentType[] = [COMPONENT_TYPE_SOURCE, COMPONENT_TYPE_CLIENT]; export const isComponentTypeSource = (type: string): type is ComponentTypeSource => type === COMPONENT_TYPE_SOURCE;