From f6673e1b771d306b25ee5d9e4310d1d52e3922a7 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 18 Jan 2026 17:25:22 +0000 Subject: [PATCH] Add JSON page support to page configs --- src/config/default-pages.json | 11 ++++++++++ src/config/page-loader.ts | 22 ++++++++++++++----- src/config/page-schema.ts | 36 ++++++++++++++++++++++++++++---- src/config/pages.json | 10 +++++++++ src/lib/route-preload-manager.ts | 6 ++++++ src/types/page-config.ts | 22 ++++++++++++++----- 6 files changed, 93 insertions(+), 14 deletions(-) diff --git a/src/config/default-pages.json b/src/config/default-pages.json index e0cc663..6f653ac 100644 --- a/src/config/default-pages.json +++ b/src/config/default-pages.json @@ -245,6 +245,17 @@ "type": "single" } }, + { + "id": "json-ui-schema", + "title": "JSON UI (Schema)", + "description": "Render JSON UI from a schema file", + "icon": "Code", + "type": "json", + "schemaPath": "json-ui-page.json", + "layout": { + "type": "single" + } + }, { "id": "sass", "title": "Sass Styles", diff --git a/src/config/page-loader.ts b/src/config/page-loader.ts index 1f8f74e..6ceee5a 100644 --- a/src/config/page-loader.ts +++ b/src/config/page-loader.ts @@ -20,14 +20,10 @@ export interface ResizableConfig { } } -export interface PageConfig { +export interface BasePageConfig { id: string title: string icon: string - component?: string - type?: 'json' | 'component' - schemaPath?: string - schema?: PageSchema enabled: boolean isRoot?: boolean toggleKey?: string @@ -38,6 +34,22 @@ export interface PageConfig { resizableConfig?: ResizableConfig } +export interface ComponentPageConfig extends BasePageConfig { + type?: 'component' + component: string + schemaPath?: undefined + schema?: undefined +} + +export interface JsonPageConfig extends BasePageConfig { + type: 'json' + component?: undefined + schemaPath?: string + schema?: PageSchema +} + +export type PageConfig = ComponentPageConfig | JsonPageConfig + export interface PagesConfig { pages: PageConfig[] } diff --git a/src/config/page-schema.ts b/src/config/page-schema.ts index ce49807..454c36d 100644 --- a/src/config/page-schema.ts +++ b/src/config/page-schema.ts @@ -18,11 +18,10 @@ export const ResizableConfigSchema = z.object({ rightPanel: ResizablePanelConfigSchema, }) -export const SimplePageConfigSchema = z.object({ +const SimplePageConfigBaseSchema = z.object({ id: z.string(), title: z.string(), icon: z.string(), - component: z.string(), enabled: z.boolean(), toggleKey: z.string().optional(), shortcut: z.string().optional(), @@ -32,6 +31,21 @@ export const SimplePageConfigSchema = z.object({ resizableConfig: ResizableConfigSchema.optional(), }) +const SimpleComponentPageConfigSchema = SimplePageConfigBaseSchema.extend({ + type: z.literal('component').optional(), + component: z.string(), +}) + +const SimpleJsonPageConfigSchema = SimplePageConfigBaseSchema.extend({ + type: z.literal('json'), + schemaPath: z.string(), +}) + +export const SimplePageConfigSchema = z.union([ + SimpleComponentPageConfigSchema, + SimpleJsonPageConfigSchema, +]) + export const SimplePagesConfigSchema = z.object({ pages: z.array(SimplePageConfigSchema), }) @@ -65,18 +79,32 @@ export const FeatureConfigSchema = z.object({ config: z.record(z.string(), z.any()).optional(), }) -export const PageConfigSchema = z.object({ +const PageConfigBaseSchema = z.object({ id: z.string(), title: z.string(), description: z.string(), icon: z.string(), - component: z.string(), layout: LayoutConfigSchema, features: z.array(FeatureConfigSchema).optional(), permissions: z.array(z.string()).optional(), shortcuts: z.array(KeyboardShortcutSchema).optional(), }) +const ComponentPageConfigSchema = PageConfigBaseSchema.extend({ + type: z.literal('component').optional(), + component: z.string(), +}) + +const JsonPageConfigSchema = PageConfigBaseSchema.extend({ + type: z.literal('json'), + schemaPath: z.string(), +}) + +export const PageConfigSchema = z.union([ + ComponentPageConfigSchema, + JsonPageConfigSchema, +]) + export const PageRegistrySchema = z.object({ pages: z.array(PageConfigSchema), }) diff --git a/src/config/pages.json b/src/config/pages.json index 6727b1b..44e8809 100644 --- a/src/config/pages.json +++ b/src/config/pages.json @@ -365,6 +365,16 @@ "order": 22, "props": {} }, + { + "id": "json-ui-schema", + "title": "JSON UI (Schema)", + "icon": "Code", + "type": "json", + "schemaPath": "json-ui-page.json", + "enabled": true, + "order": 22.2, + "props": {} + }, { "id": "json-conversion-showcase", "title": "JSON Conversion Showcase", diff --git a/src/lib/route-preload-manager.ts b/src/lib/route-preload-manager.ts index 9856242..90a25af 100644 --- a/src/lib/route-preload-manager.ts +++ b/src/lib/route-preload-manager.ts @@ -78,6 +78,12 @@ export class RoutePreloadManager { return } + if (page.type === 'json' || page.schemaPath) { + console.log(`[PRELOAD_MGR] ๐Ÿงพ Skipping preload for JSON page: ${pageId}`) + this.preloadedRoutes.add(pageId) + return + } + try { const componentName = page.component as ComponentName console.log(`[PRELOAD_MGR] ๐Ÿš€ Preloading ${pageId} โ†’ ${componentName}`) diff --git a/src/types/page-config.ts b/src/types/page-config.ts index 54ab9e7..9a0fe8b 100644 --- a/src/types/page-config.ts +++ b/src/types/page-config.ts @@ -2,14 +2,10 @@ import { PageSchema } from './json-ui' import { PropConfig } from './prop-config' import { ResizableConfig } from './resizable-config' -export interface PageConfig { +export interface BasePageConfig { id: string title: string icon: string - component?: string - type?: 'json' | 'component' - schemaPath?: string - schema?: PageSchema enabled: boolean isRoot?: boolean toggleKey?: string @@ -19,3 +15,19 @@ export interface PageConfig { props?: PropConfig resizableConfig?: ResizableConfig } + +export interface ComponentPageConfig extends BasePageConfig { + type?: 'component' + component: string + schemaPath?: undefined + schema?: undefined +} + +export interface JsonPageConfig extends BasePageConfig { + type: 'json' + component?: undefined + schemaPath?: string + schema?: PageSchema +} + +export type PageConfig = ComponentPageConfig | JsonPageConfig