From ed77a0e6645ffaff1ea24b7f2899f7ab9e3fa140 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:33:21 +0800 Subject: [PATCH] refactor(types)!: rename the 15 objectui symbols that only collided with a spec name (objectstack#4115 group A) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These are the triage's COINCIDENCE verdicts: local concepts that share a `@objectstack/spec` export's NAME while modelling something different. The name itself is the defect — #4115's own framing is that an agent reads the familiar name, assumes the spec's semantics, and builds on it (that is how #2901 was filed with a backwards premise). Renamed outright, with no back-compat aliases: FilterCondition -> FilterBuilderCondition (spec: recursive ObjectQL filter AST) FilterOperator -> FilterBuilderOperator (spec: WebSocket subscription operators) FilterConditionSchema -> FilterBuilderConditionSchema EventHandler -> UIEventHandler (spec: kernel event-bus subscription) CacheStrategy -> FetchCacheStrategy (spec: cache EVICTION policy, not fetch order) MutationEvent -> DataSourceMutationEvent (spec: a string enum, not an object) ExpressionSchema -> ExpressionNodeSchema (spec: the L1 CEL expression envelope) GroupByNode -> GroupByClauseNode (spec: a single grouping target) SpanSchema -> TextSpanSchema (spec: an OpenTelemetry tracing span) BatchOperationResult -> BatchOperationSummary (spec: ONE record's result; this is the rollup) ReportSchedule -> ReportScheduleConfig (spec: a persisted server-side row) ReportSchema -> ReportComponentSchema (spec: the report metadata document) ThemeSchema -> ThemeComponentSchema (spec: a theme DEFINITION; this is the switcher) ValidationRule (field-types) -> FieldConstraints (spec: a named server-side rule) ValidationRule (form) -> FieldValidationRules Two follow-on decisions the renames forced: - objectui had TWO conflicting local `ValidationRule`s — a flat constraint bag in field-types.ts and an RHF-style wrapped one in form.ts, sharing every key name with incompatible value shapes. The barrel exported only the second (the first was omitted specifically to dodge the collision), so a consumer deep-importing field-types silently got a different type. They now have distinct names. - `zod/reports.zod.ts` already used `ReportComponentSchema` for the discriminated UNION, so it becomes `ReportUnionSchema` — matching the convention `zod/theme.zod.ts` already follows (node = *ComponentSchema, union = *UnionSchema). The deprecated `ThemeSchema` alias is deleted rather than kept, per the same no-alias directive. Ledger 144 -> 129, regenerated with `--ledger` and diffed entry by entry: the removals are exactly these 15 names, no other package's debt dropped. Mutation-tested: re-declaring `FilterCondition` under the spec's name fails the guard by name and file. 78/78 type-check; full suite 8696 assertions green. BREAKING CHANGE: 15 type/schema exports of `@object-ui/types` are renamed with no aliases. Consumers importing the old names must update; every in-repo consumer is updated in this commit. Co-Authored-By: Claude Fable 5 --- .../components/src/renderers/basic/span.tsx | 4 +- .../components/src/renderers/form/form.tsx | 2 +- packages/core/src/adapters/ValueDataSource.ts | 8 +-- packages/core/src/query/query-ast.ts | 4 +- packages/data-objectstack/src/index.ts | 10 +-- .../data-objectstack/src/onMutation.test.ts | 70 +++++++++---------- packages/mobile/src/index.ts | 2 +- .../plugin-report/src/LiveReportExporter.ts | 14 ++-- .../plugin-report/src/ReportExportEngine.ts | 14 ++-- .../src/__tests__/phase2-schemas.test.ts | 18 ++--- packages/types/src/api-types.ts | 28 ++++---- packages/types/src/complex.ts | 10 +-- packages/types/src/data-protocol.ts | 6 +- packages/types/src/data.ts | 4 +- packages/types/src/field-types.ts | 6 +- packages/types/src/form.ts | 4 +- packages/types/src/index.ts | 28 ++++---- packages/types/src/layout.ts | 4 +- packages/types/src/mobile.ts | 6 +- packages/types/src/registry.ts | 4 +- packages/types/src/reports.ts | 16 ++--- packages/types/src/spec-report.ts | 10 +-- packages/types/src/theme.ts | 2 +- packages/types/src/ui-action.ts | 2 +- packages/types/src/zod/complex.zod.ts | 8 +-- packages/types/src/zod/form.zod.ts | 4 +- packages/types/src/zod/index.zod.ts | 15 ++-- packages/types/src/zod/layout.zod.ts | 4 +- packages/types/src/zod/reports.zod.ts | 12 ++-- packages/types/src/zod/theme.zod.ts | 8 +-- scripts/check-spec-symbol-derivation.mjs | 15 ---- 31 files changed, 160 insertions(+), 182 deletions(-) diff --git a/packages/components/src/renderers/basic/span.tsx b/packages/components/src/renderers/basic/span.tsx index 989288320c..58f2862b99 100644 --- a/packages/components/src/renderers/basic/span.tsx +++ b/packages/components/src/renderers/basic/span.tsx @@ -7,11 +7,11 @@ */ import { ComponentRegistry } from '@object-ui/core'; -import type { SpanSchema } from '@object-ui/types'; +import type { TextSpanSchema } from '@object-ui/types'; import { renderChildren } from '../../lib/utils'; import { forwardRef } from 'react'; -const SpanRenderer = forwardRef( +const SpanRenderer = forwardRef( ({ schema, className, ...props }, ref) => { // Deprecation warning if (process.env.NODE_ENV !== 'production') { diff --git a/packages/components/src/renderers/form/form.tsx b/packages/components/src/renderers/form/form.tsx index 220f8c9821..f27b1cdbe6 100644 --- a/packages/components/src/renderers/form/form.tsx +++ b/packages/components/src/renderers/form/form.tsx @@ -7,7 +7,7 @@ */ import { ComponentRegistry, resolveFieldRuleState, evalFieldPredicate, resolveCascadingOptions, isValueStillOffered } from '@object-ui/core'; -import type { FormSchema, FormField as FormFieldConfig, FormFieldTab, FormFieldPane, ValidationRule, FieldCondition, SelectOption } from '@object-ui/types'; +import type { FormSchema, FormField as FormFieldConfig, FormFieldTab, FormFieldPane, FieldValidationRules, FieldCondition, SelectOption } from '@object-ui/types'; import { useForm } from 'react-hook-form'; import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage, FormDescription } from '../../ui/form'; import { Button } from '../../ui/button'; diff --git a/packages/core/src/adapters/ValueDataSource.ts b/packages/core/src/adapters/ValueDataSource.ts index f9b7ef1abb..0832e566f1 100644 --- a/packages/core/src/adapters/ValueDataSource.ts +++ b/packages/core/src/adapters/ValueDataSource.ts @@ -12,7 +12,7 @@ import type { DataSource, BatchTransactionOperation, - MutationEvent, + DataSourceMutationEvent, QueryParams, QueryResult, AggregateParams, @@ -233,7 +233,7 @@ function selectFields(record: T, fields?: string[]): T { export class ValueDataSource implements DataSource { private items: T[]; private idField: string | undefined; - private mutationListeners = new Set<(event: MutationEvent) => void>(); + private mutationListeners = new Set<(event: DataSourceMutationEvent) => void>(); constructor(config: ValueDataSourceConfig) { // Deep clone to prevent external mutation @@ -242,7 +242,7 @@ export class ValueDataSource implements DataSource { } /** Notify all mutation subscribers */ - private emitMutation(event: MutationEvent): void { + private emitMutation(event: DataSourceMutationEvent): void { for (const listener of this.mutationListeners) { try { listener(event); } catch (err) { console.warn('ValueDataSource: mutation listener error', err); } } @@ -453,7 +453,7 @@ export class ValueDataSource implements DataSource { // Mutation subscription (P2 — Event Bus) // ----------------------------------------------------------------------- - onMutation(callback: (event: MutationEvent) => void): () => void { + onMutation(callback: (event: DataSourceMutationEvent) => void): () => void { this.mutationListeners.add(callback); return () => { this.mutationListeners.delete(callback); }; } diff --git a/packages/core/src/query/query-ast.ts b/packages/core/src/query/query-ast.ts index c91ce3df5e..275712d209 100644 --- a/packages/core/src/query/query-ast.ts +++ b/packages/core/src/query/query-ast.ts @@ -11,7 +11,7 @@ import type { FromNode, WhereNode, JoinNode, - GroupByNode, + GroupByClauseNode, OrderByNode, LimitNode, OffsetNode, @@ -210,7 +210,7 @@ export class QueryASTBuilder { }; } - private buildGroupBy(fields: string[]): GroupByNode { + private buildGroupBy(fields: string[]): GroupByClauseNode { return { type: 'group_by', fields: fields.map(field => this.buildField(field)), diff --git a/packages/data-objectstack/src/index.ts b/packages/data-objectstack/src/index.ts index e63d154dce..3ad7ea0592 100644 --- a/packages/data-objectstack/src/index.ts +++ b/packages/data-objectstack/src/index.ts @@ -10,7 +10,7 @@ import { ObjectStackClient, type QueryOptions as ObjectStackQueryOptions } from import type { DataSource, BatchTransactionOperation, - MutationEvent, + DataSourceMutationEvent, QueryParams, QueryResult, GlobalSearchResult, @@ -658,7 +658,7 @@ export class ObjectStackAdapter implements DataSource { // create/update/delete so data-bound views (ListView, ObjectView, kanban, // calendar) auto-refresh — the interface ListView relies on to reflect // inline-edit "Save All" writes without a manual reload. - private mutationListeners = new Set<(event: MutationEvent) => void>(); + private mutationListeners = new Set<(event: DataSourceMutationEvent) => void>(); // Subscribers registered via onWriteWarning(). Emitted after a create/update // whose response carried `droppedFields` (framework #3431/#3455) so the app @@ -1073,7 +1073,7 @@ export class ObjectStackAdapter implements DataSource { * Notify all mutation subscribers. A throwing listener must not break the * mutation or starve the other subscribers, so each is isolated. */ - private emitMutation(event: MutationEvent): void { + private emitMutation(event: DataSourceMutationEvent): void { for (const listener of this.mutationListeners) { try { listener(event); @@ -1089,7 +1089,7 @@ export class ObjectStackAdapter implements DataSource { * mutation (e.g. inline-edit "Save All", which writes through `update` and * must repaint the list without a manual reload). */ - onMutation(callback: (event: MutationEvent) => void): () => void { + onMutation(callback: (event: DataSourceMutationEvent) => void): () => void { this.mutationListeners.add(callback); return () => { this.mutationListeners.delete(callback); @@ -1476,7 +1476,7 @@ export class ObjectStackAdapter implements DataSource { } /** - * Emit one MutationEvent per committed operation so the invalidation bus + * Emit one DataSourceMutationEvent per committed operation so the invalidation bus * (#2269) sees writes that went through /batch exactly like single * create/update/delete calls — master-detail ModalForm saves otherwise leave * related lists and count badges stale (#2582). `results` is index-aligned diff --git a/packages/data-objectstack/src/onMutation.test.ts b/packages/data-objectstack/src/onMutation.test.ts index ed4922da8b..991ed172be 100644 --- a/packages/data-objectstack/src/onMutation.test.ts +++ b/packages/data-objectstack/src/onMutation.test.ts @@ -23,7 +23,7 @@ import { clearSharedDiscoveryCache, readTransactionalBatchCapability, } from './index'; -import type { MutationEvent } from '@object-ui/types'; +import type { DataSourceMutationEvent } from '@object-ui/types'; function makeDS(stub: Record) { const ds: any = new ObjectStackAdapter({ @@ -49,8 +49,8 @@ describe('ObjectStackAdapter.onMutation', () => { .mockResolvedValue({ record: { id: 'r1', account: 'acc-1' } }); const ds = makeDS({ update }); - const events: MutationEvent[] = []; - const unsub = ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + const unsub = ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.update('showcase_project', 'r1', { account: 'acc-1' }); @@ -67,8 +67,8 @@ describe('ObjectStackAdapter.onMutation', () => { it('emits a create event with the new record', async () => { const create = vi.fn().mockResolvedValue({ record: { id: 'new', name: 'X' } }); const ds = makeDS({ create }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.create('showcase_project', { name: 'X' }); @@ -83,8 +83,8 @@ describe('ObjectStackAdapter.onMutation', () => { .mockResolvedValueOnce({ deleted: true }) .mockResolvedValueOnce({ deleted: false }); const ds = makeDS({ delete: del }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.delete('showcase_project', 'r1'); await ds.delete('showcase_project', 'r2'); @@ -97,8 +97,8 @@ describe('ObjectStackAdapter.onMutation', () => { it('emits a single bulk event per bulkUpdate call (not per id)', async () => { const updateMany = vi.fn().mockResolvedValue({ succeeded: 3, failed: 0, results: [] }); const ds = makeDS({ updateMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulkUpdate('showcase_project', ['a', 'b', 'c'], { archived: true }); @@ -108,8 +108,8 @@ describe('ObjectStackAdapter.onMutation', () => { it('does not emit when a bulk operation affected zero rows', async () => { const updateMany = vi.fn().mockResolvedValue({ succeeded: 0, failed: 0, results: [] }); const ds = makeDS({ updateMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulkUpdate('showcase_project', ['a'], { archived: true }); @@ -160,8 +160,8 @@ describe('ObjectStackAdapter.batchTransaction mutation events', () => { { status: 200, headers: { 'Content-Type': 'application/json' } }, ), ); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.batchTransaction([ { object: 'ehr_task_version', action: 'create', data: { name: 'Task version A' } }, @@ -183,8 +183,8 @@ describe('ObjectStackAdapter.batchTransaction mutation events', () => { { status: 200, headers: { 'Content-Type': 'application/json' } }, ), ); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.batchTransaction([ { object: 'ehr_task_version', action: 'update', id: 'p1', data: { name: 'Renamed' } }, @@ -208,8 +208,8 @@ describe('ObjectStackAdapter.batchTransaction mutation events', () => { headers: { 'Content-Type': 'application/json' }, }), ); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.batchTransaction([{ object: 'ehr_task_version', data: { name: 'X' } }]); @@ -225,8 +225,8 @@ describe('ObjectStackAdapter.batchTransaction mutation events', () => { headers: { 'Content-Type': 'application/json' }, }), ); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await expect( ds.batchTransaction([{ object: 'ehr_task_version', action: 'create', data: {} }]), @@ -265,8 +265,8 @@ describe('ObjectStackAdapter.batchTransaction fallback (no server atomicity)', ( const create = vi.fn(async (_o: string, d: any) => ({ record: { id: 'p1', ...d } })); const { ds, batchTransaction } = makeFallbackDS({ batchStatus: 404, clientData: { create } }); const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); const res = await ds.batchTransaction([{ object: 'proj', action: 'create', data: { name: 'A' } }]); @@ -311,8 +311,8 @@ describe('ObjectStackAdapter.batchTransaction fallback (no server atomicity)', ( ds.connected = true; ds.connectionState = 'connected'; ds.client = { data: { batchTransaction: sdkBatch } }; - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); const res = await ds.batchTransaction([{ object: 'proj', action: 'create', data: { name: 'A' } }]); @@ -335,8 +335,8 @@ describe('ObjectStackAdapter.bulk mutation events', () => { it('emits a single create event per bulk create call', async () => { const createMany = vi.fn().mockResolvedValue([{ id: 'c1' }, { id: 'c2' }]); const ds = makeDS({ createMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulk('ehr_task_check_item', 'create', [{ label: 'a' }, { label: 'b' }]); @@ -346,8 +346,8 @@ describe('ObjectStackAdapter.bulk mutation events', () => { it('does not emit when a bulk create returned zero records', async () => { const createMany = vi.fn().mockResolvedValue([]); const ds = makeDS({ createMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulk('ehr_task_check_item', 'create', [{ label: 'a' }]); @@ -357,8 +357,8 @@ describe('ObjectStackAdapter.bulk mutation events', () => { it('emits a single delete event per bulk delete call', async () => { const deleteMany = vi.fn().mockResolvedValue(undefined); const ds = makeDS({ deleteMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulk('ehr_task_check_item', 'delete', [{ id: 'c1' }, { id: 'c2' }] as any); @@ -368,8 +368,8 @@ describe('ObjectStackAdapter.bulk mutation events', () => { it('emits a single update event per bulk update call', async () => { const updateMany = vi.fn().mockResolvedValue([{ id: 'c1' }]); const ds = makeDS({ updateMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await ds.bulk('ehr_task_check_item', 'update', [{ id: 'c1', label: 'x' }] as any); @@ -379,8 +379,8 @@ describe('ObjectStackAdapter.bulk mutation events', () => { it('bulk create failure emits nothing', async () => { const createMany = vi.fn().mockRejectedValue(new Error('boom')); const ds = makeDS({ createMany }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); await expect(ds.bulk('ehr_task_check_item', 'create', [{ label: 'a' }])).rejects.toThrow(); @@ -481,8 +481,8 @@ describe('ObjectStackAdapter.batchTransaction capability gate (#2693 / framework batchStatus: 200, batchBody: { results: [{ id: 'p1', name: 'A' }, { id: 'c1', proj: 'p1' }] }, }); - const events: MutationEvent[] = []; - ds.onMutation((e: MutationEvent) => events.push(e)); + const events: DataSourceMutationEvent[] = []; + ds.onMutation((e: DataSourceMutationEvent) => events.push(e)); const res = await ds.batchTransaction([ { object: 'proj', action: 'create', data: { name: 'A' } }, diff --git a/packages/mobile/src/index.ts b/packages/mobile/src/index.ts index 8b14f6937b..27b5c700f3 100644 --- a/packages/mobile/src/index.ts +++ b/packages/mobile/src/index.ts @@ -60,7 +60,7 @@ export type { MobileOverrides, PWAConfig, PWAIcon, - CacheStrategy, + FetchCacheStrategy, OfflineConfig, OfflineRoute, GestureType, diff --git a/packages/plugin-report/src/LiveReportExporter.ts b/packages/plugin-report/src/LiveReportExporter.ts index bba6f52de6..bc0902c7eb 100644 --- a/packages/plugin-report/src/LiveReportExporter.ts +++ b/packages/plugin-report/src/LiveReportExporter.ts @@ -20,11 +20,11 @@ import type { DataSource, QueryParams, - ReportSchema, + ReportComponentSchema, ReportExportFormat, ReportExportConfig, ReportField, - ReportSchedule, + ReportScheduleConfig, } from '@object-ui/types'; import { exportReport } from './ReportExportEngine'; @@ -78,8 +78,8 @@ export interface LiveExportResult { * Schedule trigger callback */ export type ScheduleTriggerCallback = ( - report: ReportSchema, - schedule: ReportSchedule, + report: ReportComponentSchema, + schedule: ReportScheduleConfig, ) => void; /** @@ -95,7 +95,7 @@ export type ScheduleTriggerCallback = ( * ``` */ export async function exportWithLiveData( - report: ReportSchema, + report: ReportComponentSchema, options: LiveExportOptions, ): Promise { const { @@ -159,7 +159,7 @@ export async function exportWithLiveData( * ``` */ export function exportExcelWithFormulas( - report: ReportSchema, + report: ReportComponentSchema, data: any[], options: { columns?: ExcelColumnConfig[]; @@ -243,7 +243,7 @@ export function exportExcelWithFormulas( * ``` */ export function createScheduleTrigger( - report: ReportSchema, + report: ReportComponentSchema, dataSource: DataSource, resource: string, onComplete: ScheduleTriggerCallback, diff --git a/packages/plugin-report/src/ReportExportEngine.ts b/packages/plugin-report/src/ReportExportEngine.ts index 6d2cc6d026..0157f7b2d7 100644 --- a/packages/plugin-report/src/ReportExportEngine.ts +++ b/packages/plugin-report/src/ReportExportEngine.ts @@ -6,7 +6,7 @@ * LICENSE file in the root directory of this source tree. */ -import type { ReportSchema, ReportExportConfig, ReportExportFormat, ReportField } from '@object-ui/types'; +import type { ReportComponentSchema, ReportExportConfig, ReportExportFormat, ReportField } from '@object-ui/types'; /** * Report Export Engine @@ -16,7 +16,7 @@ import type { ReportSchema, ReportExportConfig, ReportExportFormat, ReportField /** * Export report data as CSV */ -export function exportAsCSV(report: ReportSchema, data: any[], config?: ReportExportConfig): void { +export function exportAsCSV(report: ReportComponentSchema, data: any[], config?: ReportExportConfig): void { const fields = report.fields || []; const headers = fields.map((f: ReportField) => f.label || f.name); const rows = data.map((row: Record) => fields.map((f: ReportField) => { @@ -40,7 +40,7 @@ export function exportAsCSV(report: ReportSchema, data: any[], config?: ReportEx /** * Export report data as JSON */ -export function exportAsJSON(report: ReportSchema, data: any[], config?: ReportExportConfig): void { +export function exportAsJSON(report: ReportComponentSchema, data: any[], config?: ReportExportConfig): void { const exportData = { title: report.title, description: report.description, @@ -54,7 +54,7 @@ export function exportAsJSON(report: ReportSchema, data: any[], config?: ReportE /** * Export report as HTML (printable format) */ -export function exportAsHTML(report: ReportSchema, data: any[], config?: ReportExportConfig): void { +export function exportAsHTML(report: ReportComponentSchema, data: any[], config?: ReportExportConfig): void { const fields = report.fields || []; const orientation = validateOrientation(config?.orientation); const pageSize = validatePageSize(config?.pageSize); @@ -93,7 +93,7 @@ ${report.description ? `

${escapeHTML(report.description)} /** * Export report as PDF using browser print */ -export function exportAsPDF(report: ReportSchema, data: any[], config?: ReportExportConfig): void { +export function exportAsPDF(report: ReportComponentSchema, data: any[], config?: ReportExportConfig): void { const fields = report.fields || []; const orientation = validateOrientation(config?.orientation); const pageSize = validatePageSize(config?.pageSize); @@ -148,7 +148,7 @@ ${report.description ? `

${escapeHTML(report.description)} /** * Export report as Excel-compatible CSV (with BOM for proper UTF-8 in Excel) */ -export function exportAsExcel(report: ReportSchema, data: any[], config?: ReportExportConfig): void { +export function exportAsExcel(report: ReportComponentSchema, data: any[], config?: ReportExportConfig): void { const fields = report.fields || []; const headers = fields.map((f: ReportField) => f.label || f.name); const rows = data.map((row: Record) => fields.map((f: ReportField) => { @@ -174,7 +174,7 @@ export function exportAsExcel(report: ReportSchema, data: any[], config?: Report */ export function exportReport( format: ReportExportFormat, - report: ReportSchema, + report: ReportComponentSchema, data: any[], config?: ReportExportConfig ): void { diff --git a/packages/types/src/__tests__/phase2-schemas.test.ts b/packages/types/src/__tests__/phase2-schemas.test.ts index 7c288e4729..32d226d152 100644 --- a/packages/types/src/__tests__/phase2-schemas.test.ts +++ b/packages/types/src/__tests__/phase2-schemas.test.ts @@ -1,16 +1,16 @@ /** * Tests for Phase 2 Schema Definitions - * Testing AppSchema, ThemeSchema, ReportSchema, BlockSchema, and Enhanced ActionSchema + * Testing AppSchema, ThemeComponentSchema, ReportComponentSchema, BlockSchema, and Enhanced ActionSchema */ import { describe, it, expect } from 'vitest'; import { AppSchema, AppActionSchema, AppMenuItemSchema, - ThemeSchema, + ThemeComponentSchema, ThemeSwitcherSchema, ThemePreviewSchema, - ReportSchema, + ReportComponentSchema, ReportBuilderSchema, ReportViewerSchema, BlockSchema, @@ -111,8 +111,8 @@ describe('Phase 2: AppSchema Zod Validation', () => { }); }); -describe('Phase 2: ThemeSchema Zod Validation', () => { - it('should validate a complete ThemeSchema', () => { +describe('Phase 2: ThemeComponentSchema Zod Validation', () => { + it('should validate a complete ThemeComponentSchema', () => { const theme = { type: 'theme', mode: 'dark', @@ -144,7 +144,7 @@ describe('Phase 2: ThemeSchema Zod Validation', () => { storageKey: 'app-theme', }; - const result = ThemeSchema.safeParse(theme); + const result = ThemeComponentSchema.safeParse(theme); expect(result.success).toBe(true); if (result.success) { expect(result.data.mode).toBe('dark'); @@ -167,8 +167,8 @@ describe('Phase 2: ThemeSchema Zod Validation', () => { }); }); -describe('Phase 2: ReportSchema Zod Validation', () => { - it('should validate a complete ReportSchema', () => { +describe('Phase 2: ReportComponentSchema Zod Validation', () => { + it('should validate a complete ReportComponentSchema', () => { const report = { type: 'report', title: 'Monthly Sales Report', @@ -228,7 +228,7 @@ describe('Phase 2: ReportSchema Zod Validation', () => { showPrintButton: true, }; - const result = ReportSchema.safeParse(report); + const result = ReportComponentSchema.safeParse(report); expect(result.success).toBe(true); if (result.success) { expect(result.data.fields).toHaveLength(2); diff --git a/packages/types/src/api-types.ts b/packages/types/src/api-types.ts index bbb9944c51..909cce27df 100644 --- a/packages/types/src/api-types.ts +++ b/packages/types/src/api-types.ts @@ -156,7 +156,7 @@ export interface APIConfig { /** * Event handler configuration */ -export interface EventHandler { +export interface UIEventHandler { /** * Event type */ @@ -229,7 +229,7 @@ export interface EventHandler { */ actions?: Array<{ label: string; - handler?: EventHandler; + handler?: UIEventHandler; }>; }; /** @@ -279,43 +279,43 @@ export interface EventableSchema extends BaseSchema { /** * Event handlers configuration */ - events?: EventHandler[]; + events?: UIEventHandler[]; /** * Click handler */ - onClick?: EventHandler | string; + onClick?: UIEventHandler | string; /** * Change handler */ - onChange?: EventHandler | string; + onChange?: UIEventHandler | string; /** * Submit handler */ - onSubmit?: EventHandler | string; + onSubmit?: UIEventHandler | string; /** * Focus handler */ - onFocus?: EventHandler | string; + onFocus?: UIEventHandler | string; /** * Blur handler */ - onBlur?: EventHandler | string; + onBlur?: UIEventHandler | string; /** * Mouse enter handler */ - onMouseEnter?: EventHandler | string; + onMouseEnter?: UIEventHandler | string; /** * Mouse leave handler */ - onMouseLeave?: EventHandler | string; + onMouseLeave?: UIEventHandler | string; /** * Key down handler */ - onKeyDown?: EventHandler | string; + onKeyDown?: UIEventHandler | string; /** * Key up handler */ - onKeyUp?: EventHandler | string; + onKeyUp?: UIEventHandler | string; } /** @@ -442,7 +442,7 @@ export interface ExpressionContext { /** * Expression schema for dynamic values */ -export interface ExpressionSchema { +export interface ExpressionNodeSchema { /** * Expression type */ @@ -469,4 +469,4 @@ export interface ExpressionSchema { export type APISchema = | EventableSchema | DataFetchableSchema - | ExpressionSchema; + | ExpressionNodeSchema; diff --git a/packages/types/src/complex.ts b/packages/types/src/complex.ts index 215fcff51c..9f3e48ed2b 100644 --- a/packages/types/src/complex.ts +++ b/packages/types/src/complex.ts @@ -225,7 +225,7 @@ export interface CalendarViewSchema extends BaseSchema { /** * Filter operator */ -export type FilterOperator = +export type FilterBuilderOperator = | 'equals' | 'not_equals' | 'contains' @@ -244,7 +244,7 @@ export type FilterOperator = /** * Filter condition */ -export interface FilterCondition { +export interface FilterBuilderCondition { /** * Field to filter */ @@ -252,7 +252,7 @@ export interface FilterCondition { /** * Filter operator */ - operator: FilterOperator; + operator: FilterBuilderOperator; /** * Filter value */ @@ -271,7 +271,7 @@ export interface FilterGroup { /** * Filter conditions or nested groups */ - conditions: (FilterCondition | FilterGroup)[]; + conditions: (FilterBuilderCondition | FilterGroup)[]; } /** @@ -326,7 +326,7 @@ export interface FilterField { /** * Available operators for this field */ - operators?: FilterOperator[]; + operators?: FilterBuilderOperator[]; /** * Options (for select type) */ diff --git a/packages/types/src/data-protocol.ts b/packages/types/src/data-protocol.ts index 3c49aecb87..18e551b46e 100644 --- a/packages/types/src/data-protocol.ts +++ b/packages/types/src/data-protocol.ts @@ -18,7 +18,7 @@ // Import existing base types to avoid duplication import type { SortConfig as BaseSortConfig } from './objectql'; -import type { FilterOperator as BaseFilterOperator } from './complex'; +import type { FilterBuilderOperator as BaseFilterOperator } from './complex'; // Spec-owned vocabulary, bound rather than re-declared (objectstack#4115). The // spec exports both of these as zod enums, not as types, so they are derived @@ -109,7 +109,7 @@ export interface JoinNode extends QueryASTNode { /** * GROUP BY clause node */ -export interface GroupByNode extends QueryASTNode { +export interface GroupByClauseNode extends QueryASTNode { type: 'group_by'; fields: FieldNode[]; having?: OperatorNode; @@ -285,7 +285,7 @@ export interface QueryAST { from: FromNode; joins?: JoinNode[]; where?: WhereNode; - group_by?: GroupByNode; + group_by?: GroupByClauseNode; order_by?: OrderByNode; limit?: LimitNode; offset?: OffsetNode; diff --git a/packages/types/src/data.ts b/packages/types/src/data.ts index eb6a7f1b93..9289a263dc 100644 --- a/packages/types/src/data.ts +++ b/packages/types/src/data.ts @@ -608,7 +608,7 @@ export interface DataSource { * unsub?.(); * ``` */ - onMutation?(callback: (event: MutationEvent) => void): () => void; + onMutation?(callback: (event: DataSourceMutationEvent) => void): () => void; /** * Initiate an asynchronous export job for a resource (server-driven streaming export). @@ -1113,7 +1113,7 @@ export interface ExportJobProgressInfo { * Describes a mutation that occurred on a DataSource. * Emitted by `DataSource.onMutation` subscribers after create/update/delete. */ -export interface MutationEvent { +export interface DataSourceMutationEvent { /** The type of mutation that occurred */ type: 'create' | 'update' | 'delete'; /** The resource (object) name that was mutated */ diff --git a/packages/types/src/field-types.ts b/packages/types/src/field-types.ts index 6e0535f0e9..4bde8cf750 100644 --- a/packages/types/src/field-types.ts +++ b/packages/types/src/field-types.ts @@ -95,7 +95,7 @@ export interface BaseFieldMetadata { /** * Custom validation function or rules */ - validate?: ValidationFunction | ValidationRule; + validate?: ValidationFunction | FieldConstraints; /** * Field dependencies (Phase 3.2.3) @@ -133,7 +133,7 @@ export type ValidationFunction = (value: any) => boolean | string | Promise; @@ -348,7 +348,7 @@ export type ReportType = z.infer; /** * Report Schema - Main report configuration */ -export interface ReportSchema extends BaseSchema { +export interface ReportComponentSchema extends BaseSchema { type: 'report'; /** @@ -394,7 +394,7 @@ export interface ReportSchema extends BaseSchema { /** * Schedule configuration */ - schedule?: ReportSchedule; + schedule?: ReportScheduleConfig; /** * Default export format @@ -466,7 +466,7 @@ export interface ReportBuilderSchema extends BaseSchema { /** * Initial report configuration */ - report?: ReportSchema; + report?: ReportComponentSchema; /** * Available data sources @@ -503,7 +503,7 @@ export interface ReportViewerSchema extends BaseSchema { /** * Report to display */ - report?: ReportSchema; + report?: ReportComponentSchema; /** * Report data diff --git a/packages/types/src/spec-report.ts b/packages/types/src/spec-report.ts index 72eafe28eb..1fb7483475 100644 --- a/packages/types/src/spec-report.ts +++ b/packages/types/src/spec-report.ts @@ -20,7 +20,7 @@ * the data shape that survives storage, transport, AI generation, and * cross-stack reuse. Mirrors `@objectstack/spec` exactly. * - * 2. **Presentation layer (`reports.ts`, kept as `ReportSchema`):** How the + * 2. **Presentation layer (`reports.ts`, kept as `ReportComponentSchema`):** How the * ObjectUI runtime *renders* a report — sections, toolbar config, schedule * UI, conditional formatting, export buttons. These are ObjectUI-specific * UX enhancements that the protocol does not (and should not) prescribe. @@ -149,11 +149,11 @@ export function mapAggregateToQL(aggregate: SpecReportAggregate): QLAggregationF } // --------------------------------------------------------------------------- -// Adapter: spec Report → legacy presentation ReportSchema +// Adapter: spec Report → legacy presentation ReportComponentSchema // --------------------------------------------------------------------------- // Lightweight structural type for the legacy presentation schema. We don't -// import `ReportSchema` from `./reports` here to avoid a circular module load +// import `ReportComponentSchema` from `./reports` here to avoid a circular module load // at type-resolution time (some downstream tooling crashes on that). The shape // is intentionally permissive: the adapter only fills the fields it knows about. export interface LegacyReportPresentationLike { @@ -187,7 +187,7 @@ function resolveLabel(label: unknown, fallback: string): string { } /** - * Convert a spec `Report` into the legacy presentation `ReportSchema` so the + * Convert a spec `Report` into the legacy presentation `ReportComponentSchema` so the * existing `ReportRenderer`/`ReportViewer` can render it during migration. * * Since the ADR-0021 single-form cutover (`@objectstack/spec` 9.0) a report is @@ -235,7 +235,7 @@ export function specReportToPresentation(report: SpecReport): LegacyReportPresen /** * Type guard: does this object look like a spec `Report` (vs. a legacy - * presentation `ReportSchema`)? + * presentation `ReportComponentSchema`)? * * Heuristic (spec 9.0, dataset-bound): spec reports carry `name` + a report * `type` and are **not** the legacy presentation shape (which carries diff --git a/packages/types/src/theme.ts b/packages/types/src/theme.ts index 67e705b88e..ec900b7c73 100644 --- a/packages/types/src/theme.ts +++ b/packages/types/src/theme.ts @@ -127,7 +127,7 @@ export interface Theme { * * Used by SchemaRenderer to render a theme manager component. */ -export interface ThemeSchema extends BaseSchema { +export interface ThemeComponentSchema extends BaseSchema { type: 'theme'; /** Current theme mode */ diff --git a/packages/types/src/ui-action.ts b/packages/types/src/ui-action.ts index 796e8b397b..24f2dd6c4a 100644 --- a/packages/types/src/ui-action.ts +++ b/packages/types/src/ui-action.ts @@ -554,7 +554,7 @@ export interface BatchOperationConfig { } /** Batch operation result */ -export interface BatchOperationResult { +export interface BatchOperationSummary { /** Total items processed */ total: number; /** Successfully processed count */ diff --git a/packages/types/src/zod/complex.zod.ts b/packages/types/src/zod/complex.zod.ts index f1e04006fa..9357abee6f 100644 --- a/packages/types/src/zod/complex.zod.ts +++ b/packages/types/src/zod/complex.zod.ts @@ -122,7 +122,7 @@ export const FilterOperatorSchema = z.enum([ /** * Filter Condition Schema */ -export const FilterConditionSchema: z.ZodType = z.lazy(() => +export const FilterBuilderConditionSchema: z.ZodType = z.lazy(() => z.object({ field: z.string().describe('Field name'), operator: FilterOperatorSchema.describe('Filter operator'), @@ -136,7 +136,7 @@ export const FilterConditionSchema: z.ZodType = z.lazy(() => export const FilterGroupSchema: z.ZodType = z.lazy(() => z.object({ operator: z.enum(['and', 'or']).describe('Group operator'), - conditions: z.array(z.union([FilterConditionSchema, FilterGroupSchema])).describe('Conditions or sub-groups'), + conditions: z.array(z.union([FilterBuilderConditionSchema, FilterGroupSchema])).describe('Conditions or sub-groups'), }) ); @@ -160,8 +160,8 @@ export const FilterFieldSchema = z.object({ export const FilterBuilderSchema = BaseSchema.extend({ type: z.literal('filter-builder'), fields: z.array(FilterFieldSchema).describe('Available filter fields'), - defaultValue: z.union([FilterConditionSchema, FilterGroupSchema]).optional().describe('Default filter value'), - value: z.union([FilterConditionSchema, FilterGroupSchema]).optional().describe('Controlled filter value'), + defaultValue: z.union([FilterBuilderConditionSchema, FilterGroupSchema]).optional().describe('Default filter value'), + value: z.union([FilterBuilderConditionSchema, FilterGroupSchema]).optional().describe('Controlled filter value'), onChange: z.function().optional().describe('Change handler'), allowGroups: z.boolean().optional().describe('Allow grouped conditions'), maxDepth: z.number().optional().describe('Maximum nesting depth'), diff --git a/packages/types/src/zod/form.zod.ts b/packages/types/src/zod/form.zod.ts index 9976e68052..cdfb732a03 100644 --- a/packages/types/src/zod/form.zod.ts +++ b/packages/types/src/zod/form.zod.ts @@ -68,7 +68,7 @@ export const CommandGroupSchema = z.object({ /** * Validation Rule Schema */ -export const ValidationRuleSchema = z.object({ +export const FieldConstraintsSchema = z.object({ required: z.boolean().optional().describe('Whether field is required'), minLength: z.number().optional().describe('Minimum length'), maxLength: z.number().optional().describe('Maximum length'), @@ -382,7 +382,7 @@ export const FormFieldSchema = z.object({ disabled: z.boolean().optional().describe('Disabled flag'), placeholder: z.string().optional().describe('Placeholder text'), options: z.array(SelectOptionSchema).optional().describe('Options for select/radio'), - validation: ValidationRuleSchema.optional().describe('Validation rules'), + validation: FieldConstraintsSchema.optional().describe('Validation rules'), condition: FieldConditionSchema.optional().describe('Conditional display'), colSpan: z.number().optional().describe('Column span in grid layout'), }); diff --git a/packages/types/src/zod/index.zod.ts b/packages/types/src/zod/index.zod.ts index d0daf99f18..cfa9295266 100644 --- a/packages/types/src/zod/index.zod.ts +++ b/packages/types/src/zod/index.zod.ts @@ -65,7 +65,7 @@ export { // ============================================================================ export { DivSchema, - SpanSchema, + TextSpanSchema, TextSchema, ImageSchema, IconSchema, @@ -98,7 +98,7 @@ export { ComboboxOptionSchema, CommandItemSchema, CommandGroupSchema, - ValidationRuleSchema, + FieldConstraintsSchema, FieldConditionSchema, ButtonSchema, InputSchema, @@ -219,7 +219,7 @@ export { CalendarEventSchema, CalendarViewSchema, FilterOperatorSchema, - FilterConditionSchema, + FilterBuilderConditionSchema, FilterGroupSchema, FilterFieldSchema, FilterBuilderSchema, @@ -290,7 +290,6 @@ export { ZIndexSchema, ThemeModeSchema, ThemeDefinitionSchema, - ThemeSchema, ThemeComponentSchema, ThemeUnionSchema, ThemeSwitcherSchema, @@ -307,10 +306,10 @@ export { ReportSectionSchema, ReportScheduleSchema, ReportExportConfigSchema, - ReportSchema, + ReportComponentSchema, ReportBuilderSchema, ReportViewerSchema, - ReportComponentSchema, + ReportUnionSchema, } from './reports.zod.js'; export { @@ -355,7 +354,7 @@ import { ComplexSchema } from './complex.zod.js'; import { ObjectQLComponentSchema } from './objectql.zod.js'; import { CRUDComponentSchema } from './crud.zod.js'; import { ThemeUnionSchema } from './theme.zod.js'; -import { ReportComponentSchema } from './reports.zod.js'; +import { ReportUnionSchema } from './reports.zod.js'; import { BlockComponentSchema } from './blocks.zod.js'; import { ViewComponentSchema } from './views.zod.js'; @@ -376,7 +375,7 @@ export const AnyComponentSchema = z.union([ ObjectQLComponentSchema, CRUDComponentSchema, ThemeUnionSchema, - ReportComponentSchema, + ReportUnionSchema, BlockComponentSchema, ViewComponentSchema, ]); diff --git a/packages/types/src/zod/layout.zod.ts b/packages/types/src/zod/layout.zod.ts index 6e32c9545f..dbe535a4e9 100644 --- a/packages/types/src/zod/layout.zod.ts +++ b/packages/types/src/zod/layout.zod.ts @@ -35,7 +35,7 @@ export const DivSchema = BaseSchema.extend({ /** * Span Schema - Inline text container */ -export const SpanSchema = BaseSchema.extend({ +export const TextSpanSchema = BaseSchema.extend({ type: z.literal('span'), value: z.string().optional().describe('Text content'), children: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional(), @@ -329,7 +329,7 @@ export const PageSchema = BaseSchema.extend(SpecPageFields.shape).extend({ */ export const LayoutSchema = z.discriminatedUnion('type', [ DivSchema, - SpanSchema, + TextSpanSchema, TextSchema, ImageSchema, IconSchema, diff --git a/packages/types/src/zod/reports.zod.ts b/packages/types/src/zod/reports.zod.ts index 91017faa0d..ef429fc983 100644 --- a/packages/types/src/zod/reports.zod.ts +++ b/packages/types/src/zod/reports.zod.ts @@ -127,7 +127,7 @@ export const ReportExportConfigSchema = z.object({ /** * Report Schema */ -export const ReportSchema = BaseSchema.extend({ +export const ReportComponentSchema = BaseSchema.extend({ type: z.literal('report'), title: z.string().optional().describe('Report title'), description: z.string().optional().describe('Report description'), @@ -152,7 +152,7 @@ export const ReportSchema = BaseSchema.extend({ */ export const ReportBuilderSchema = BaseSchema.extend({ type: z.literal('report-builder'), - report: ReportSchema.optional().describe('Initial report configuration'), + report: ReportComponentSchema.optional().describe('Initial report configuration'), dataSources: z.array(z.any()).optional().describe('Available data sources'), availableFields: z.array(ReportFieldSchema).optional().describe('Available fields'), showPreview: z.boolean().optional().describe('Show preview'), @@ -165,7 +165,7 @@ export const ReportBuilderSchema = BaseSchema.extend({ */ export const ReportViewerSchema = BaseSchema.extend({ type: z.literal('report-viewer'), - report: ReportSchema.optional().describe('Report to display'), + report: ReportComponentSchema.optional().describe('Report to display'), data: z.array(z.any()).optional().describe('Report data'), showToolbar: z.boolean().optional().describe('Show toolbar'), allowExport: z.boolean().optional().describe('Allow export'), @@ -176,8 +176,8 @@ export const ReportViewerSchema = BaseSchema.extend({ /** * Union of all report schemas */ -export const ReportComponentSchema = z.discriminatedUnion('type', [ - ReportSchema, +export const ReportUnionSchema = z.discriminatedUnion('type', [ + ReportComponentSchema, ReportBuilderSchema, ReportViewerSchema, ]); @@ -194,6 +194,6 @@ export type ReportGroupBySchemaType = z.infer; export type ReportSectionSchemaType = z.infer; export type ReportScheduleSchemaType = z.infer; export type ReportExportConfigSchemaType = z.infer; -export type ReportSchemaType = z.infer; +export type ReportComponentSchemaType = z.infer; export type ReportBuilderSchemaType = z.infer; export type ReportViewerSchemaType = z.infer; diff --git a/packages/types/src/zod/theme.zod.ts b/packages/types/src/zod/theme.zod.ts index d92681c0e9..689c66c6ba 100644 --- a/packages/types/src/zod/theme.zod.ts +++ b/packages/types/src/zod/theme.zod.ts @@ -123,12 +123,6 @@ export const ThemePreviewSchema = BaseSchema.extend({ showComponents: z.boolean().optional().describe('Show component samples'), }); -/** - * Legacy alias — use ThemeComponentSchema - * @deprecated - */ -export const ThemeSchema = ThemeComponentSchema; - /** * Union of all theme component schemas (for AnyComponentSchema union). */ @@ -149,6 +143,6 @@ export type AnimationSchemaType = z.infer; export type ZIndexSchemaType = z.infer; export type ThemeModeSchemaType = z.infer; export type ThemeDefinitionSchemaType = z.infer; -export type ThemeSchemaType = z.infer; +export type ThemeComponentSchemaType = z.infer; export type ThemeSwitcherSchemaType = z.infer; export type ThemePreviewSchemaType = z.infer; diff --git a/scripts/check-spec-symbol-derivation.mjs b/scripts/check-spec-symbol-derivation.mjs index 889f286405..578c2e942b 100644 --- a/scripts/check-spec-symbol-derivation.mjs +++ b/scripts/check-spec-symbol-derivation.mjs @@ -134,8 +134,6 @@ const DEBT = { "ActionParam", "AppContextSelectorSchema", "AppSchema", - "BatchOperationResult", - "CacheStrategy", "ChartSeries", "ChartSeriesSchema", "ConditionalValidation", @@ -146,24 +144,17 @@ const DEBT = { "DashboardWidgetSchema", "DatasourceSchema", "DriverInterface", - "EventHandler", - "ExpressionSchema", "FileMetadata", - "FilterCondition", - "FilterConditionSchema", - "FilterOperator", "FormField", "FormFieldSchema", "FormatValidation", "GestureConfig", "GestureType", "GlobalFilterSchema", - "GroupByNode", "ImportRowResult", "JoinNode", "JoinedReportBlock", "ListViewSchema", - "MutationEvent", "NavigationArea", "NavigationAreaSchema", "NavigationItem", @@ -175,19 +166,13 @@ const DEBT = { "PageSchema", "QueryAST", "QuerySchema", - "ReportSchedule", - "ReportSchema", "ResponsiveConfig", "ScriptValidation", "SelectOption", "SelectOptionSchema", "SharingRule", - "SpanSchema", "StateMachineValidation", "Theme", - "ThemeSchema", - "ValidationRule", - "ValidationRuleSchema", "WidgetManifest", "WidgetSource", ],