best-lowcode-runtime 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dev.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lowcode/schema.ts", "../src/lowcode/validate.ts", "../src/lowcode/dev.ts"],
4
- "sourcesContent": ["import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import type {\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n CrudPageSchema,\n FieldSchema,\n PageActionSchema\n} from './schema'\nimport type { SchemaDiagnostic, SchemaValidationResult } from './validate'\nimport { validateCrudPageSchema } from './validate'\n\nconst builtInCapabilities = [\n 'builtin.effect.openCreate',\n 'builtin.effect.openDetail',\n 'builtin.effect.openEdit',\n 'builtin.effect.remove',\n 'builtin.effect.runAction',\n 'builtin.effect.slot',\n 'builtin.format.date',\n 'builtin.format.datetime',\n 'builtin.format.money',\n 'builtin.format.text',\n 'builtin.field.input',\n 'builtin.field.number',\n 'builtin.field.select',\n 'builtin.field.remoteSelect',\n 'builtin.field.date',\n 'builtin.field.dateRange',\n 'builtin.field.textarea',\n 'builtin.field.slot',\n 'builtin.field.repeatable'\n] as const\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction arrayOfRecords(value: unknown): JsonRecord[] | undefined {\n return Array.isArray(value) && value.every(isRecord) ? value : undefined\n}\n\nfunction diagnostic(path: string, code: string, message: string): SchemaDiagnostic {\n return { path, code, message }\n}\n\nfunction validateUnknownShape(candidate: unknown): SchemaDiagnostic[] {\n if (!isRecord(candidate)) return [diagnostic('', 'schema.type', 'Schema \u5FC5\u987B\u662F JSON \u5BF9\u8C61')]\n const diagnostics: SchemaDiagnostic[] = []\n if (!isRecord(candidate.dataSource))\n diagnostics.push(diagnostic('/dataSource', 'dataSource.type', 'dataSource \u5FC5\u987B\u662F\u5BF9\u8C61'))\n if (!isRecord(candidate.table))\n diagnostics.push(diagnostic('/table', 'table.type', 'table \u5FC5\u987B\u662F\u5BF9\u8C61'))\n for (const key of ['search', 'form'] as const) {\n if (candidate[key] !== undefined && !arrayOfRecords(candidate[key])) {\n diagnostics.push(diagnostic(`/${key}`, 'field.list', `${key} \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4`))\n }\n }\n if (isRecord(candidate.table)) {\n if (!arrayOfRecords(candidate.table.columns)) {\n diagnostics.push(diagnostic('/table/columns', 'column.list', 'columns \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n if (candidate.table.actions !== undefined && !arrayOfRecords(candidate.table.actions)) {\n diagnostics.push(diagnostic('/table/actions', 'action.list', 'actions \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n }\n if (candidate.toolbar !== undefined && !arrayOfRecords(candidate.toolbar)) {\n diagnostics.push(diagnostic('/toolbar', 'action.list', 'toolbar \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n return diagnostics\n}\n\nfunction toRuntimeSchema(candidate: JsonRecord): CrudPageSchema {\n return {\n $schema: candidate.$schema as typeof CRUD_SCHEMA_ID,\n version: candidate.version as typeof CRUD_SCHEMA_VERSION,\n id: candidate.id as string,\n kind: candidate.kind as 'crud',\n title: candidate.title as string,\n dataSource: candidate.dataSource as CrudPageSchema['dataSource'],\n search: candidate.search as FieldSchema[] | undefined,\n searchMode: candidate.searchMode as CrudPageSchema['searchMode'],\n form: candidate.form as FieldSchema[] | undefined,\n table: candidate.table as CrudPageSchema['table'],\n detail: candidate.detail as CrudPageSchema['detail'],\n toolbar: candidate.toolbar as PageActionSchema[] | undefined,\n meta: candidate.meta as CrudPageSchema['meta']\n }\n}\n\n/**\n * Server-safe development entry. It accepts unknown JSON from CLI/MCP before delegating to the\n * runtime validator, so untrusted candidates cannot trigger assumptions in typed runtime code.\n */\nexport function validateUnknownCrudPageSchema(candidate: unknown): SchemaValidationResult {\n const shapeDiagnostics = validateUnknownShape(candidate)\n if (shapeDiagnostics.length || !isRecord(candidate)) {\n return { valid: false, diagnostics: shapeDiagnostics }\n }\n return validateCrudPageSchema(toRuntimeSchema(candidate))\n}\n\n/** Serializable capabilities supplied by the current runtime without application Manifest entries. */\nexport function getBuiltinCapabilities(): string[] {\n return [...builtInCapabilities]\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import type {\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n CrudPageSchema,\n FieldSchema,\n PageActionSchema\n} from './schema'\nimport type { SchemaDiagnostic, SchemaValidationResult } from './validate'\nimport { validateCrudPageSchema } from './validate'\n\nconst builtInCapabilities = [\n 'builtin.effect.openCreate',\n 'builtin.effect.openDetail',\n 'builtin.effect.openEdit',\n 'builtin.effect.remove',\n 'builtin.effect.runAction',\n 'builtin.effect.slot',\n 'builtin.format.date',\n 'builtin.format.datetime',\n 'builtin.format.money',\n 'builtin.format.text',\n 'builtin.field.input',\n 'builtin.field.number',\n 'builtin.field.select',\n 'builtin.field.remoteSelect',\n 'builtin.field.date',\n 'builtin.field.dateRange',\n 'builtin.field.textarea',\n 'builtin.field.slot',\n 'builtin.field.repeatable'\n] as const\n\ntype JsonRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction arrayOfRecords(value: unknown): JsonRecord[] | undefined {\n return Array.isArray(value) && value.every(isRecord) ? value : undefined\n}\n\nfunction diagnostic(path: string, code: string, message: string): SchemaDiagnostic {\n return { path, code, message }\n}\n\nfunction validateUnknownShape(candidate: unknown): SchemaDiagnostic[] {\n if (!isRecord(candidate)) return [diagnostic('', 'schema.type', 'Schema \u5FC5\u987B\u662F JSON \u5BF9\u8C61')]\n const diagnostics: SchemaDiagnostic[] = []\n if (!isRecord(candidate.dataSource))\n diagnostics.push(diagnostic('/dataSource', 'dataSource.type', 'dataSource \u5FC5\u987B\u662F\u5BF9\u8C61'))\n if (!isRecord(candidate.table))\n diagnostics.push(diagnostic('/table', 'table.type', 'table \u5FC5\u987B\u662F\u5BF9\u8C61'))\n for (const key of ['search', 'form'] as const) {\n if (candidate[key] !== undefined && !arrayOfRecords(candidate[key])) {\n diagnostics.push(diagnostic(`/${key}`, 'field.list', `${key} \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4`))\n }\n }\n if (isRecord(candidate.table)) {\n if (!arrayOfRecords(candidate.table.columns)) {\n diagnostics.push(diagnostic('/table/columns', 'column.list', 'columns \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n if (candidate.table.actions !== undefined && !arrayOfRecords(candidate.table.actions)) {\n diagnostics.push(diagnostic('/table/actions', 'action.list', 'actions \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n }\n if (candidate.toolbar !== undefined && !arrayOfRecords(candidate.toolbar)) {\n diagnostics.push(diagnostic('/toolbar', 'action.list', 'toolbar \u5FC5\u987B\u662F\u5BF9\u8C61\u6570\u7EC4'))\n }\n return diagnostics\n}\n\nfunction toRuntimeSchema(candidate: JsonRecord): CrudPageSchema {\n return {\n $schema: candidate.$schema as typeof CRUD_SCHEMA_ID,\n version: candidate.version as typeof CRUD_SCHEMA_VERSION,\n id: candidate.id as string,\n kind: candidate.kind as 'crud',\n title: candidate.title as string,\n dataSource: candidate.dataSource as CrudPageSchema['dataSource'],\n search: candidate.search as FieldSchema[] | undefined,\n searchMode: candidate.searchMode as CrudPageSchema['searchMode'],\n form: candidate.form as FieldSchema[] | undefined,\n table: candidate.table as CrudPageSchema['table'],\n detail: candidate.detail as CrudPageSchema['detail'],\n toolbar: candidate.toolbar as PageActionSchema[] | undefined,\n meta: candidate.meta as CrudPageSchema['meta']\n }\n}\n\n/**\n * Server-safe development entry. It accepts unknown JSON from CLI/MCP before delegating to the\n * runtime validator, so untrusted candidates cannot trigger assumptions in typed runtime code.\n */\nexport function validateUnknownCrudPageSchema(candidate: unknown): SchemaValidationResult {\n const shapeDiagnostics = validateUnknownShape(candidate)\n if (shapeDiagnostics.length || !isRecord(candidate)) {\n return { valid: false, diagnostics: shapeDiagnostics }\n }\n return validateCrudPageSchema(toRuntimeSchema(candidate))\n}\n\n/** Serializable capabilities supplied by the current runtime without application Manifest entries. */\nexport function getBuiltinCapabilities(): string[] {\n return [...builtInCapabilities]\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -1184,6 +1184,8 @@ function createLatestPageRequest(service, onError) {
1184
1184
  // src/lowcode/schema.ts
1185
1185
  var CRUD_SCHEMA_ID = "https://best.dev/schema/crud/v1";
1186
1186
  var CRUD_SCHEMA_VERSION = 1;
1187
+ var TABBED_PAGE_SCHEMA_ID = "https://best.dev/schema/tabs/v1";
1188
+ var TABBED_PAGE_SCHEMA_VERSION = 1;
1187
1189
 
1188
1190
  // src/lowcode/validate.ts
1189
1191
  var fieldComponents = /* @__PURE__ */ new Set([
@@ -1443,6 +1445,45 @@ function assertValidCrudPageSchema(schema, registry) {
1443
1445
  ${message2}`);
1444
1446
  }
1445
1447
  }
1448
+ function validateTabbedPageSchema(schema, registry) {
1449
+ const diagnostics = [];
1450
+ if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)
1451
+ push(diagnostics, "/$schema", "schema.id", `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`);
1452
+ if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)
1453
+ push(diagnostics, "/version", "schema.version", `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`);
1454
+ if (!schema.id) push(diagnostics, "/id", "page.id", "\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A");
1455
+ if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {
1456
+ push(diagnostics, "/tabs", "tabs.required", "\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E");
1457
+ return { valid: false, diagnostics };
1458
+ }
1459
+ const keys = /* @__PURE__ */ new Set();
1460
+ schema.tabs.forEach((tab, index) => {
1461
+ const path = `/tabs/${index}`;
1462
+ if (!tab.key) push(diagnostics, path, "tab.key", "\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A");
1463
+ if (keys.has(tab.key)) push(diagnostics, path, "tab.duplicate", `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`);
1464
+ keys.add(tab.key);
1465
+ if (!tab.label) push(diagnostics, path, "tab.label", "\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A");
1466
+ if (tab.content.type === "crud") {
1467
+ const result = validateCrudPageSchema(tab.content.schema, registry);
1468
+ diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })));
1469
+ } else if (tab.content.type === "slot") {
1470
+ if (!tab.content.slot) push(diagnostics, path, "tab.slot", "slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key");
1471
+ if (tab.content.slot && registry && !registry.slots[tab.content.slot])
1472
+ push(diagnostics, path, "registry.slot", `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`);
1473
+ } else {
1474
+ push(diagnostics, path, "tab.content", "\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B");
1475
+ }
1476
+ });
1477
+ return { valid: diagnostics.length === 0, diagnostics };
1478
+ }
1479
+ function assertValidTabbedPageSchema(schema, registry) {
1480
+ const result = validateTabbedPageSchema(schema, registry);
1481
+ if (!result.valid) {
1482
+ const message2 = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join("\n");
1483
+ throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A
1484
+ ${message2}`);
1485
+ }
1486
+ }
1446
1487
 
1447
1488
  // src/lowcode/BestCrudPage.tsx
1448
1489
  import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
@@ -1839,7 +1880,7 @@ function BestCrudPage({ adapter, className, schema }) {
1839
1880
  }
1840
1881
  ),
1841
1882
  /* @__PURE__ */ jsxs4(
1842
- BestDrawer,
1883
+ BestModal,
1843
1884
  {
1844
1885
  open: drawer.mode !== "closed",
1845
1886
  title: drawer.mode === "detail" ? `${schema.title}\u8BE6\u60C5` : drawer.mode === "edit" ? `\u7F16\u8F91${schema.title}` : `\u65B0\u5EFA${schema.title}`,
@@ -1894,6 +1935,21 @@ function BestCrudPage({ adapter, className, schema }) {
1894
1935
  );
1895
1936
  }
1896
1937
  }
1938
+
1939
+ // src/lowcode/BestTabbedPage.tsx
1940
+ import { Tabs } from "antd";
1941
+ import { jsx as jsx12 } from "react/jsx-runtime";
1942
+ function BestTabbedPage({ className, schema }) {
1943
+ const registry = useBestRegistry();
1944
+ assertValidTabbedPageSchema(schema, registry);
1945
+ const items = schema.tabs.filter((tab) => !tab.access || registry.access(tab.access)).map((tab) => ({
1946
+ key: tab.key,
1947
+ label: tab.label,
1948
+ destroyOnHidden: tab.destroyOnHidden,
1949
+ children: tab.content.type === "crud" ? /* @__PURE__ */ jsx12(BestCrudPage, { schema: tab.content.schema }) : registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null
1950
+ }));
1951
+ return /* @__PURE__ */ jsx12(Tabs, { className, items });
1952
+ }
1897
1953
  export {
1898
1954
  BestBatchInput,
1899
1955
  BestCrudPage,
@@ -1908,10 +1964,14 @@ export {
1908
1964
  BestModal,
1909
1965
  BestProvider,
1910
1966
  BestSearch,
1967
+ BestTabbedPage,
1911
1968
  BestTable,
1912
1969
  CRUD_SCHEMA_ID,
1913
1970
  CRUD_SCHEMA_VERSION,
1971
+ TABBED_PAGE_SCHEMA_ID,
1972
+ TABBED_PAGE_SCHEMA_VERSION,
1914
1973
  assertValidCrudPageSchema,
1974
+ assertValidTabbedPageSchema,
1915
1975
  composeBestRegistry,
1916
1976
  createBestCrudAdapter,
1917
1977
  createBestRegistry,
@@ -1922,6 +1982,7 @@ export {
1922
1982
  useBestListService,
1923
1983
  useBestRegistry,
1924
1984
  useBestService,
1925
- validateCrudPageSchema
1985
+ validateCrudPageSchema,
1986
+ validateTabbedPageSchema
1926
1987
  };
1927
1988
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/lowcode/adapter.ts", "../src/lowcode/BestCrudPage.tsx", "../src/runtime/BestProvider.tsx", "../src/ui/BestBatchInput.tsx", "../src/ui/BestDetail.tsx", "../src/ui/BestFilePreview.tsx", "../src/ui/BestForm.tsx", "../src/ui/BestLightTable.tsx", "../src/ui/BestOverlay.tsx", "../src/ui/BestSearch.tsx", "../src/ui/BestStates.tsx", "../src/ui/BestTable.tsx", "../src/lowcode/runtime.ts", "../src/lowcode/schema.ts", "../src/lowcode/validate.ts"],
4
- "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n BestDrawer,\n type BestFieldDefinition,\n BestForm,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { getDefaultValues } from '../ui/BestForm'\nimport {\n confirmBeforeAction,\n createLatestPageRequest,\n errorMessage,\n formatCrudValue,\n removeCrudRecord,\n toBestListQuery\n} from './runtime'\nimport type {\n CrudPageSchema,\n DetailFieldSchema,\n FieldSchema,\n FormMode,\n PageActionSchema,\n TableColumnSchema\n} from './schema'\nimport { assertValidCrudPageSchema } from './validate'\n\ntype RecordValue = Record<string, unknown>\n\nexport type BestCrudPageProps = {\n className?: string\n schema: CrudPageSchema\n adapter?: CrudDataAdapter\n}\n\nexport type CrudDataAdapter = {\n fromList?: (records: RecordValue[]) => RecordValue[]\n fromDetail?: (record: RecordValue) => RecordValue\n toCreatePayload?: (values: RecordValue) => RecordValue\n toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue\n}\n\ntype DrawerState = { mode: 'closed' } | { mode: 'detail' | 'edit' | 'create'; record?: RecordValue }\n\nfunction pickRowKeyValues(record: RecordValue | undefined, rowKey: string | string[]) {\n if (!record) return {}\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n return Object.fromEntries(\n keys.flatMap((key) => {\n const value = record[key]\n return value === undefined ? [] : [[key, value] as const]\n })\n )\n}\n\nfunction projectSubmittedValues(values: RecordValue, fields: FieldSchema[]) {\n const projected: RecordValue = {}\n fields.forEach((field) => {\n if (!Object.hasOwn(values, field.field)) return\n const value = values[field.field]\n if (field.component === 'repeatable' && Array.isArray(value) && field.itemFields?.length) {\n projected[field.field] = value.map((item) =>\n isRecord(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item\n )\n return\n }\n projected[field.field] = value\n })\n return projected\n}\n\nexport function buildCrudSubmitValues(\n values: RecordValue,\n record: RecordValue | undefined,\n rowKey: string | string[]\n) {\n return { ...values, ...pickRowKeyValues(record, rowKey) }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction mergeRecordForEdit(\n record: RecordValue | undefined,\n detail: RecordValue,\n rowKey: string | string[]\n) {\n return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail\n}\n\nfunction toFieldDefinition(\n field: FieldSchema,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestFieldDefinition {\n const slot = field.slot\n const options = field.dict ? (dictionaries[field.dict] ?? []) : []\n const rules = field.rules ?? []\n return {\n field: field.field,\n label: field.label,\n component: field.component,\n placeholder: field.placeholder,\n options,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n required: field.required,\n disabled: field.disabled,\n hidden: field.hidden,\n maxDate: field.maxDate,\n span: field.span,\n defaultValue: field.defaultValue,\n visibleWhen: field.visibleWhen,\n disabledWhen: field.disabledWhen,\n clearWhenHidden: field.clearWhenHidden,\n itemFields: field.itemFields?.map((item) =>\n toFieldDefinition(item as FieldSchema, dictionaries, slots)\n ),\n minItems: field.minItems,\n maxItems: field.maxItems,\n render: slot ? (context) => slots[slot]?.(context) : undefined,\n rules:\n field.required && !rules.some((rule) => rule.required)\n ? [{ required: true, message: `\u8BF7\u586B\u5199${field.label}` }, ...rules]\n : rules\n }\n}\n\nfunction useFields(fields: FieldSchema[] = []) {\n const registry = useBestRegistry()\n return fields.map((field) => toFieldDefinition(field, registry.dictionaries, registry.slots))\n}\n\nfunction toDetailField(\n field: DetailFieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestDetailField {\n const slot = field.slot\n const valueEnum = field.dict\n ? Object.fromEntries(\n (dictionary[field.dict] ?? []).map((item) => [String(item.value), item.label])\n )\n : undefined\n return {\n field: field.field,\n label: field.label,\n span: field.span,\n valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\n}\n\nfunction toTableColumn(\n column: TableColumnSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestTableColumn<RecordValue> {\n const slot = column.slot\n const valueEnum = column.dict\n ? Object.fromEntries(\n (dictionary[column.dict] ?? []).map((item) => [String(item.value), { text: item.label }])\n )\n : undefined\n return {\n dataIndex: column.field,\n search: false,\n title: column.title,\n width: column.width,\n fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: record[column.field]\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [submitting, setSubmitting] = useState(false)\n const submittingRef = useRef(false)\n\n const handleAction = useCallback(\n async (action: PageActionSchema, record?: RecordValue) => {\n if (action.access && !registry.access(action.access)) return\n if (action.effect !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') setDrawer({ mode: 'detail', record })\n if (action.effect === 'openEdit') {\n let editRecord = record\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`)\n return\n }\n try {\n const detail = await detailService(record ?? {})\n if (detail && typeof detail === 'object' && !Array.isArray(detail)) {\n const normalizedDetail = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\n editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey)\n }\n } catch (error) {\n message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n return\n }\n }\n setDrawer({ mode: 'edit', record: editRecord })\n }\n if (action.effect === 'openCreate') setDrawer({ mode: 'create' })\n if (action.effect === 'remove' && schema.dataSource.remove) {\n const removeService = registry.services[schema.dataSource.remove]\n if (!removeService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`)\n return\n }\n try {\n const deleted = await removeCrudRecord(\n record ?? {},\n removeService,\n action.confirm ?? `\u786E\u8BA4\u5220\u9664${schema.title}\uFF1F`,\n confirmAction\n )\n if (deleted) {\n message.success('\u5220\u9664\u6210\u529F')\n actionRef.current?.reload()\n }\n } catch (error) {\n message.error(errorMessage(error, '\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n }\n }\n if (action.effect === 'runAction' && action.action) {\n const runAction = registry.actions[action.action]\n if (!runAction) {\n message.error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n return\n }\n try {\n await runAction({ record })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, `${action.label}\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n }\n }\n },\n [adapter, registry, schema]\n )\n\n const columns = useMemo<BestTableColumn<RecordValue>[]>(() => {\n const proTableSearchFields = useBestSearch ? [] : (schema.search ?? [])\n const searchColumns = new Map(\n proTableSearchFields.map((field) => [\n field.field,\n toProTableSearchColumn(field, registry.dictionaries)\n ])\n )\n const configuredColumns = schema.table.columns.map((column) => {\n const tableColumn = toTableColumn(column, registry.dictionaries, registry.slots)\n const searchColumn = searchColumns.get(column.field)\n if (!searchColumn) return tableColumn\n searchColumns.delete(column.field)\n return { ...tableColumn, ...searchColumn, hideInTable: false }\n })\n configuredColumns.push(...searchColumns.values())\n if (!schema.table.actions?.length) return configuredColumns\n const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n <BestDrawer\n open={drawer.mode !== 'closed'}\n title={\n drawer.mode === 'detail'\n ? `${schema.title}\u8BE6\u60C5`\n : drawer.mode === 'edit'\n ? `\u7F16\u8F91${schema.title}`\n : `\u65B0\u5EFA${schema.title}`\n }\n onClose={() => setDrawer({ mode: 'closed' })}\n >\n {drawer.mode === 'detail' ? (\n <BestDetail\n fields={\n schema.detail?.fields.map((field) =>\n toDetailField(field, registry.dictionaries, registry.slots)\n ) ?? []\n }\n record={drawer.record}\n />\n ) : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? (\n <BestForm\n fields={formFields}\n initialValues={drawer.record}\n loading={submitting}\n mode={drawer.mode as FormMode}\n onCancel={() => setDrawer({ mode: 'closed' })}\n onSubmit={(values) => {\n void submitForm(values)\n }}\n />\n ) : null}\n </BestDrawer>\n </>\n )\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, useContext, useMemo } from 'react'\nimport type { BestListService } from '../lowcode/list'\n\nexport type BestDictionaryItem = { label: string; value: string | number; disabled?: boolean }\nexport type BestService = (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n) => Promise<unknown>\nexport type BestSlotContext = {\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\n\nexport type BestRegistry = {\n /** List services use the stable low-code pagination contract. */\n listServices: Record<string, BestListService>\n /** Command services, such as create, update and remove. */\n services: Record<string, BestService>\n dictionaries: Record<string, BestDictionaryItem[]>\n actions: Record<string, BestAction>\n slots: Record<string, BestSlot>\n access: (key: string) => boolean\n}\n\nexport type BestProviderProps = {\n children: ReactNode\n registry?: Partial<Omit<BestRegistry, 'access'>> & { access?: BestRegistry['access'] }\n theme?: ThemeConfig\n}\n\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\n}\n\nconst emptyRegistry: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: () => true\n}\n\nconst defaultTheme: ThemeConfig = {\n token: {\n borderRadius: 6,\n controlHeight: 32,\n fontSize: 14\n }\n}\n\nconst BestRuntimeContext = createContext<BestRegistry>(emptyRegistry)\n\nexport function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const value = useMemo(() => createBestRegistry(registry), [registry])\n const mergedTheme = useMemo<ThemeConfig>(\n () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),\n [theme]\n )\n return (\n <BestRuntimeContext.Provider value={value}>\n <ConfigProvider theme={mergedTheme}>{children}</ConfigProvider>\n </BestRuntimeContext.Provider>\n )\n}\n\nexport function useBestRegistry() {\n return useContext(BestRuntimeContext)\n}\n\nexport function useBestService(key: string): BestService {\n const service = useBestRegistry().services[key]\n if (!service) throw new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${key}`)\n return service\n}\n\nexport function useBestListService(key: string): BestListService | undefined {\n return useBestRegistry().listServices[key]\n}\n\nexport function useBestAccess(key?: string): boolean {\n const registry = useBestRegistry()\n return key ? registry.access(key) : true\n}\n\nexport function useBestDictionary(key?: string): BestDictionaryItem[] {\n const dictionaries = useBestRegistry().dictionaries\n return key ? (dictionaries[key] ?? []) : []\n}\n\nexport function useBestAction(key: string): BestAction {\n const action = useBestRegistry().actions[key]\n if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`)\n return action\n}\n", "import { Input } from 'antd'\nimport type { TextAreaProps } from 'antd/es/input'\nimport { useImperativeHandle, useMemo, useState } from 'react'\n\nexport type BestBatchInputRef = {\n getParsedValue: () => string[][]\n}\n\nexport type BestBatchInputProps = Omit<TextAreaProps, 'onChange'> & {\n ref?: React.Ref<BestBatchInputRef>\n separator?: string\n onChange?: (value: string, parsed: string[][]) => void\n}\n\nfunction parse(value: string, separator: string) {\n const escaped = separator.replace(/[\\\\\\]\\-^]/g, '\\\\$&')\n const delimiter = new RegExp(`[${escaped}]`)\n return value\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .map((row) => row.split(delimiter).map((cell) => cell.trim()))\n}\n\nexport function BestBatchInput({\n ref,\n separator = '|',\n value,\n defaultValue,\n onChange,\n ...props\n}: BestBatchInputProps) {\n const [innerValue, setInnerValue] = useState(String(defaultValue ?? ''))\n const currentValue = value == null ? innerValue : String(value)\n const parsed = useMemo(() => parse(currentValue, separator), [currentValue, separator])\n\n useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed])\n\n return (\n <Input.TextArea\n {...props}\n value={currentValue}\n onChange={(event) => {\n const nextValue = event.target.value\n if (value == null) setInnerValue(nextValue)\n onChange?.(nextValue, parse(nextValue, separator))\n }}\n />\n )\n}\n", "import { Descriptions } from 'antd'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n}\n\nexport function BestDetail({ fields, record = {}, column = 2 }: BestDetailProps) {\n return (\n <Descriptions bordered column={column} size='small'>\n {fields.map((field) => {\n const value = getPathValue(record, field.field)\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ??\n (value == null || value === '' ? '-' : String(value)))\n return (\n <Descriptions.Item key={field.field} label={field.label} span={field.span}>\n {display}\n </Descriptions.Item>\n )\n })}\n </Descriptions>\n )\n}\n\nfunction getPathValue(values: Record<string, unknown>, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') {\n return (current as Record<string, unknown>)[part]\n }\n return undefined\n }, values)\n}\n", "import { Button, Image, List, Typography } from 'antd'\n\nexport type BestFileItem = {\n url: string\n name?: string\n mimeType?: string\n}\n\nexport type BestFilePreviewProps = {\n files: BestFileItem[]\n onDownload?: (file: BestFileItem) => void\n}\n\nfunction isImage(file: BestFileItem) {\n return (\n file.mimeType?.startsWith('image/') ||\n /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(?:$|[?#])/i.test(file.url)\n )\n}\n\nexport function BestFilePreview({ files, onDownload }: BestFilePreviewProps) {\n return (\n <List\n dataSource={files}\n renderItem={(file) => (\n <List.Item\n actions={[\n <Button key='download' type='link' onClick={() => onDownload?.(file)}>\n \u4E0B\u8F7D\n </Button>\n ]}\n >\n {isImage(file) ? (\n <Image alt={file.name ?? '\u6587\u4EF6\u9884\u89C8'} height={48} preview src={file.url} width={48} />\n ) : null}\n <Typography.Text ellipsis style={{ marginInlineStart: isImage(file) ? 12 : 0 }}>\n {file.name ?? file.url}\n </Typography.Text>\n </List.Item>\n )}\n />\n )\n}\n", "import type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n}\n\nexport function BestDrawer({ children, open, title, onClose }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={640} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose }: OverlayProps) {\n return (\n <Modal destroyOnHidden footer={null} open={open} title={title} onCancel={onClose}>\n {children}\n </Modal>\n )\n}\n", "import type { FormInstance } from 'antd'\nimport { Button, Col, DatePicker, Form, Input, InputNumber, Row, Select } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useBestRegistry } from '../runtime'\nimport {\n getDefaultValues,\n mergeDefinedValues,\n RemoteSelect,\n serializeDatePickerValue,\n serializeDateRangePickerValue,\n toAntRules,\n toDatePickerValue,\n toDateRangePickerValue\n} from './BestForm'\nimport type { BestFieldDefinition } from './types'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Button", "Modal", "dayjs", "useEffect", "useMemo", "useRef", "useState", "useMemo", "jsx", "jsx", "jsx", "Button", "Input", "dayjs", "useMemo", "useState", "jsx", "jsxs", "dayjs", "getPathValue", "Input", "Button", "useState", "useMemo", "jsx", "jsx", "Button", "DatePicker", "Form", "Input", "InputNumber", "Select", "dayjs", "useEffect", "useMemo", "useRef", "jsx", "jsxs", "Select", "InputNumber", "DatePicker", "dayjs", "Input", "useMemo", "Form", "useRef", "useEffect", "Button", "jsx", "jsx", "dayjs", "message", "Fragment", "jsx", "jsxs", "isRecord", "dayjs", "Modal", "query", "useRef", "useMemo", "useState", "useEffect", "Button"]
3
+ "sources": ["../src/lowcode/adapter.ts", "../src/lowcode/BestCrudPage.tsx", "../src/runtime/BestProvider.tsx", "../src/ui/BestBatchInput.tsx", "../src/ui/BestDetail.tsx", "../src/ui/BestFilePreview.tsx", "../src/ui/BestForm.tsx", "../src/ui/BestLightTable.tsx", "../src/ui/BestOverlay.tsx", "../src/ui/BestSearch.tsx", "../src/ui/BestStates.tsx", "../src/ui/BestTable.tsx", "../src/lowcode/runtime.ts", "../src/lowcode/schema.ts", "../src/lowcode/validate.ts", "../src/lowcode/BestTabbedPage.tsx"],
4
+ "sourcesContent": ["import dayjs from 'dayjs'\nimport type { CrudDataAdapter } from './BestCrudPage'\n\nexport type BestValueNormalizer = (value: unknown, field?: string) => unknown\n\nexport function normalizeBestValues(\n values: Record<string, unknown>,\n normalize: BestValueNormalizer = defaultNormalize\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).map(([field, value]) => [\n field,\n normalizeNested(value, normalize, field)\n ])\n )\n}\n\nfunction normalizeNested(value: unknown, normalize: BestValueNormalizer, field?: string): unknown {\n if (Array.isArray(value)) return value.map((item) => normalizeNested(item, normalize, field))\n if (dayjs.isDayjs(value) || value instanceof Date) return value\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeNested(item, normalize, key)])\n )\n }\n return normalize(value, field)\n}\n\nfunction defaultNormalize(value: unknown) {\n if (typeof value === 'string') return value.trim() === '' ? undefined : value.trim()\n return value\n}\n\nexport function createBestCrudAdapter(\n options: {\n normalize?: BestValueNormalizer\n fromList?: CrudDataAdapter['fromList']\n fromDetail?: CrudDataAdapter['fromDetail']\n toCreatePayload?: CrudDataAdapter['toCreatePayload']\n toUpdatePayload?: CrudDataAdapter['toUpdatePayload']\n } = {}\n): CrudDataAdapter {\n const normalize = options.normalize ?? defaultNormalize\n return {\n fromList: options.fromList,\n fromDetail: options.fromDetail,\n toCreatePayload: (values) =>\n options.toCreatePayload?.(normalizeBestValues(values, normalize)) ??\n normalizeBestValues(values, normalize),\n toUpdatePayload: (values, record) =>\n options.toUpdatePayload?.(normalizeBestValues(values, normalize), record) ??\n normalizeBestValues(values, normalize)\n }\n}\n", "import type { ActionType } from '@ant-design/pro-components'\nimport { Button, Modal, message } from 'antd'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useBestListService, useBestRegistry } from '../runtime'\nimport {\n BestDetail,\n type BestDetailField,\n type BestFieldDefinition,\n BestForm,\n BestModal,\n BestSearch,\n BestTable,\n type BestTableColumn\n} from '../ui'\nimport { getDefaultValues } from '../ui/BestForm'\nimport {\n confirmBeforeAction,\n createLatestPageRequest,\n errorMessage,\n formatCrudValue,\n removeCrudRecord,\n toBestListQuery\n} from './runtime'\nimport type {\n CrudPageSchema,\n DetailFieldSchema,\n FieldSchema,\n FormMode,\n PageActionSchema,\n TableColumnSchema\n} from './schema'\nimport { assertValidCrudPageSchema } from './validate'\n\ntype RecordValue = Record<string, unknown>\n\nexport type BestCrudPageProps = {\n className?: string\n schema: CrudPageSchema\n adapter?: CrudDataAdapter\n}\n\nexport type CrudDataAdapter = {\n fromList?: (records: RecordValue[]) => RecordValue[]\n fromDetail?: (record: RecordValue) => RecordValue\n toCreatePayload?: (values: RecordValue) => RecordValue\n toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue\n}\n\ntype DrawerState = { mode: 'closed' } | { mode: 'detail' | 'edit' | 'create'; record?: RecordValue }\n\nfunction pickRowKeyValues(record: RecordValue | undefined, rowKey: string | string[]) {\n if (!record) return {}\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n return Object.fromEntries(\n keys.flatMap((key) => {\n const value = record[key]\n return value === undefined ? [] : [[key, value] as const]\n })\n )\n}\n\nfunction projectSubmittedValues(values: RecordValue, fields: FieldSchema[]) {\n const projected: RecordValue = {}\n fields.forEach((field) => {\n if (!Object.hasOwn(values, field.field)) return\n const value = values[field.field]\n if (field.component === 'repeatable' && Array.isArray(value) && field.itemFields?.length) {\n projected[field.field] = value.map((item) =>\n isRecord(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item\n )\n return\n }\n projected[field.field] = value\n })\n return projected\n}\n\nexport function buildCrudSubmitValues(\n values: RecordValue,\n record: RecordValue | undefined,\n rowKey: string | string[]\n) {\n return { ...values, ...pickRowKeyValues(record, rowKey) }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction mergeRecordForEdit(\n record: RecordValue | undefined,\n detail: RecordValue,\n rowKey: string | string[]\n) {\n return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail\n}\n\nfunction toFieldDefinition(\n field: FieldSchema,\n dictionaries: ReturnType<typeof useBestRegistry>['dictionaries'],\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestFieldDefinition {\n const slot = field.slot\n const options = field.dict ? (dictionaries[field.dict] ?? []) : []\n const rules = field.rules ?? []\n return {\n field: field.field,\n label: field.label,\n component: field.component,\n placeholder: field.placeholder,\n options,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n required: field.required,\n disabled: field.disabled,\n hidden: field.hidden,\n maxDate: field.maxDate,\n span: field.span,\n defaultValue: field.defaultValue,\n visibleWhen: field.visibleWhen,\n disabledWhen: field.disabledWhen,\n clearWhenHidden: field.clearWhenHidden,\n itemFields: field.itemFields?.map((item) =>\n toFieldDefinition(item as FieldSchema, dictionaries, slots)\n ),\n minItems: field.minItems,\n maxItems: field.maxItems,\n render: slot ? (context) => slots[slot]?.(context) : undefined,\n rules:\n field.required && !rules.some((rule) => rule.required)\n ? [{ required: true, message: `\u8BF7\u586B\u5199${field.label}` }, ...rules]\n : rules\n }\n}\n\nfunction useFields(fields: FieldSchema[] = []) {\n const registry = useBestRegistry()\n return fields.map((field) => toFieldDefinition(field, registry.dictionaries, registry.slots))\n}\n\nfunction toDetailField(\n field: DetailFieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestDetailField {\n const slot = field.slot\n const valueEnum = field.dict\n ? Object.fromEntries(\n (dictionary[field.dict] ?? []).map((item) => [String(item.value), item.label])\n )\n : undefined\n return {\n field: field.field,\n label: field.label,\n span: field.span,\n valueEnum,\n render: slot\n ? (value, record) => slots[slot]?.({ field: field.field, record, value }) ?? '-'\n : undefined\n }\n}\n\nfunction toTableColumn(\n column: TableColumnSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>,\n slots: ReturnType<typeof useBestRegistry>['slots']\n): BestTableColumn<RecordValue> {\n const slot = column.slot\n const valueEnum = column.dict\n ? Object.fromEntries(\n (dictionary[column.dict] ?? []).map((item) => [String(item.value), { text: item.label }])\n )\n : undefined\n return {\n dataIndex: column.field,\n search: false,\n title: column.title,\n width: column.width,\n fixed: column.fixed,\n valueEnum,\n renderText:\n column.format && !slot && !column.dict\n ? (value) => formatCrudValue(value, column.format)\n : undefined,\n render: slot\n ? (_value, record) =>\n slots[slot]?.({\n field: column.field,\n record,\n value: record[column.field]\n }) ?? '-'\n : undefined\n }\n}\n\nfunction toProTableSearchColumn(\n field: FieldSchema,\n dictionary: Record<string, { label: string; value: string | number }[]>\n): BestTableColumn<RecordValue> {\n const valueType = (() => {\n switch (field.component) {\n case 'number':\n return 'digit' as const\n case 'select':\n return 'select' as const\n case 'date':\n return 'date' as const\n case 'dateRange':\n return 'dateRange' as const\n default:\n return 'text' as const\n }\n })()\n const options = field.dict ? (dictionary[field.dict] ?? []) : undefined\n return {\n dataIndex: field.field,\n title: field.label,\n valueType,\n search: true,\n hideInTable: true,\n initialValue: field.defaultValue,\n fieldProps: {\n ...(options ? { options } : {}),\n ...(field.maxDate === 'today'\n ? { disabledDate: (current: dayjs.Dayjs) => current.isAfter(dayjs(), 'day') }\n : {})\n }\n }\n}\n\nfunction confirmAction(content: string) {\n return new Promise<boolean>((resolve) => {\n Modal.confirm({\n content,\n okText: '\u786E\u8BA4',\n cancelText: '\u53D6\u6D88',\n onOk: () => resolve(true),\n onCancel: () => resolve(false)\n })\n })\n}\n\nexport function BestCrudPage({ adapter, className, schema }: BestCrudPageProps) {\n const registry = useBestRegistry()\n assertValidCrudPageSchema(schema, registry)\n const registeredListService = useBestListService(schema.dataSource.list)\n if (!registeredListService) throw new Error(`\u672A\u6CE8\u518C\u5217\u8868\u670D\u52A1\uFF1A${schema.dataSource.list}`)\n const listService = useCallback(\n async (\n query: Parameters<typeof registeredListService>[0],\n options?: Parameters<typeof registeredListService>[1]\n ) => {\n const response = await registeredListService(query, options)\n return adapter?.fromList ? { ...response, items: adapter.fromList(response.items) } : response\n },\n [adapter, registeredListService]\n )\n const searchFields = useFields(schema.search)\n const useBestSearch =\n schema.searchMode === 'bestSearch' ||\n schema.search?.some((field) => field.component === 'remoteSelect')\n const formFields = useFields(schema.form)\n const actionRef = useRef<ActionType>(undefined)\n const searchDefaultValues = useMemo(() => getDefaultValues(searchFields), [searchFields])\n const searchFieldNames = useMemo(\n () => new Set(searchFields.map((field) => field.field)),\n [searchFields]\n )\n const searchSchemaSignature = useMemo(\n () =>\n JSON.stringify(\n searchFields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue\n }))\n ),\n [searchFields]\n )\n const [query, setQuery] = useState<RecordValue>(searchDefaultValues)\n const queryRef = useRef<RecordValue>(searchDefaultValues)\n const queryStateRef = useRef({\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: false\n })\n const [drawer, setDrawer] = useState<DrawerState>({ mode: 'closed' })\n const [submitting, setSubmitting] = useState(false)\n const submittingRef = useRef(false)\n\n const handleAction = useCallback(\n async (action: PageActionSchema, record?: RecordValue) => {\n if (action.access && !registry.access(action.access)) return\n if (action.effect !== 'remove' && !(await confirmBeforeAction(action.confirm, confirmAction)))\n return\n if (action.effect === 'openDetail') setDrawer({ mode: 'detail', record })\n if (action.effect === 'openEdit') {\n let editRecord = record\n if (schema.dataSource.detail) {\n const detailService = registry.services[schema.dataSource.detail]\n if (!detailService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`)\n return\n }\n try {\n const detail = await detailService(record ?? {})\n if (detail && typeof detail === 'object' && !Array.isArray(detail)) {\n const normalizedDetail = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\n editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey)\n }\n } catch (error) {\n message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n return\n }\n }\n setDrawer({ mode: 'edit', record: editRecord })\n }\n if (action.effect === 'openCreate') setDrawer({ mode: 'create' })\n if (action.effect === 'remove' && schema.dataSource.remove) {\n const removeService = registry.services[schema.dataSource.remove]\n if (!removeService) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`)\n return\n }\n try {\n const deleted = await removeCrudRecord(\n record ?? {},\n removeService,\n action.confirm ?? `\u786E\u8BA4\u5220\u9664${schema.title}\uFF1F`,\n confirmAction\n )\n if (deleted) {\n message.success('\u5220\u9664\u6210\u529F')\n actionRef.current?.reload()\n }\n } catch (error) {\n message.error(errorMessage(error, '\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n }\n }\n if (action.effect === 'runAction' && action.action) {\n const runAction = registry.actions[action.action]\n if (!runAction) {\n message.error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n return\n }\n try {\n await runAction({ record })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, `${action.label}\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n }\n }\n },\n [adapter, registry, schema]\n )\n\n const columns = useMemo<BestTableColumn<RecordValue>[]>(() => {\n const proTableSearchFields = useBestSearch ? [] : (schema.search ?? [])\n const searchColumns = new Map(\n proTableSearchFields.map((field) => [\n field.field,\n toProTableSearchColumn(field, registry.dictionaries)\n ])\n )\n const configuredColumns = schema.table.columns.map((column) => {\n const tableColumn = toTableColumn(column, registry.dictionaries, registry.slots)\n const searchColumn = searchColumns.get(column.field)\n if (!searchColumn) return tableColumn\n searchColumns.delete(column.field)\n return { ...tableColumn, ...searchColumn, hideInTable: false }\n })\n configuredColumns.push(...searchColumns.values())\n if (!schema.table.actions?.length) return configuredColumns\n const actionColumnWidth = Math.max(160, schema.table.actions.length * 80 + 32)\n configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\n fixed: 'right',\n width: actionColumnWidth,\n render: (_, record) =>\n schema.table.actions?.map((action) => (\n <ActionButton action={action} key={action.id} record={record} onExecute={handleAction} />\n ))\n })\n return configuredColumns\n }, [\n handleAction,\n registry.dictionaries,\n registry.slots,\n schema.search,\n schema.table.actions,\n schema.table.columns,\n useBestSearch\n ])\n\n const pageRequest = useMemo(\n () =>\n createLatestPageRequest(listService, (error) =>\n message.error(errorMessage(error, `${schema.title}\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`))\n ),\n [listService, schema.title]\n )\n const rowKey = schema.table.rowKey\n const request = useCallback(\n (params: RecordValue, sort?: Record<string, unknown>) =>\n pageRequest.request(\n toBestListQuery({ ...params, ...(useBestSearch ? queryRef.current : {}) }, sort)\n ),\n [pageRequest, useBestSearch]\n )\n\n useLayoutEffect(() => {\n const previous = queryStateRef.current\n if (previous.schemaId === schema.id && previous.searchSchemaSignature === searchSchemaSignature)\n return\n\n const shouldUseDefaults = previous.schemaId !== schema.id || !previous.userTouched\n const nextQuery = shouldUseDefaults\n ? searchDefaultValues\n : Object.fromEntries(\n Object.entries(queryRef.current).filter(([field]) => searchFieldNames.has(field))\n )\n queryRef.current = nextQuery\n setQuery(nextQuery)\n queryStateRef.current = {\n schemaId: schema.id,\n searchSchemaSignature,\n userTouched: shouldUseDefaults ? false : previous.userTouched\n }\n }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature])\n\n useEffect(() => () => pageRequest.abort(), [pageRequest])\n\n const submitForm = useCallback(\n async (values: RecordValue) => {\n if (submittingRef.current) return\n const serviceKey =\n drawer.mode === 'edit' ? schema.dataSource.update : schema.dataSource.create\n if (!serviceKey) {\n message.error(`${drawer.mode === 'edit' ? '\u66F4\u65B0' : '\u521B\u5EFA'}\u670D\u52A1\u672A\u914D\u7F6E`)\n return\n }\n const service = registry.services[serviceKey]\n if (!service) {\n message.error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${serviceKey}`)\n return\n }\n const record = drawer.mode === 'closed' ? undefined : drawer.record\n const payloadValues =\n drawer.mode === 'edit'\n ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey)\n : projectSubmittedValues(values, formFields)\n submittingRef.current = true\n setSubmitting(true)\n try {\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues)\n : (adapter?.toCreatePayload?.(payloadValues) ?? payloadValues)\n await service(payload)\n message.success('\u4FDD\u5B58\u6210\u529F')\n setDrawer({ mode: 'closed' })\n actionRef.current?.reload()\n } catch (error) {\n message.error(errorMessage(error, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5'))\n } finally {\n setSubmitting(false)\n submittingRef.current = false\n }\n },\n [\n adapter,\n drawer,\n formFields,\n registry.services,\n rowKey,\n schema.dataSource.create,\n schema.dataSource.update\n ]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={(values) => {\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n onSearch={(values) => {\n // Keep the latest filters synchronously available to request().\n // reload() may execute before React commits a state update.\n queryRef.current = values\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery(values)\n actionRef.current?.reload()\n }}\n />\n ) : null}\n <BestTable<RecordValue, RecordValue>\n actionRef={actionRef}\n className={className}\n columns={columns}\n pagination={{ showSizeChanger: true, defaultPageSize: schema.table.pageSize ?? 20 }}\n request={request}\n rowKey={\n Array.isArray(rowKey)\n ? (record) => rowKey.map((field) => String(record[field] ?? '')).join('-')\n : rowKey\n }\n search={useBestSearch ? false : undefined}\n scroll={schema.table.scrollX ? { x: schema.table.scrollX } : undefined}\n toolBarRender={() =>\n schema.toolbar?.map((action) => (\n <ActionButton action={action} key={action.id} onExecute={handleAction} />\n )) ?? []\n }\n />\n <BestModal\n open={drawer.mode !== 'closed'}\n title={\n drawer.mode === 'detail'\n ? `${schema.title}\u8BE6\u60C5`\n : drawer.mode === 'edit'\n ? `\u7F16\u8F91${schema.title}`\n : `\u65B0\u5EFA${schema.title}`\n }\n onClose={() => setDrawer({ mode: 'closed' })}\n >\n {drawer.mode === 'detail' ? (\n <BestDetail\n fields={\n schema.detail?.fields.map((field) =>\n toDetailField(field, registry.dictionaries, registry.slots)\n ) ?? []\n }\n record={drawer.record}\n />\n ) : null}\n {drawer.mode === 'edit' || drawer.mode === 'create' ? (\n <BestForm\n fields={formFields}\n initialValues={drawer.record}\n loading={submitting}\n mode={drawer.mode as FormMode}\n onCancel={() => setDrawer({ mode: 'closed' })}\n onSubmit={(values) => {\n void submitForm(values)\n }}\n />\n ) : null}\n </BestModal>\n </>\n )\n\n function ActionButton({\n action,\n record,\n onExecute\n }: {\n action: PageActionSchema\n record?: RecordValue\n onExecute: (action: PageActionSchema, record?: RecordValue) => Promise<void>\n }) {\n const permitted = !action.access || registry.access(action.access)\n if (!permitted) return null\n if (action.effect === 'slot' && action.slot) {\n return registry.slots[action.slot]?.({ record }) ?? null\n }\n return (\n <Button\n key={action.id}\n type={action.buttonType ?? 'link'}\n onClick={() => {\n void onExecute(action, record)\n }}\n >\n {action.label}\n </Button>\n )\n }\n}\n", "import type { ThemeConfig } from 'antd'\nimport { ConfigProvider } from 'antd'\nimport type { ReactNode } from 'react'\nimport { createContext, useContext, useMemo } from 'react'\nimport type { BestListService } from '../lowcode/list'\n\nexport type BestDictionaryItem = { label: string; value: string | number; disabled?: boolean }\nexport type BestService = (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n) => Promise<unknown>\nexport type BestSlotContext = {\n pageId?: string\n tabKey?: string\n field?: string\n record?: Record<string, unknown>\n value?: unknown\n values?: Record<string, unknown>\n}\nexport type BestActionContext = BestSlotContext\nexport type BestAction = (context: BestActionContext) => void | Promise<void>\nexport type BestSlot = (context: BestSlotContext) => ReactNode\n\nexport type BestRegistry = {\n /** List services use the stable low-code pagination contract. */\n listServices: Record<string, BestListService>\n /** Command services, such as create, update and remove. */\n services: Record<string, BestService>\n dictionaries: Record<string, BestDictionaryItem[]>\n actions: Record<string, BestAction>\n slots: Record<string, BestSlot>\n access: (key: string) => boolean\n}\n\nexport type BestProviderProps = {\n children: ReactNode\n registry?: Partial<Omit<BestRegistry, 'access'>> & { access?: BestRegistry['access'] }\n theme?: ThemeConfig\n}\n\nexport type BestRegistryLayer = Partial<Omit<BestRegistry, 'access'>> & {\n access?: BestRegistry['access']\n}\n\nconst emptyRegistry: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: () => true\n}\n\nconst defaultTheme: ThemeConfig = {\n token: {\n borderRadius: 6,\n controlHeight: 32,\n fontSize: 14\n }\n}\n\nconst BestRuntimeContext = createContext<BestRegistry>(emptyRegistry)\n\nexport function composeBestRegistry(...layers: BestRegistryLayer[]): BestRegistry {\n const result: BestRegistry = {\n listServices: {},\n services: {},\n dictionaries: {},\n actions: {},\n slots: {},\n access: emptyRegistry.access\n }\n const groups = ['listServices', 'services', 'dictionaries', 'actions', 'slots'] as const\n for (const layer of layers) {\n for (const group of groups) {\n for (const [key, value] of Object.entries(layer[group] ?? {})) {\n if (Object.hasOwn(result[group], key)) {\n throw new Error(`Registry key \u91CD\u590D\uFF1A${group}.${key}`)\n }\n result[group][key] = value as never\n }\n }\n if (layer.access) {\n const previousAccess = result.access\n result.access = (key) => previousAccess(key) && layer.access?.(key) !== false\n }\n }\n return result\n}\n\nexport function createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return composeBestRegistry(registry)\n}\n\nexport function BestProvider({ children, registry, theme }: BestProviderProps) {\n const value = useMemo(() => createBestRegistry(registry), [registry])\n const mergedTheme = useMemo<ThemeConfig>(\n () => ({ ...defaultTheme, ...theme, token: { ...defaultTheme.token, ...theme?.token } }),\n [theme]\n )\n return (\n <BestRuntimeContext.Provider value={value}>\n <ConfigProvider theme={mergedTheme}>{children}</ConfigProvider>\n </BestRuntimeContext.Provider>\n )\n}\n\nexport function useBestRegistry() {\n return useContext(BestRuntimeContext)\n}\n\nexport function useBestService(key: string): BestService {\n const service = useBestRegistry().services[key]\n if (!service) throw new Error(`\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${key}`)\n return service\n}\n\nexport function useBestListService(key: string): BestListService | undefined {\n return useBestRegistry().listServices[key]\n}\n\nexport function useBestAccess(key?: string): boolean {\n const registry = useBestRegistry()\n return key ? registry.access(key) : true\n}\n\nexport function useBestDictionary(key?: string): BestDictionaryItem[] {\n const dictionaries = useBestRegistry().dictionaries\n return key ? (dictionaries[key] ?? []) : []\n}\n\nexport function useBestAction(key: string): BestAction {\n const action = useBestRegistry().actions[key]\n if (!action) throw new Error(`\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${key}`)\n return action\n}\n", "import { Input } from 'antd'\nimport type { TextAreaProps } from 'antd/es/input'\nimport { useImperativeHandle, useMemo, useState } from 'react'\n\nexport type BestBatchInputRef = {\n getParsedValue: () => string[][]\n}\n\nexport type BestBatchInputProps = Omit<TextAreaProps, 'onChange'> & {\n ref?: React.Ref<BestBatchInputRef>\n separator?: string\n onChange?: (value: string, parsed: string[][]) => void\n}\n\nfunction parse(value: string, separator: string) {\n const escaped = separator.replace(/[\\\\\\]\\-^]/g, '\\\\$&')\n const delimiter = new RegExp(`[${escaped}]`)\n return value\n .split('\\n')\n .map((row) => row.trim())\n .filter(Boolean)\n .map((row) => row.split(delimiter).map((cell) => cell.trim()))\n}\n\nexport function BestBatchInput({\n ref,\n separator = '|',\n value,\n defaultValue,\n onChange,\n ...props\n}: BestBatchInputProps) {\n const [innerValue, setInnerValue] = useState(String(defaultValue ?? ''))\n const currentValue = value == null ? innerValue : String(value)\n const parsed = useMemo(() => parse(currentValue, separator), [currentValue, separator])\n\n useImperativeHandle(ref, () => ({ getParsedValue: () => parsed }), [parsed])\n\n return (\n <Input.TextArea\n {...props}\n value={currentValue}\n onChange={(event) => {\n const nextValue = event.target.value\n if (value == null) setInnerValue(nextValue)\n onChange?.(nextValue, parse(nextValue, separator))\n }}\n />\n )\n}\n", "import { Descriptions } from 'antd'\nimport type { BestDetailField } from './types'\n\nexport type BestDetailProps = {\n fields: BestDetailField[]\n record?: Record<string, unknown>\n column?: number\n}\n\nexport function BestDetail({ fields, record = {}, column = 2 }: BestDetailProps) {\n return (\n <Descriptions bordered column={column} size='small'>\n {fields.map((field) => {\n const value = getPathValue(record, field.field)\n const display = field.render\n ? field.render(value, record)\n : (field.valueEnum?.[String(value)] ??\n (value == null || value === '' ? '-' : String(value)))\n return (\n <Descriptions.Item key={field.field} label={field.label} span={field.span}>\n {display}\n </Descriptions.Item>\n )\n })}\n </Descriptions>\n )\n}\n\nfunction getPathValue(values: Record<string, unknown>, path: string) {\n if (Object.hasOwn(values, path)) return values[path]\n return path.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') {\n return (current as Record<string, unknown>)[part]\n }\n return undefined\n }, values)\n}\n", "import { Button, Image, List, Typography } from 'antd'\n\nexport type BestFileItem = {\n url: string\n name?: string\n mimeType?: string\n}\n\nexport type BestFilePreviewProps = {\n files: BestFileItem[]\n onDownload?: (file: BestFileItem) => void\n}\n\nfunction isImage(file: BestFileItem) {\n return (\n file.mimeType?.startsWith('image/') ||\n /\\.(avif|bmp|gif|jpe?g|png|svg|webp)(?:$|[?#])/i.test(file.url)\n )\n}\n\nexport function BestFilePreview({ files, onDownload }: BestFilePreviewProps) {\n return (\n <List\n dataSource={files}\n renderItem={(file) => (\n <List.Item\n actions={[\n <Button key='download' type='link' onClick={() => onDownload?.(file)}>\n \u4E0B\u8F7D\n </Button>\n ]}\n >\n {isImage(file) ? (\n <Image alt={file.name ?? '\u6587\u4EF6\u9884\u89C8'} height={48} preview src={file.url} width={48} />\n ) : null}\n <Typography.Text ellipsis style={{ marginInlineStart: isImage(file) ? 12 : 0 }}>\n {file.name ?? file.url}\n </Typography.Text>\n </List.Item>\n )}\n />\n )\n}\n", "import type { FormRule } from 'antd'\nimport { Button, DatePicker, Form, Input, InputNumber, Select, Space } from 'antd'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormMode } from '../lowcode/schema'\nimport { useBestRegistry } from '../runtime'\nimport type { BestFieldDefinition, BestFieldRule, BestOption } from './types'\n\nexport type BestFormProps = {\n fields: BestFieldDefinition[]\n initialValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n mode?: FormMode\n onSubmit: (value: Record<string, unknown>) => void\n onCancel?: () => void\n}\n\ntype FormControlProps = {\n field: BestFieldDefinition\n values: Record<string, unknown>\n scopeValues?: Record<string, unknown>\n namePath?: string | number | (string | number)[]\n value?: unknown\n onChange?: (...args: unknown[]) => void\n} & Record<string, unknown>\n\nfunction toNamePath(path?: string | number | (string | number)[]) {\n return path === undefined ? [] : Array.isArray(path) ? path : [path]\n}\n\nfunction isNamePath(value: string | number | (string | number)[]) {\n return Array.isArray(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return false\n }\n if (dayjs.isDayjs(value)) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction appendNamePath(\n path: string | number | (string | number)[] | undefined,\n ...segments: (string | number)[]\n) {\n return [...toNamePath(path), ...segments]\n}\n\nfunction getConditionFieldValue(values: Record<string, unknown>, field: string) {\n if (Object.hasOwn(values, field)) return values[field]\n return getPathValue(values, field.split('.'))\n}\n\nfunction getScopedValues(values: Record<string, unknown>, itemPath: (string | number)[]) {\n const itemValues = getPathValue(values, itemPath)\n return isRecord(itemValues) ? { ...values, ...itemValues } : values\n}\n\nfunction isFieldVisible(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n}\n\nfunction resolveFieldDisabled(\n field: BestFieldDefinition,\n values: Record<string, unknown>,\n mode: FormMode\n) {\n return (\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n )\n}\n\nfunction toDayjsValue(value: unknown): Dayjs | null {\n if (dayjs.isDayjs(value)) return value\n if (value instanceof Date) return dayjs(value)\n if (typeof value === 'number') {\n const normalized = Math.abs(value) >= 1_000_000_000_000 ? value : value * 1000\n const parsed = dayjs(normalized)\n return parsed.isValid() ? parsed : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = dayjs(trimmed)\n return parsed.isValid() ? parsed : null\n }\n return null\n}\n\nexport function toDatePickerValue(value: unknown): Dayjs | null {\n return toDayjsValue(value)\n}\n\nexport function toDateRangePickerValue(value: unknown): [Dayjs | null, Dayjs | null] | null {\n if (!Array.isArray(value)) return null\n const nextValue: [Dayjs | null, Dayjs | null] = [toDayjsValue(value[0]), toDayjsValue(value[1])]\n return nextValue[0] || nextValue[1] ? nextValue : null\n}\n\nexport function serializeDatePickerValue(_: Dayjs | null, dateString: string) {\n return dateString || undefined\n}\n\nexport function serializeDateRangePickerValue(\n _: [Dayjs | null, Dayjs | null] | null,\n dateStrings: [string, string]\n) {\n return dateStrings[0] || dateStrings[1] ? dateStrings : undefined\n}\n\nfunction fieldSignature(field: BestFieldDefinition): unknown {\n return {\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize,\n itemFields: field.itemFields?.map((itemField) => fieldSignature(itemField))\n }\n}\n\nfunction FormControl({\n field,\n values,\n scopeValues,\n mode = 'create',\n form,\n namePath,\n value,\n onChange,\n ...controlProps\n}: FormControlProps & { mode?: FormMode; form: ReturnType<typeof Form.useForm>[0] }) {\n const registry = useBestRegistry()\n const renderValues = scopeValues ?? values\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value !== undefined ? value : getPathValue(values, namePath ?? field.field)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n onChange={(nextValue) => {\n if (onChange) onChange(nextValue)\n else form.setFieldValue(namePath ?? field.field, nextValue)\n }}\n registry={registry}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n case 'slot':\n return (\n <>\n {field.render?.({\n field: field.field,\n values: renderValues,\n value: value !== undefined ? value : getPathValue(values, namePath ?? field.field),\n mode,\n disabled: field.disabled,\n setValue: (name, nextValue) =>\n form.setFieldValue(\n namePath\n ? isNamePath(name)\n ? name\n : [...toNamePath(namePath).slice(0, -1), name]\n : name,\n nextValue\n )\n })}\n </>\n )\n case 'repeatable':\n return (\n <RepeatableField\n field={field}\n form={form}\n mode={mode}\n namePath={namePath}\n values={values}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n value={value as never}\n onChange={onChange as never}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction RepeatableField({\n field,\n form,\n mode,\n namePath,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n mode: FormMode\n namePath?: string | number | (string | number)[]\n values: Record<string, unknown>\n}) {\n const listName = namePath ?? field.field\n return (\n <Form.List name={listName}>\n {(items, { add, remove }) => (\n <>\n {items.map((item) => (\n <RepeatableFieldRow\n key={item.key}\n field={field}\n form={form}\n itemCount={items.length}\n itemName={item.name}\n itemKey={item.key}\n listName={listName}\n mode={mode}\n remove={remove}\n values={values}\n />\n ))}\n <Button\n disabled={field.maxItems !== undefined && items.length >= field.maxItems}\n onClick={() => add(resolveInitialValues(field.itemFields ?? [], undefined))}\n type='dashed'\n >\n \u65B0\u589E\u4E00\u9879\n </Button>\n </>\n )}\n </Form.List>\n )\n}\n\nfunction RepeatableFieldRow({\n field,\n form,\n itemCount,\n itemName,\n itemKey,\n listName,\n mode,\n remove,\n values\n}: {\n field: BestFieldDefinition\n form: ReturnType<typeof Form.useForm>[0]\n itemCount: number\n itemName: number\n itemKey: React.Key\n listName: string | number | (string | number)[]\n mode: FormMode\n remove: (index: number) => void\n values: Record<string, unknown>\n}) {\n const itemPath = appendNamePath(listName, itemName)\n const itemValues = getPathValue(values, itemPath)\n const scopeValues = getScopedValues(values, itemPath)\n\n useEffect(() => {\n field.itemFields?.forEach((itemField) => {\n if (!itemField.clearWhenHidden) return\n const nextPath = appendNamePath(itemPath, itemField.field)\n if (\n !isFieldVisible(itemField, scopeValues, mode) &&\n getPathValue(values, nextPath) !== undefined\n ) {\n form.setFieldValue(nextPath, undefined)\n }\n })\n }, [field.itemFields, form, itemPath, mode, scopeValues, values])\n\n return (\n <Space key={itemKey} align='start'>\n {field.itemFields?.map((itemField) => {\n if (!isFieldVisible(itemField, scopeValues, mode)) return null\n const nextPath = appendNamePath(itemPath, itemField.field)\n return (\n <Form.Item\n key={itemField.field}\n label={itemField.label}\n name={[itemName, itemField.field]}\n rules={toAntRules(itemField.rules)}\n >\n <FormControl\n field={{\n ...itemField,\n disabled: resolveFieldDisabled(itemField, scopeValues, mode)\n }}\n form={form}\n mode={mode}\n namePath={nextPath}\n scopeValues={scopeValues}\n values={isRecord(itemValues) ? { ...values, ...itemValues } : values}\n />\n </Form.Item>\n )\n })}\n <Button\n disabled={itemCount <= (field.minItems ?? 0)}\n onClick={() => remove(itemName)}\n type='link'\n >\n \u5220\u9664\n </Button>\n </Space>\n )\n}\n\ntype FormFieldsProps = Pick<BestFormProps, 'fields' | 'initialValues' | 'mode'> & {\n form: ReturnType<typeof Form.useForm>[0]\n}\n\nfunction FormFields({ fields, form, initialValues, mode = 'create' }: FormFieldsProps) {\n const values =\n (Form.useWatch([], { form, preserve: true }) as Record<string, unknown> | undefined) ??\n initialValues ??\n {}\n const isVisible = (field: BestFieldDefinition) =>\n !field.hidden && (!field.visibleWhen || evaluateCondition(field.visibleWhen, values, mode))\n useEffect(() => {\n fields\n .filter((field) => field.clearWhenHidden && !isVisible(field))\n .forEach((field) => {\n if (values[field.field] !== undefined) form.setFieldValue(field.field, undefined)\n })\n }, [fields, form, mode, values])\n return (\n <>\n {fields\n .filter((field) => isVisible(field))\n .map((field) => {\n const control = (\n <FormControl\n key={field.field}\n field={{\n ...field,\n disabled:\n field.disabled ||\n Boolean(field.disabledWhen && evaluateCondition(field.disabledWhen, values, mode))\n }}\n form={form}\n mode={mode}\n values={values}\n />\n )\n return field.component === 'repeatable' ? (\n <Form.Item key={field.field} label={field.label}>\n {control}\n </Form.Item>\n ) : (\n <Form.Item\n key={field.field}\n label={field.label}\n name={field.field}\n rules={toAntRules(field.rules)}\n >\n {control}\n </Form.Item>\n )\n })}\n </>\n )\n}\n\nexport function toAntRules(rules: BestFieldRule[] | undefined): FormRule[] | undefined {\n return rules?.map(\n (rule) =>\n Object.fromEntries(\n Object.entries({\n required: rule.required,\n type: rule.type === 'string' ? undefined : rule.type,\n min: rule.min ?? rule.minLength,\n max: rule.max ?? rule.maxLength,\n pattern: safeRegExp(rule.pattern),\n message: rule.message,\n validator:\n rule.type === 'integer'\n ? async (_: unknown, value: unknown) => {\n if (value === undefined || value === null || value === '') return\n if (!Number.isInteger(Number(value)))\n throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\n }).filter(([, value]) => value !== undefined)\n ) as FormRule\n )\n}\n\nfunction safeRegExp(pattern: string | undefined) {\n if (!pattern) return undefined\n try {\n return new RegExp(pattern)\n } catch {\n return undefined\n }\n}\n\nexport function RemoteSelect({\n field,\n value,\n disabled,\n placeholder,\n onChange,\n registry\n}: {\n field: BestFieldDefinition\n value?: unknown\n disabled?: boolean\n placeholder?: string\n onChange: (value: unknown) => void\n registry: ReturnType<typeof useBestRegistry>\n}) {\n const [keywordOptions, setKeywordOptions] = useState<BestOption[]>([])\n const [selectedOptions, setSelectedOptions] = useState<BestOption[]>([])\n const [loading, setLoading] = useState(false)\n const [keyword, setKeyword] = useState('')\n const keywordRequestId = useRef(0)\n const selectedRequestId = useRef(0)\n const service = field.remoteService ? registry.services[field.remoteService] : undefined\n const labelField = field.labelField ?? 'label'\n const valueField = field.valueField ?? 'value'\n const searchField = field.searchField ?? 'keyword'\n const debounceMs = field.debounceMs ?? 300\n const pageSize = field.pageSize ?? 20\n\n const parseOptions = (response: unknown): BestOption[] => {\n const raw = Array.isArray(response)\n ? response\n : ((response as { items?: unknown[]; list?: unknown[] })?.items ??\n (response as { list?: unknown[] })?.list ??\n [])\n return raw.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const record = item as Record<string, unknown>\n const optionValue = record[valueField]\n if (typeof optionValue !== 'string' && typeof optionValue !== 'number') return []\n return [\n {\n label: String(record[labelField] ?? optionValue ?? ''),\n value: optionValue,\n disabled: Boolean(record.disabled)\n }\n ]\n })\n }\n\n const mergeOptions = (base: BestOption[], extra: BestOption[]) => {\n const merged = new Map(base.map((item) => [String(item.value), item]))\n extra.forEach((item) => {\n merged.set(String(item.value), item)\n })\n return [...merged.values()]\n }\n\n const options = useMemo(\n () => mergeOptions(keywordOptions, selectedOptions),\n [keywordOptions, selectedOptions]\n )\n\n useEffect(() => {\n const currentRequestId = ++keywordRequestId.current\n if (!service) {\n setKeywordOptions([])\n setLoading(false)\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === keywordRequestId.current && !controller.signal.aborted\n const timer = window.setTimeout(async () => {\n setLoading(true)\n try {\n const response = await service(\n { [searchField]: keyword, page: 1, pageSize },\n { signal: controller.signal }\n )\n if (isCurrent()) setKeywordOptions(parseOptions(response))\n } catch {\n if (isCurrent()) setKeywordOptions([])\n } finally {\n if (isCurrent()) setLoading(false)\n }\n }, debounceMs)\n return () => {\n window.clearTimeout(timer)\n controller.abort()\n }\n }, [debounceMs, keyword, labelField, pageSize, searchField, service, valueField])\n\n useEffect(() => {\n const currentRequestId = ++selectedRequestId.current\n if (!service) {\n setSelectedOptions([])\n return\n }\n if (value === undefined || value === null || value === '') {\n setSelectedOptions([])\n return\n }\n if (typeof value !== 'string' && typeof value !== 'number') {\n setSelectedOptions([])\n return\n }\n const controller = new AbortController()\n const isCurrent = () =>\n currentRequestId === selectedRequestId.current && !controller.signal.aborted\n const fallbackOption: BestOption = {\n label: String(value),\n value: value as string | number\n }\n setSelectedOptions([fallbackOption])\n void service({ [valueField]: value, page: 1, pageSize }, { signal: controller.signal })\n .then((response) => {\n if (!isCurrent()) return\n const resolvedOptions = parseOptions(response)\n if (resolvedOptions.length) {\n setSelectedOptions(mergeOptions([fallbackOption], resolvedOptions))\n }\n })\n .catch(() => undefined)\n return () => {\n controller.abort()\n }\n }, [labelField, pageSize, service, value, valueField])\n\n return (\n <Select\n showSearch\n filterOption={false}\n loading={loading}\n value={value}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n onSearch={setKeyword}\n onChange={onChange}\n />\n )\n}\n\nexport function BestForm({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps) {\n const resolvedInitialValues = useMemo(\n () => resolveInitialValues(fields, initialValues),\n [fields, initialValues]\n )\n const formSignature = useMemo(\n () =>\n JSON.stringify([mode, fields.map((field) => fieldSignature(field)), resolvedInitialValues]),\n [fields, mode, resolvedInitialValues]\n )\n return (\n <BestFormBody\n key={formSignature}\n extra={extra}\n fields={fields}\n initialValues={resolvedInitialValues}\n loading={loading}\n mode={mode}\n onCancel={onCancel}\n onSubmit={onSubmit}\n submitText={submitText}\n />\n )\n}\n\nfunction BestFormBody({\n fields,\n initialValues,\n loading,\n submitText = '\u63D0\u4EA4',\n extra,\n mode,\n onSubmit,\n onCancel\n}: BestFormProps & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n return (\n <Form form={form} initialValues={initialValues} layout='vertical' onFinish={onSubmit}>\n <FormFields fields={fields} form={form} initialValues={initialValues} mode={mode} />\n <Space>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n {onCancel ? <Button onClick={onCancel}>\u53D6\u6D88</Button> : null}\n {extra}\n </Space>\n </Form>\n )\n}\n\nexport function getDefaultValues(fields: BestFieldDefinition[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field) => field.defaultValue !== undefined)\n .map((field) => [field.field, field.defaultValue])\n )\n}\n\nfunction resolveInitialValues(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown> | undefined\n) {\n const values = mergeDefinedValues(getDefaultValues(fields), initialValues)\n const resolvedValues = { ...values }\n fields.forEach((field) => {\n if (field.component !== 'repeatable' || !field.itemFields) return\n const items: unknown[] = Array.isArray(resolvedValues[field.field])\n ? (resolvedValues[field.field] as unknown[])\n : []\n resolvedValues[field.field] = items.map((item) =>\n resolveInitialValues(field.itemFields ?? [], isRecord(item) ? item : {})\n )\n })\n return resolvedValues\n}\n\nexport function mergeDefinedValues(\n baseValues: Record<string, unknown>,\n nextValues: Record<string, unknown> | undefined\n) {\n const mergedValues = { ...baseValues }\n Object.entries(nextValues ?? {}).forEach(([key, value]) => {\n if (value === undefined) return\n const currentValue = mergedValues[key]\n if (isRecord(currentValue) && isRecord(value)) {\n mergedValues[key] = mergeDefinedValues(currentValue, value)\n return\n }\n mergedValues[key] = value\n })\n return mergedValues\n}\n\nfunction getPathValue(\n values: Record<string, unknown>,\n path: string | number | (string | number)[]\n) {\n const parts = Array.isArray(path) ? path : [path]\n return parts.reduce<unknown>((current, part) => {\n if (current && typeof current === 'object') return (current as Record<string, unknown>)[part]\n return undefined\n }, values)\n}\n\nexport function evaluateCondition(\n condition: NonNullable<BestFieldDefinition['visibleWhen']>,\n values: Record<string, unknown>,\n mode: FormMode\n): boolean {\n switch (condition.operator) {\n case 'equals':\n return getConditionFieldValue(values, condition.field) === condition.value\n case 'notEmpty':\n return (\n getConditionFieldValue(values, condition.field) !== undefined &&\n getConditionFieldValue(values, condition.field) !== null &&\n getConditionFieldValue(values, condition.field) !== ''\n )\n case 'modeEquals':\n return mode === condition.value\n case 'and':\n return condition.conditions.every((item) => evaluateCondition(item, values, mode))\n case 'or':\n return condition.conditions.some((item) => evaluateCondition(item, values, mode))\n case 'not':\n return !evaluateCondition(condition.condition, values, mode)\n }\n}\n", "import type { TableColumnsType } from 'antd'\nimport { Table } from 'antd'\n\nexport type BestLightTableColumn<T extends Record<string, unknown>> = {\n field: keyof T & string\n title: string\n width?: number\n render?: (value: unknown, record: T, index: number) => React.ReactNode\n}\n\nexport type BestLightTableProps<T extends Record<string, unknown>> = {\n columns: BestLightTableColumn<T>[]\n data: T[]\n rowKey?: string\n}\n\nexport function BestLightTable<T extends Record<string, unknown>>({\n columns,\n data,\n rowKey\n}: BestLightTableProps<T>) {\n const tableColumns: TableColumnsType<T> = columns.map((column) => ({\n dataIndex: column.field,\n key: column.field,\n title: column.title,\n width: column.width,\n render: column.render\n }))\n return (\n <Table\n columns={tableColumns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n size='small'\n />\n )\n}\n", "import { Drawer, Modal } from 'antd'\nimport type { ReactNode } from 'react'\n\ntype OverlayProps = {\n children: ReactNode\n open: boolean\n title: ReactNode\n onClose: () => void\n}\n\nexport function BestDrawer({ children, open, title, onClose }: OverlayProps) {\n return (\n <Drawer destroyOnHidden open={open} title={title} width={640} onClose={onClose}>\n {children}\n </Drawer>\n )\n}\n\nexport function BestModal({ children, open, title, onClose }: OverlayProps) {\n return (\n <Modal destroyOnHidden footer={null} open={open} title={title} onCancel={onClose}>\n {children}\n </Modal>\n )\n}\n", "import type { FormInstance } from 'antd'\nimport { Button, Col, DatePicker, Form, Input, InputNumber, Row, Select } from 'antd'\nimport dayjs from 'dayjs'\nimport type { ReactNode } from 'react'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useBestRegistry } from '../runtime'\nimport {\n getDefaultValues,\n mergeDefinedValues,\n RemoteSelect,\n serializeDatePickerValue,\n serializeDateRangePickerValue,\n toAntRules,\n toDatePickerValue,\n toDateRangePickerValue\n} from './BestForm'\nimport type { BestFieldDefinition } from './types'\nimport './BestSearch.module.less'\n\nexport type BestSearchProps = {\n fields: BestFieldDefinition[]\n value?: Record<string, unknown>\n defaultValues?: Record<string, unknown>\n loading?: boolean\n submitText?: string\n extra?: ReactNode\n onChange?: (value: Record<string, unknown>) => void\n onSearch: (value: Record<string, unknown>) => void\n onReset?: (value: Record<string, unknown>) => void\n}\n\ntype FieldControlProps = {\n field: BestFieldDefinition\n value?: unknown\n onChange?: (value: unknown) => void\n} & Record<string, unknown>\n\nfunction searchFormSignature(\n fields: BestFieldDefinition[],\n initialValues: Record<string, unknown>\n) {\n return JSON.stringify([\n fields.map((field) => ({\n field: field.field,\n component: field.component,\n defaultValue: field.defaultValue,\n remoteService: field.remoteService,\n searchField: field.searchField,\n labelField: field.labelField,\n valueField: field.valueField,\n debounceMs: field.debounceMs,\n pageSize: field.pageSize\n })),\n initialValues\n ])\n}\n\nfunction FieldControl({ field, value, onChange, ...controlProps }: FieldControlProps) {\n const registry = useBestRegistry()\n switch (field.component) {\n case 'select':\n return (\n <Select\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n options={field.options}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <InputNumber\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'remoteSelect':\n return (\n <RemoteSelect\n field={field}\n value={value as never}\n onChange={onChange ?? (() => undefined)}\n disabled={field.disabled}\n placeholder={field.placeholder}\n registry={registry}\n />\n )\n case 'date':\n return (\n <DatePicker\n {...controlProps}\n value={toDatePickerValue(value) as never}\n onChange={(date, dateString) =>\n onChange?.(serializeDatePickerValue(date, dateString as string))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n )\n case 'dateRange':\n return (\n <DatePicker.RangePicker\n {...controlProps}\n value={toDateRangePickerValue(value) as never}\n onChange={(dates, dateStrings) =>\n onChange?.(serializeDateRangePickerValue(dates, dateStrings as [string, string]))\n }\n disabled={field.disabled}\n disabledDate={(current) => field.maxDate === 'today' && current.isAfter(dayjs(), 'day')}\n style={{ width: '100%' }}\n />\n )\n case 'textarea':\n return (\n <Input.TextArea\n {...controlProps}\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n default:\n return (\n <Input\n {...controlProps}\n allowClear\n value={value as never}\n onChange={onChange}\n disabled={field.disabled}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction syncValues(\n form: FormInstance,\n value: Record<string, unknown>,\n fields: BestFieldDefinition[]\n) {\n form.setFieldsValue(Object.fromEntries(fields.map((field) => [field.field, undefined])) as never)\n form.setFieldsValue(value as never)\n}\n\nexport function BestSearch({\n fields,\n value,\n defaultValues,\n loading,\n submitText = '\u67E5\u8BE2',\n extra,\n onChange,\n onSearch,\n onReset\n}: BestSearchProps) {\n const initialValues = useMemo(\n () => mergeDefinedValues(getDefaultValues(fields), defaultValues),\n [fields, defaultValues]\n )\n return (\n <BestSearchBody\n key={searchFormSignature(fields, initialValues)}\n extra={extra}\n fields={fields}\n initialValues={initialValues}\n loading={loading}\n onChange={onChange}\n onReset={onReset}\n onSearch={onSearch}\n submitText={submitText}\n value={value}\n />\n )\n}\n\nfunction BestSearchBody({\n fields,\n value,\n initialValues,\n loading,\n submitText,\n extra,\n onChange,\n onSearch,\n onReset\n}: Omit<BestSearchProps, 'defaultValues'> & { initialValues: Record<string, unknown> }) {\n const [form] = Form.useForm()\n const valueSignatureRef = useRef<string | undefined>(undefined)\n const controlledRef = useRef(false)\n\n useEffect(() => {\n if (value === undefined) {\n if (controlledRef.current) {\n syncValues(form, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n controlledRef.current = false\n }\n return\n }\n controlledRef.current = true\n const signature = JSON.stringify(value)\n if (valueSignatureRef.current === signature) return\n syncValues(form, value, fields)\n valueSignatureRef.current = signature\n }, [fields, form, value])\n\n return (\n <Form\n form={form}\n initialValues={initialValues}\n layout='vertical'\n onFinish={(values) => onSearch(values as Record<string, unknown>)}\n onValuesChange={(_, values) => onChange?.(values as Record<string, unknown>)}\n className='best-lowcode-search'\n >\n <Row gutter={16} align='bottom'>\n {fields\n .filter((field) => !field.hidden)\n .map((field) => (\n <Col key={field.field} span={field.span ?? 6}>\n <Form.Item label={field.label} name={field.field} rules={toAntRules(field.rules)}>\n <FieldControl field={field} />\n </Form.Item>\n </Col>\n ))}\n <Col>\n <Form.Item>\n <Button htmlType='submit' loading={loading} type='primary'>\n {submitText}\n </Button>\n <Button\n onClick={() => {\n syncValues(form, initialValues, fields)\n valueSignatureRef.current = JSON.stringify(initialValues)\n onChange?.(initialValues)\n onReset?.(initialValues)\n }}\n style={{ marginInlineStart: 8 }}\n >\n \u91CD\u7F6E\n </Button>\n {extra}\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )\n}\n", "import { Empty, Result, Spin } from 'antd'\n\nexport function BestLoading({ description = '\u52A0\u8F7D\u4E2D' }: { description?: string }) {\n return (\n <div style={{ display: 'grid', minHeight: 160, placeItems: 'center' }}>\n <Spin tip={description} />\n </div>\n )\n}\n\nexport function BestEmpty({ description = '\u6682\u65E0\u6570\u636E' }: { description?: string }) {\n return <Empty description={description} />\n}\n\nexport function BestError({ description = '\u52A0\u8F7D\u5931\u8D25' }: { description?: string }) {\n return <Result status='error' title={description} />\n}\n", "import {\n type ParamsType,\n ProTable,\n type ProTableProps,\n type RequestData\n} from '@ant-design/pro-components'\nimport type { TableProps } from 'antd'\nimport type { ReactNode } from 'react'\nimport './BestTable.module.less'\n\nexport type BestTableColumn<T extends Record<string, unknown>> = NonNullable<\n ProTableProps<T, ParamsType>['columns']\n>[number]\n\nexport type BestTableProps<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n> = Omit<ProTableProps<DataSource, Params, ValueType>, 'columns'> & {\n columns?:\n | ProTableProps<DataSource, Params, ValueType>['columns']\n | TableProps<DataSource>['columns']\n emptyText?: ReactNode\n}\n\nconst defaultSearch: NonNullable<ProTableProps<Record<string, unknown>, ParamsType>['search']> = {\n layout: 'vertical',\n labelWidth: 'auto',\n defaultCollapsed: false,\n collapseRender: false,\n span: 6\n}\n\nfunction mergeSearch<T>(defaults: T, value: T | false | undefined): T | false {\n if (value === false) return false\n return { ...(defaults as object), ...((value ?? {}) as object) } as T\n}\n\nexport function BestTable<\n DataSource extends Record<string, unknown>,\n Params extends ParamsType = ParamsType,\n ValueType = 'text'\n>({\n columns,\n cardProps,\n className,\n search,\n emptyText = '\u6682\u65E0\u6570\u636E',\n ...props\n}: BestTableProps<DataSource, Params, ValueType>) {\n return (\n <ProTable<DataSource, Params, ValueType>\n {...props}\n className={['best-lowcode-table', className].filter(Boolean).join(' ')}\n columns={columns as ProTableProps<DataSource, Params, ValueType>['columns']}\n options={false}\n search={mergeSearch(defaultSearch, search as typeof defaultSearch | false | undefined)}\n cardProps={\n cardProps === false\n ? false\n : {\n ...cardProps,\n styles: {\n ...cardProps?.styles,\n body: { ...cardProps?.styles?.body, padding: 12 }\n }\n }\n }\n locale={{ emptyText }}\n />\n )\n}\n\nexport type { RequestData }\n", "import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc.js'\nimport type { BestListQuery, BestListService } from './list'\nimport type { TableColumnSchema } from './schema'\n\ndayjs.extend(utc)\n\ntype ProTablePageResponse = { data: Record<string, unknown>[]; success: boolean; total: number }\n\nexport function toBestListQuery(\n params: Record<string, unknown>,\n sort?: Record<string, unknown>\n): BestListQuery {\n const { current, pageSize, ...filters } = params\n const normalizedSort = Object.fromEntries(\n Object.entries(sort ?? {}).filter(\n (entry): entry is [string, 'ascend' | 'descend'] =>\n entry[1] === 'ascend' || entry[1] === 'descend'\n )\n )\n return {\n page: typeof current === 'number' && current > 0 ? current : 1,\n pageSize: typeof pageSize === 'number' && pageSize > 0 ? pageSize : 20,\n filters,\n ...(Object.keys(normalizedSort).length ? { sort: normalizedSort } : {})\n }\n}\n\nexport function formatCrudValue(value: unknown, format: TableColumnSchema['format']): string {\n if (value == null || value === '') return '-'\n if (!format || format === 'text') return String(value)\n if (format === 'money') {\n const amount = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(amount)\n ? new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount)\n : String(value)\n }\n if (typeof value !== 'string' && typeof value !== 'number' && !(value instanceof Date)) {\n return String(value)\n }\n let timestamp: string | number | Date = value\n if (typeof value === 'number' || typeof value === 'string') {\n const numericValue = typeof value === 'number' ? value : Number(value.trim())\n timestamp =\n Number.isFinite(numericValue) && numericValue !== 0\n ? Math.abs(numericValue) >= 1_000_000_000_000\n ? numericValue\n : numericValue * 1000\n : value\n }\n const date = dayjs.utc(timestamp)\n if (!date.isValid()) return String(value)\n return date.format(format === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')\n}\n\nexport function errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback\n}\n\nexport function isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted || (error instanceof DOMException && error.name === 'AbortError')\n}\n\nexport async function confirmBeforeAction(\n content: string | undefined,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n return !content || confirm(content)\n}\n\nexport async function removeCrudRecord(\n record: Record<string, unknown>,\n service: (\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ) => Promise<unknown>,\n content: string,\n confirm: (content: string) => Promise<boolean>\n): Promise<boolean> {\n if (!(await confirmBeforeAction(content, confirm))) return false\n await service(record)\n return true\n}\n\nexport function createLatestPageRequest(\n service: BestListService,\n onError: (error: unknown) => void\n) {\n let sequence = 0\n let controller: AbortController | undefined\n let latest: ProTablePageResponse = { data: [], success: false, total: 0 }\n\n return {\n async request(query: BestListQuery): Promise<ProTablePageResponse> {\n controller?.abort()\n controller = new AbortController()\n const currentController = controller\n const currentSequence = ++sequence\n try {\n const response = await service(query, { signal: currentController.signal })\n const pageResponse: ProTablePageResponse = {\n data: response.items,\n success: true,\n total: response.total\n }\n if (currentSequence !== sequence) return latest\n latest = pageResponse\n return pageResponse\n } catch (error) {\n if (currentSequence !== sequence || isAbortError(error, currentController.signal))\n return latest\n onError(error)\n return { data: [], success: false, total: 0 }\n }\n },\n abort() {\n controller?.abort()\n }\n }\n}\n", "import type { BestFieldComponent, BestFieldRule } from '../ui/types'\n\nexport const CRUD_SCHEMA_ID = 'https://best.dev/schema/crud/v1' as const\nexport const CRUD_SCHEMA_VERSION = 1 as const\nexport const TABBED_PAGE_SCHEMA_ID = 'https://best.dev/schema/tabs/v1' as const\nexport const TABBED_PAGE_SCHEMA_VERSION = 1 as const\n\nexport type Condition =\n | { operator: 'equals'; field: string; value: string | number | boolean | null }\n | { operator: 'notEmpty'; field: string }\n | { operator: 'modeEquals'; value: FormMode }\n | { operator: 'and' | 'or'; conditions: Condition[] }\n | { operator: 'not'; condition: Condition }\n\nexport type FormMode = 'create' | 'edit' | 'detail'\n\nexport type FieldSchema = {\n field: string\n label: string\n component: BestFieldComponent\n placeholder?: string\n dict?: string\n required?: boolean\n disabled?: boolean\n hidden?: boolean\n maxDate?: 'today'\n span?: number\n defaultValue?: string | number | boolean | null\n rules?: BestFieldRule[]\n /** Application-specific form control registered in the BestProvider registry. */\n slot?: string\n remoteService?: string\n searchField?: string\n labelField?: string\n valueField?: string\n debounceMs?: number\n pageSize?: number\n visibleWhen?: Condition\n disabledWhen?: Condition\n /** Clears stale dependent values when this field becomes hidden. */\n clearWhenHidden?: boolean\n /** Repeated object fields, for rules such as tiered pricing. */\n itemFields?: Omit<FieldSchema, 'itemFields'>[]\n minItems?: number\n maxItems?: number\n}\n\nexport type TableColumnSchema = {\n field: string\n title: string\n dict?: string\n width?: number\n fixed?: 'left' | 'right'\n format?: 'date' | 'datetime' | 'money' | 'text'\n slot?: string\n}\n\nexport type DetailFieldSchema = {\n field: string\n label: string\n dict?: string\n span?: number\n slot?: string\n}\n\nexport type PageActionButtonType = 'primary' | 'default' | 'link' | 'text' | 'dashed'\n\nexport type PageActionSchema = {\n id: string\n label: string\n effect: 'openCreate' | 'openDetail' | 'openEdit' | 'remove' | 'runAction' | 'slot'\n action?: string\n slot?: string\n access?: string\n confirm?: string\n /** Visual button style; omitted actions use the runtime area default. */\n buttonType?: PageActionButtonType\n}\n\nexport type CrudPageSchema = {\n $schema: typeof CRUD_SCHEMA_ID\n version: typeof CRUD_SCHEMA_VERSION\n id: string\n kind: 'crud'\n title: string\n dataSource: {\n list: string\n detail?: string\n create?: string\n update?: string\n remove?: string\n }\n search?: FieldSchema[]\n searchMode?: 'proTable' | 'bestSearch'\n form?: FieldSchema[]\n table: {\n rowKey: string | string[]\n columns: TableColumnSchema[]\n actions?: PageActionSchema[]\n scrollX?: number\n pageSize?: number\n }\n detail?: { fields: DetailFieldSchema[] }\n toolbar?: PageActionSchema[]\n meta?: {\n generatedBy?: string\n generatedAt?: string\n }\n}\n\nexport type TabContentSchema =\n | { type: 'crud'; schema: CrudPageSchema }\n | { type: 'slot'; slot: string }\n\nexport type TabSchema = {\n key: string\n label: string\n access?: string\n /** Defaults to true so inactive CRUD pages do not fetch until selected. */\n destroyOnHidden?: boolean\n content: TabContentSchema\n}\n\n/** A page composition schema with runtime-owned tab navigation. */\nexport type TabbedPageSchema = {\n $schema: typeof TABBED_PAGE_SCHEMA_ID\n version: typeof TABBED_PAGE_SCHEMA_VERSION\n id: string\n kind: 'tabs'\n tabs: TabSchema[]\n}\n", "import type { BestRegistry } from '../runtime'\nimport {\n type Condition,\n CRUD_SCHEMA_ID,\n CRUD_SCHEMA_VERSION,\n type CrudPageSchema,\n type FieldSchema,\n type PageActionSchema,\n TABBED_PAGE_SCHEMA_ID,\n TABBED_PAGE_SCHEMA_VERSION,\n type TabbedPageSchema\n} from './schema'\n\nexport type SchemaDiagnostic = {\n path: string\n code: string\n message: string\n}\n\nexport type SchemaValidationResult = {\n valid: boolean\n diagnostics: SchemaDiagnostic[]\n}\n\nconst fieldComponents = new Set([\n 'input',\n 'number',\n 'select',\n 'remoteSelect',\n 'date',\n 'dateRange',\n 'textarea',\n 'slot',\n 'repeatable'\n])\nconst builtInEffects = new Set([\n 'openCreate',\n 'openDetail',\n 'openEdit',\n 'remove',\n 'runAction',\n 'slot'\n])\nconst columnFormats = new Set(['date', 'datetime', 'money', 'text'])\n\nfunction push(diagnostics: SchemaDiagnostic[], path: string, code: string, message: string) {\n diagnostics.push({ path, code, message })\n}\n\nfunction validateCondition(condition: Condition, path: string, diagnostics: SchemaDiagnostic[]) {\n if (!condition || typeof condition !== 'object') {\n push(diagnostics, path, 'condition.type', '\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61')\n return\n }\n if (condition.operator === 'equals') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'notEmpty') {\n if (typeof condition.field !== 'string' || condition.field === '') {\n push(diagnostics, path, 'condition.field', 'notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D')\n }\n return\n }\n if (condition.operator === 'modeEquals') {\n return\n }\n if (\n (condition.operator === 'and' || condition.operator === 'or') &&\n !Array.isArray(condition.conditions)\n ) {\n push(diagnostics, path, 'condition.conditions', '\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4')\n return\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n if (condition.conditions.length === 0) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n return\n }\n if (condition.operator === 'not') {\n if (!condition.condition) {\n push(diagnostics, path, 'condition.missing', 'not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition')\n return\n }\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\n return\n }\n push(diagnostics, path, 'condition.operator', `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${(condition as { operator?: unknown }).operator}`)\n}\n\nfunction validateFields(\n fields: FieldSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n diagnostics: SchemaDiagnostic[]\n) {\n const seen = new Set<string>()\n fields?.forEach((field, index) => {\n const fieldPath = `${path}/${index}`\n if (!field.field) push(diagnostics, fieldPath, 'field.missing', '\u5B57\u6BB5\u540D\u4E0D\u80FD\u4E3A\u7A7A')\n if (seen.has(field.field))\n push(diagnostics, fieldPath, 'field.duplicate', `\u5B57\u6BB5\u91CD\u590D\uFF1A${field.field}`)\n seen.add(field.field)\n if (!fieldComponents.has(field.component))\n push(diagnostics, fieldPath, 'field.component', `\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\uFF1A${field.component}`)\n if (field.dict && registry && !registry.dictionaries[field.dict]) {\n push(diagnostics, fieldPath, 'registry.dictionary', `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${field.dict}`)\n }\n if (field.component === 'remoteSelect' && !field.remoteService)\n push(diagnostics, fieldPath, 'field.remoteService', 'remoteSelect \u5FC5\u987B\u6307\u5B9A remoteService')\n if (field.remoteService && registry && !registry.services[field.remoteService])\n push(diagnostics, fieldPath, 'registry.service', `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${field.remoteService}`)\n if (field.component === 'slot' && !field.slot)\n push(diagnostics, fieldPath, 'field.slot', 'slot \u7EC4\u4EF6\u5FC5\u987B\u6307\u5B9A slot key')\n if (field.component === 'repeatable' && !field.itemFields?.length)\n push(\n diagnostics,\n fieldPath,\n 'field.repeatable',\n 'repeatable \u7EC4\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A itemFields \u5B57\u6BB5'\n )\n if (field.itemFields?.length)\n validateFields(\n field.itemFields as FieldSchema[],\n `${fieldPath}/itemFields`,\n registry,\n diagnostics\n )\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n push(diagnostics, fieldPath, 'field.repeatable.range', 'minItems \u4E0D\u80FD\u5927\u4E8E maxItems')\n if (field.slot && registry && !registry.slots[field.slot])\n push(diagnostics, fieldPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`)\n if (field.visibleWhen)\n validateCondition(field.visibleWhen, `${fieldPath}/visibleWhen`, diagnostics)\n if (field.disabledWhen)\n validateCondition(field.disabledWhen, `${fieldPath}/disabledWhen`, diagnostics)\n })\n}\n\nfunction validateActions(\n actions: PageActionSchema[] | undefined,\n path: string,\n registry: BestRegistry | undefined,\n hasRemoveService: boolean,\n diagnostics: SchemaDiagnostic[]\n) {\n actions?.forEach((action, index) => {\n const actionPath = `${path}/${index}`\n if (!action.id) push(diagnostics, actionPath, 'action.missing', '\u52A8\u4F5C id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!builtInEffects.has(action.effect))\n push(diagnostics, actionPath, 'action.effect', `\u4E0D\u652F\u6301\u7684\u52A8\u4F5C\uFF1A${action.effect}`)\n if (action.effect === 'runAction' && !action.action)\n push(diagnostics, actionPath, 'action.key', 'runAction \u5FC5\u987B\u6307\u5B9A action key')\n if (action.effect === 'remove' && !hasRemoveService)\n push(diagnostics, actionPath, 'action.removeService', 'remove \u52A8\u4F5C\u5FC5\u987B\u914D\u7F6E dataSource.remove')\n if (action.effect === 'slot' && !action.slot)\n push(diagnostics, actionPath, 'action.slot', 'slot \u52A8\u4F5C\u5FC5\u987B\u6307\u5B9A slot key')\n if (action.action && registry && !registry.actions[action.action]) {\n push(diagnostics, actionPath, 'registry.action', `\u672A\u6CE8\u518C\u52A8\u4F5C\uFF1A${action.action}`)\n }\n if (action.slot && registry && !registry.slots[action.slot]) {\n push(diagnostics, actionPath, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${action.slot}`)\n }\n })\n}\n\nexport function validateCrudPageSchema(\n schema: CrudPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== CRUD_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${CRUD_SCHEMA_ID}`)\n if (schema.version !== CRUD_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${CRUD_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.title) push(diagnostics, '/title', 'page.title', '\u9875\u9762\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.dataSource?.list)\n push(diagnostics, '/dataSource/list', 'service.list', '\u5217\u8868\u670D\u52A1\u4E0D\u80FD\u4E3A\u7A7A')\n if (schema.dataSource?.list && registry && !registry.listServices[schema.dataSource.list]) {\n push(\n diagnostics,\n '/dataSource/list',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.list}`\n )\n }\n if (schema.dataSource?.detail && registry && !registry.services[schema.dataSource.detail]) {\n push(\n diagnostics,\n '/dataSource/detail',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.detail}`\n )\n }\n if (schema.dataSource?.create && registry && !registry.services[schema.dataSource.create]) {\n push(\n diagnostics,\n '/dataSource/create',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.create}`\n )\n }\n if (schema.dataSource?.update && registry && !registry.services[schema.dataSource.update]) {\n push(\n diagnostics,\n '/dataSource/update',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.update}`\n )\n }\n if (schema.dataSource?.remove && registry && !registry.services[schema.dataSource.remove]) {\n push(\n diagnostics,\n '/dataSource/remove',\n 'registry.service',\n `\u672A\u6CE8\u518C\u670D\u52A1\uFF1A${schema.dataSource.remove}`\n )\n }\n validateFields(schema.search, '/search', registry, diagnostics)\n validateFields(schema.form, '/form', registry, diagnostics)\n if (!schema.table?.rowKey) push(diagnostics, '/table/rowKey', 'table.rowKey', 'rowKey \u4E0D\u80FD\u4E3A\u7A7A')\n if (!schema.table?.columns?.length)\n push(diagnostics, '/table/columns', 'table.columns', '\u81F3\u5C11\u9700\u8981\u4E00\u5217')\n schema.table?.columns?.forEach((column, index) => {\n if (column.fixed !== undefined && column.fixed !== 'left' && column.fixed !== 'right') {\n push(\n diagnostics,\n `/table/columns/${index}/fixed`,\n 'column.fixed',\n `\u4E0D\u652F\u6301\u7684\u56FA\u5B9A\u4F4D\u7F6E\uFF1A${column.fixed}`\n )\n }\n if (column.format && !columnFormats.has(column.format)) {\n push(\n diagnostics,\n `/table/columns/${index}/format`,\n 'column.format',\n `\u4E0D\u652F\u6301\u7684\u683C\u5F0F\uFF1A${column.format}`\n )\n }\n if (column.dict && registry && !registry.dictionaries[column.dict]) {\n push(\n diagnostics,\n `/table/columns/${index}/dict`,\n 'registry.dictionary',\n `\u672A\u6CE8\u518C\u5B57\u5178\uFF1A${column.dict}`\n )\n }\n if (column.slot && registry && !registry.slots[column.slot]) {\n push(\n diagnostics,\n `/table/columns/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${column.slot}`\n )\n }\n })\n if (schema.detail !== undefined) {\n if (\n !schema.detail ||\n typeof schema.detail !== 'object' ||\n !Array.isArray(schema.detail.fields)\n ) {\n push(diagnostics, '/detail', 'detail.type', 'detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4')\n } else {\n schema.detail.fields.forEach((field, index) => {\n if (field.slot && registry && !registry.slots[field.slot])\n push(\n diagnostics,\n `/detail/fields/${index}/slot`,\n 'registry.slot',\n `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`\n )\n })\n }\n }\n validateActions(\n schema.table?.actions,\n '/table/actions',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n validateActions(\n schema.toolbar,\n '/toolbar',\n registry,\n Boolean(schema.dataSource?.remove),\n diagnostics\n )\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry) {\n const result = validateCrudPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n\nexport function validateTabbedPageSchema(\n schema: TabbedPageSchema,\n registry?: BestRegistry\n): SchemaValidationResult {\n const diagnostics: SchemaDiagnostic[] = []\n if (schema.$schema !== TABBED_PAGE_SCHEMA_ID)\n push(diagnostics, '/$schema', 'schema.id', `\u4EC5\u652F\u6301 ${TABBED_PAGE_SCHEMA_ID}`)\n if (schema.version !== TABBED_PAGE_SCHEMA_VERSION)\n push(diagnostics, '/version', 'schema.version', `\u4EC5\u652F\u6301\u7248\u672C ${TABBED_PAGE_SCHEMA_VERSION}`)\n if (!schema.id) push(diagnostics, '/id', 'page.id', '\u9875\u9762 id \u4E0D\u80FD\u4E3A\u7A7A')\n if (!Array.isArray(schema.tabs) || schema.tabs.length === 0) {\n push(diagnostics, '/tabs', 'tabs.required', '\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u9875\u7B7E')\n return { valid: false, diagnostics }\n }\n const keys = new Set<string>()\n schema.tabs.forEach((tab, index) => {\n const path = `/tabs/${index}`\n if (!tab.key) push(diagnostics, path, 'tab.key', '\u9875\u7B7E key \u4E0D\u80FD\u4E3A\u7A7A')\n if (keys.has(tab.key)) push(diagnostics, path, 'tab.duplicate', `\u9875\u7B7E key \u91CD\u590D\uFF1A${tab.key}`)\n keys.add(tab.key)\n if (!tab.label) push(diagnostics, path, 'tab.label', '\u9875\u7B7E\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A')\n if (tab.content.type === 'crud') {\n const result = validateCrudPageSchema(tab.content.schema, registry)\n diagnostics.push(...result.diagnostics.map((item) => ({ ...item, path: `${path}/content/schema${item.path}` })))\n } else if (tab.content.type === 'slot') {\n if (!tab.content.slot) push(diagnostics, path, 'tab.slot', 'slot \u9875\u7B7E\u5FC5\u987B\u6307\u5B9A slot key')\n if (tab.content.slot && registry && !registry.slots[tab.content.slot])\n push(diagnostics, path, 'registry.slot', `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${tab.content.slot}`)\n } else {\n push(diagnostics, path, 'tab.content', '\u4E0D\u652F\u6301\u7684\u9875\u7B7E\u5185\u5BB9\u7C7B\u578B')\n }\n })\n return { valid: diagnostics.length === 0, diagnostics }\n}\n\nexport function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry) {\n const result = validateTabbedPageSchema(schema, registry)\n if (!result.valid) {\n const message = result.diagnostics.map((item) => `${item.path}: ${item.message}`).join('\\n')\n throw new Error(`Schema \u6821\u9A8C\u5931\u8D25\uFF1A\\n${message}`)\n }\n}\n", "import { Tabs } from 'antd'\nimport { useBestRegistry } from '../runtime'\nimport { BestCrudPage } from './BestCrudPage'\nimport type { TabbedPageSchema } from './schema'\nimport { assertValidTabbedPageSchema } from './validate'\n\nexport type BestTabbedPageProps = {\n className?: string\n schema: TabbedPageSchema\n}\n\n/** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */\nexport function BestTabbedPage({ className, schema }: BestTabbedPageProps) {\n const registry = useBestRegistry()\n assertValidTabbedPageSchema(schema, registry)\n const items = schema.tabs\n .filter((tab) => !tab.access || registry.access(tab.access))\n .map((tab) => ({\n key: tab.key,\n label: tab.label,\n destroyOnHidden: tab.destroyOnHidden,\n children:\n tab.content.type === 'crud' ? (\n <BestCrudPage schema={tab.content.schema} />\n ) : (\n registry.slots[tab.content.slot]?.({ pageId: schema.id, tabKey: tab.key }) ?? null\n )\n }))\n return <Tabs className={className} items={items} />\n}\n"],
5
+ "mappings": ";AAAA,OAAO,WAAW;AAKX,SAAS,oBACd,QACA,YAAiC,kBACR;AACzB,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM;AAAA,MAC7C;AAAA,MACA,gBAAgB,OAAO,WAAW,KAAK;AAAA,IACzC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,OAAgB,WAAgC,OAAyB;AAChG,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,gBAAgB,MAAM,WAAW,KAAK,CAAC;AAC5F,MAAI,MAAM,QAAQ,KAAK,KAAK,iBAAiB,KAAM,QAAO;AAC1D,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,gBAAgB,MAAM,WAAW,GAAG,CAAC,CAAC;AAAA,IACzF;AAAA,EACF;AACA,SAAO,UAAU,OAAO,KAAK;AAC/B;AAEA,SAAS,iBAAiB,OAAgB;AACxC,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM,KAAK,SAAY,MAAM,KAAK;AACnF,SAAO;AACT;AAEO,SAAS,sBACd,UAMI,CAAC,GACY;AACjB,QAAM,YAAY,QAAQ,aAAa;AACvC,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,iBAAiB,CAAC,WAChB,QAAQ,kBAAkB,oBAAoB,QAAQ,SAAS,CAAC,KAChE,oBAAoB,QAAQ,SAAS;AAAA,IACvC,iBAAiB,CAAC,QAAQ,WACxB,QAAQ,kBAAkB,oBAAoB,QAAQ,SAAS,GAAG,MAAM,KACxE,oBAAoB,QAAQ,SAAS;AAAA,EACzC;AACF;;;ACpDA,SAAS,UAAAA,SAAQ,SAAAC,QAAO,eAAe;AACvC,OAAOC,YAAW;AAClB,SAAS,aAAa,aAAAC,YAAW,iBAAiB,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACFnF,SAAS,sBAAsB;AAE/B,SAAS,eAAe,YAAY,eAAe;AAmG7C;AA1DN,IAAM,gBAA8B;AAAA,EAClC,cAAc,CAAC;AAAA,EACf,UAAU,CAAC;AAAA,EACX,cAAc,CAAC;AAAA,EACf,SAAS,CAAC;AAAA,EACV,OAAO,CAAC;AAAA,EACR,QAAQ,MAAM;AAChB;AAEA,IAAM,eAA4B;AAAA,EAChC,OAAO;AAAA,IACL,cAAc;AAAA,IACd,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,qBAAqB,cAA4B,aAAa;AAE7D,SAAS,uBAAuB,QAA2C;AAChF,QAAM,SAAuB;AAAA,IAC3B,cAAc,CAAC;AAAA,IACf,UAAU,CAAC;AAAA,IACX,cAAc,CAAC;AAAA,IACf,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,cAAc;AAAA,EACxB;AACA,QAAM,SAAS,CAAC,gBAAgB,YAAY,gBAAgB,WAAW,OAAO;AAC9E,aAAW,SAAS,QAAQ;AAC1B,eAAW,SAAS,QAAQ;AAC1B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG;AAC7D,YAAI,OAAO,OAAO,OAAO,KAAK,GAAG,GAAG,GAAG;AACrC,gBAAM,IAAI,MAAM,kCAAmB,KAAK,IAAI,GAAG,EAAE;AAAA,QACnD;AACA,eAAO,KAAK,EAAE,GAAG,IAAI;AAAA,MACvB;AAAA,IACF;AACA,QAAI,MAAM,QAAQ;AAChB,YAAM,iBAAiB,OAAO;AAC9B,aAAO,SAAS,CAAC,QAAQ,eAAe,GAAG,KAAK,MAAM,SAAS,GAAG,MAAM;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,WAA0C,CAAC,GAAiB;AAC7F,SAAO,oBAAoB,QAAQ;AACrC;AAEO,SAAS,aAAa,EAAE,UAAU,UAAU,MAAM,GAAsB;AAC7E,QAAM,QAAQ,QAAQ,MAAM,mBAAmB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACpE,QAAM,cAAc;AAAA,IAClB,OAAO,EAAE,GAAG,cAAc,GAAG,OAAO,OAAO,EAAE,GAAG,aAAa,OAAO,GAAG,OAAO,MAAM,EAAE;AAAA,IACtF,CAAC,KAAK;AAAA,EACR;AACA,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAC3B,8BAAC,kBAAe,OAAO,aAAc,UAAS,GAChD;AAEJ;AAEO,SAAS,kBAAkB;AAChC,SAAO,WAAW,kBAAkB;AACtC;AAEO,SAAS,eAAe,KAA0B;AACvD,QAAM,UAAU,gBAAgB,EAAE,SAAS,GAAG;AAC9C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,uCAAS,GAAG,EAAE;AAC5C,SAAO;AACT;AAEO,SAAS,mBAAmB,KAA0C;AAC3E,SAAO,gBAAgB,EAAE,aAAa,GAAG;AAC3C;AAEO,SAAS,cAAc,KAAuB;AACnD,QAAM,WAAW,gBAAgB;AACjC,SAAO,MAAM,SAAS,OAAO,GAAG,IAAI;AACtC;AAEO,SAAS,kBAAkB,KAAoC;AACpE,QAAM,eAAe,gBAAgB,EAAE;AACvC,SAAO,MAAO,aAAa,GAAG,KAAK,CAAC,IAAK,CAAC;AAC5C;AAEO,SAAS,cAAc,KAAyB;AACrD,QAAM,SAAS,gBAAgB,EAAE,QAAQ,GAAG;AAC5C,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,uCAAS,GAAG,EAAE;AAC3C,SAAO;AACT;;;ACvIA,SAAS,aAAa;AAEtB,SAAS,qBAAqB,WAAAC,UAAS,gBAAgB;AAqCnD,gBAAAC,YAAA;AAzBJ,SAAS,MAAM,OAAe,WAAmB;AAC/C,QAAM,UAAU,UAAU,QAAQ,cAAc,MAAM;AACtD,QAAM,YAAY,IAAI,OAAO,IAAI,OAAO,GAAG;AAC3C,SAAO,MACJ,MAAM,IAAI,EACV,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO,EACd,IAAI,CAAC,QAAQ,IAAI,MAAM,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;AACjE;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,OAAO,gBAAgB,EAAE,CAAC;AACvE,QAAM,eAAe,SAAS,OAAO,aAAa,OAAO,KAAK;AAC9D,QAAM,SAASD,SAAQ,MAAM,MAAM,cAAc,SAAS,GAAG,CAAC,cAAc,SAAS,CAAC;AAEtF,sBAAoB,KAAK,OAAO,EAAE,gBAAgB,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC;AAE3E,SACE,gBAAAC;AAAA,IAAC,MAAM;AAAA,IAAN;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,MACP,UAAU,CAAC,UAAU;AACnB,cAAM,YAAY,MAAM,OAAO;AAC/B,YAAI,SAAS,KAAM,eAAc,SAAS;AAC1C,mBAAW,WAAW,MAAM,WAAW,SAAS,CAAC;AAAA,MACnD;AAAA;AAAA,EACF;AAEJ;;;ACjDA,SAAS,oBAAoB;AAmBnB,gBAAAC,YAAA;AAVH,SAAS,WAAW,EAAE,QAAQ,SAAS,CAAC,GAAG,SAAS,EAAE,GAAoB;AAC/E,SACE,gBAAAA,KAAC,gBAAa,UAAQ,MAAC,QAAgB,MAAK,SACzC,iBAAO,IAAI,CAAC,UAAU;AACrB,UAAM,QAAQ,aAAa,QAAQ,MAAM,KAAK;AAC9C,UAAM,UAAU,MAAM,SAClB,MAAM,OAAO,OAAO,MAAM,IACzB,MAAM,YAAY,OAAO,KAAK,CAAC,MAC/B,SAAS,QAAQ,UAAU,KAAK,MAAM,OAAO,KAAK;AACvD,WACE,gBAAAA,KAAC,aAAa,MAAb,EAAoC,OAAO,MAAM,OAAO,MAAM,MAAM,MAClE,qBADqB,MAAM,KAE9B;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,aAAa,QAAiC,MAAc;AACnE,MAAI,OAAO,OAAO,QAAQ,IAAI,EAAG,QAAO,OAAO,IAAI;AACnD,SAAO,KAAK,MAAM,GAAG,EAAE,OAAgB,CAAC,SAAS,SAAS;AACxD,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,aAAQ,QAAoC,IAAI;AAAA,IAClD;AACA,WAAO;AAAA,EACT,GAAG,MAAM;AACX;;;ACpCA,SAAS,QAAQ,OAAO,MAAM,kBAAkB;AAyBxC,SAEI,OAAAC,MAFJ;AAZR,SAAS,QAAQ,MAAoB;AACnC,SACE,KAAK,UAAU,WAAW,QAAQ,KAClC,iDAAiD,KAAK,KAAK,GAAG;AAElE;AAEO,SAAS,gBAAgB,EAAE,OAAO,WAAW,GAAyB;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY;AAAA,MACZ,YAAY,CAAC,SACX;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACC,SAAS;AAAA,YACP,gBAAAA,KAAC,UAAsB,MAAK,QAAO,SAAS,MAAM,aAAa,IAAI,GAAG,4BAA1D,UAEZ;AAAA,UACF;AAAA,UAEC;AAAA,oBAAQ,IAAI,IACX,gBAAAA,KAAC,SAAM,KAAK,KAAK,QAAQ,4BAAQ,QAAQ,IAAI,SAAO,MAAC,KAAK,KAAK,KAAK,OAAO,IAAI,IAC7E;AAAA,YACJ,gBAAAA,KAAC,WAAW,MAAX,EAAgB,UAAQ,MAAC,OAAO,EAAE,mBAAmB,QAAQ,IAAI,IAAI,KAAK,EAAE,GAC1E,eAAK,QAAQ,KAAK,KACrB;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;;;ACzCA,SAAS,UAAAC,SAAQ,YAAY,MAAM,SAAAC,QAAO,aAAa,QAAQ,aAAa;AAC5E,OAAOC,YAA2B;AAElC,SAAS,WAAW,WAAAC,UAAS,QAAQ,YAAAC,iBAAgB;AAmJ7C,SAwEA,UAxEA,OAAAC,MAmIA,QAAAC,aAnIA;AA1HR,SAAS,WAAW,MAA8C;AAChE,SAAO,SAAS,SAAY,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACrE;AAEA,SAAS,WAAW,OAA8C;AAChE,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAEA,SAAS,SAAS,OAAkD;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,KAAK,iBAAiB,MAAM;AACxF,WAAO;AAAA,EACT;AACA,MAAIC,OAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,eACP,SACG,UACH;AACA,SAAO,CAAC,GAAG,WAAW,IAAI,GAAG,GAAG,QAAQ;AAC1C;AAEA,SAAS,uBAAuB,QAAiC,OAAe;AAC9E,MAAI,OAAO,OAAO,QAAQ,KAAK,EAAG,QAAO,OAAO,KAAK;AACrD,SAAOC,cAAa,QAAQ,MAAM,MAAM,GAAG,CAAC;AAC9C;AAEA,SAAS,gBAAgB,QAAiC,UAA+B;AACvF,QAAM,aAAaA,cAAa,QAAQ,QAAQ;AAChD,SAAO,SAAS,UAAU,IAAI,EAAE,GAAG,QAAQ,GAAG,WAAW,IAAI;AAC/D;AAEA,SAAS,eACP,OACA,QACA,MACA;AACA,SAAO,CAAC,MAAM,WAAW,CAAC,MAAM,eAAe,kBAAkB,MAAM,aAAa,QAAQ,IAAI;AAClG;AAEA,SAAS,qBACP,OACA,QACA,MACA;AACA,SACE,MAAM,YACN,QAAQ,MAAM,gBAAgB,kBAAkB,MAAM,cAAc,QAAQ,IAAI,CAAC;AAErF;AAEA,SAAS,aAAa,OAA8B;AAClD,MAAID,OAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,iBAAiB,KAAM,QAAOA,OAAM,KAAK;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,KAAK,IAAI,KAAK,KAAK,OAAoB,QAAQ,QAAQ;AAC1E,UAAM,SAASA,OAAM,UAAU;AAC/B,WAAO,OAAO,QAAQ,IAAI,SAAS;AAAA,EACrC;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,SAASA,OAAM,OAAO;AAC5B,WAAO,OAAO,QAAQ,IAAI,SAAS;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAA8B;AAC9D,SAAO,aAAa,KAAK;AAC3B;AAEO,SAAS,uBAAuB,OAAqD;AAC1F,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,QAAM,YAA0C,CAAC,aAAa,MAAM,CAAC,CAAC,GAAG,aAAa,MAAM,CAAC,CAAC,CAAC;AAC/F,SAAO,UAAU,CAAC,KAAK,UAAU,CAAC,IAAI,YAAY;AACpD;AAEO,SAAS,yBAAyB,GAAiB,YAAoB;AAC5E,SAAO,cAAc;AACvB;AAEO,SAAS,8BACd,GACA,aACA;AACA,SAAO,YAAY,CAAC,KAAK,YAAY,CAAC,IAAI,cAAc;AAC1D;AAEA,SAAS,eAAe,OAAqC;AAC3D,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,aAAa,MAAM;AAAA,IACnB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,IAChB,YAAY,MAAM,YAAY,IAAI,CAAC,cAAc,eAAe,SAAS,CAAC;AAAA,EAC5E;AACF;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqF;AACnF,QAAM,WAAW,gBAAgB;AACjC,QAAM,eAAe,eAAe;AACpC,UAAQ,MAAM,WAAW;AAAA,IACvB,KAAK;AACH,aACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO,UAAU,SAAY,QAAQG,cAAa,QAAQ,YAAY,MAAM,KAAK;AAAA,UACjF,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,UACnB,UAAU,CAAC,cAAc;AACvB,gBAAI,SAAU,UAAS,SAAS;AAAA,gBAC3B,MAAK,cAAc,YAAY,MAAM,OAAO,SAAS;AAAA,UAC5D;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,UACnB,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,kBAAkB,KAAK;AAAA,UAC9B,UAAU,CAAC,MAAM,eACf,WAAW,yBAAyB,MAAM,UAAoB,CAAC;AAAA,UAEjE,UAAU,MAAM;AAAA,UAChB,cAAc,CAAC,YAAY,MAAM,YAAY,WAAW,QAAQ,QAAQE,OAAM,GAAG,KAAK;AAAA,UACtF,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF;AAAA,QAAC,WAAW;AAAA,QAAX;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,uBAAuB,KAAK;AAAA,UACnC,UAAU,CAAC,OAAO,gBAChB,WAAW,8BAA8B,OAAO,WAA+B,CAAC;AAAA,UAElF,UAAU,MAAM;AAAA,UAChB,cAAc,CAAC,YAAY,MAAM,YAAY,WAAW,QAAQ,QAAQE,OAAM,GAAG,KAAK;AAAA,UACtF,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF;AAAA,QAACI,OAAM;AAAA,QAAN;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAJ,KAAA,YACG,gBAAM,SAAS;AAAA,QACd,OAAO,MAAM;AAAA,QACb,QAAQ;AAAA,QACR,OAAO,UAAU,SAAY,QAAQG,cAAa,QAAQ,YAAY,MAAM,KAAK;AAAA,QACjF;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,UAAU,CAAC,MAAM,cACf,KAAK;AAAA,UACH,WACI,WAAW,IAAI,IACb,OACA,CAAC,GAAG,WAAW,QAAQ,EAAE,MAAM,GAAG,EAAE,GAAG,IAAI,IAC7C;AAAA,UACJ;AAAA,QACF;AAAA,MACJ,CAAC,GACH;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ;AACE,aACE,gBAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,EAEN;AACF;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,WAAW,YAAY,MAAM;AACnC,SACE,gBAAAJ,KAAC,KAAK,MAAL,EAAU,MAAM,UACd,WAAC,OAAO,EAAE,KAAK,OAAO,MACrB,gBAAAC,MAAA,YACG;AAAA,UAAM,IAAI,CAAC,SACV,gBAAAD;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MATK,KAAK;AAAA,IAUZ,CACD;AAAA,IACD,gBAAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,UAAU,MAAM,aAAa,UAAa,MAAM,UAAU,MAAM;AAAA,QAChE,SAAS,MAAM,IAAI,qBAAqB,MAAM,cAAc,CAAC,GAAG,MAAS,CAAC;AAAA,QAC1E,MAAK;AAAA,QACN;AAAA;AAAA,IAED;AAAA,KACF,GAEJ;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,WAAW,eAAe,UAAU,QAAQ;AAClD,QAAM,aAAaF,cAAa,QAAQ,QAAQ;AAChD,QAAM,cAAc,gBAAgB,QAAQ,QAAQ;AAEpD,YAAU,MAAM;AACd,UAAM,YAAY,QAAQ,CAAC,cAAc;AACvC,UAAI,CAAC,UAAU,gBAAiB;AAChC,YAAM,WAAW,eAAe,UAAU,UAAU,KAAK;AACzD,UACE,CAAC,eAAe,WAAW,aAAa,IAAI,KAC5CA,cAAa,QAAQ,QAAQ,MAAM,QACnC;AACA,aAAK,cAAc,UAAU,MAAS;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,YAAY,MAAM,UAAU,MAAM,aAAa,MAAM,CAAC;AAEhE,SACE,gBAAAF,MAAC,SAAoB,OAAM,SACxB;AAAA,UAAM,YAAY,IAAI,CAAC,cAAc;AACpC,UAAI,CAAC,eAAe,WAAW,aAAa,IAAI,EAAG,QAAO;AAC1D,YAAM,WAAW,eAAe,UAAU,UAAU,KAAK;AACzD,aACE,gBAAAD;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UAEC,OAAO,UAAU;AAAA,UACjB,MAAM,CAAC,UAAU,UAAU,KAAK;AAAA,UAChC,OAAO,WAAW,UAAU,KAAK;AAAA,UAEjC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,GAAG;AAAA,gBACH,UAAU,qBAAqB,WAAW,aAAa,IAAI;AAAA,cAC7D;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA,QAAQ,SAAS,UAAU,IAAI,EAAE,GAAG,QAAQ,GAAG,WAAW,IAAI;AAAA;AAAA,UAChE;AAAA;AAAA,QAfK,UAAU;AAAA,MAgBjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,UAAU,cAAc,MAAM,YAAY;AAAA,QAC1C,SAAS,MAAM,OAAO,QAAQ;AAAA,QAC9B,MAAK;AAAA,QACN;AAAA;AAAA,IAED;AAAA,OA/BU,OAgCZ;AAEJ;AAMA,SAAS,WAAW,EAAE,QAAQ,MAAM,eAAe,OAAO,SAAS,GAAoB;AACrF,QAAM,SACH,KAAK,SAAS,CAAC,GAAG,EAAE,MAAM,UAAU,KAAK,CAAC,KAC3C,iBACA,CAAC;AACH,QAAM,YAAY,CAAC,UACjB,CAAC,MAAM,WAAW,CAAC,MAAM,eAAe,kBAAkB,MAAM,aAAa,QAAQ,IAAI;AAC3F,YAAU,MAAM;AACd,WACG,OAAO,CAAC,UAAU,MAAM,mBAAmB,CAAC,UAAU,KAAK,CAAC,EAC5D,QAAQ,CAAC,UAAU;AAClB,UAAI,OAAO,MAAM,KAAK,MAAM,OAAW,MAAK,cAAc,MAAM,OAAO,MAAS;AAAA,IAClF,CAAC;AAAA,EACL,GAAG,CAAC,QAAQ,MAAM,MAAM,MAAM,CAAC;AAC/B,SACE,gBAAAL,KAAA,YACG,iBACE,OAAO,CAAC,UAAU,UAAU,KAAK,CAAC,EAClC,IAAI,CAAC,UAAU;AACd,UAAM,UACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,UACE,MAAM,YACN,QAAQ,MAAM,gBAAgB,kBAAkB,MAAM,cAAc,QAAQ,IAAI,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MATK,MAAM;AAAA,IAUb;AAEF,WAAO,MAAM,cAAc,eACzB,gBAAAA,KAAC,KAAK,MAAL,EAA4B,OAAO,MAAM,OACvC,qBADa,MAAM,KAEtB,IAEA,gBAAAA;AAAA,MAAC,KAAK;AAAA,MAAL;AAAA,QAEC,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,OAAO,WAAW,MAAM,KAAK;AAAA,QAE5B;AAAA;AAAA,MALI,MAAM;AAAA,IAMb;AAAA,EAEJ,CAAC,GACL;AAEJ;AAEO,SAAS,WAAW,OAA4D;AACrF,SAAO,OAAO;AAAA,IACZ,CAAC,SACC,OAAO;AAAA,MACL,OAAO,QAAQ;AAAA,QACb,UAAU,KAAK;AAAA,QACf,MAAM,KAAK,SAAS,WAAW,SAAY,KAAK;AAAA,QAChD,KAAK,KAAK,OAAO,KAAK;AAAA,QACtB,KAAK,KAAK,OAAO,KAAK;AAAA,QACtB,SAAS,WAAW,KAAK,OAAO;AAAA,QAChC,SAAS,KAAK;AAAA,QACd,WACE,KAAK,SAAS,YACV,OAAO,GAAY,UAAmB;AACpC,cAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI;AAC3D,cAAI,CAAC,OAAO,UAAU,OAAO,KAAK,CAAC;AACjC,kBAAM,IAAI,MAAM,KAAK,WAAW,gCAAO;AAAA,QAC3C,IACA;AAAA,MACR,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,IAC9C;AAAA,EACJ;AACF;AAEA,SAAS,WAAW,SAA6B;AAC/C,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,IAAI,OAAO,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIM,UAAuB,CAAC,CAAC;AACrE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAuB,CAAC,CAAC;AACvE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,EAAE;AACzC,QAAM,mBAAmB,OAAO,CAAC;AACjC,QAAM,oBAAoB,OAAO,CAAC;AAClC,QAAM,UAAU,MAAM,gBAAgB,SAAS,SAAS,MAAM,aAAa,IAAI;AAC/E,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,WAAW,MAAM,YAAY;AAEnC,QAAM,eAAe,CAAC,aAAoC;AACxD,UAAM,MAAM,MAAM,QAAQ,QAAQ,IAC9B,WACE,UAAsD,SACvD,UAAmC,QACpC,CAAC;AACL,WAAO,IAAI,QAAQ,CAAC,SAAS;AAC3B,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,CAAC;AAC/C,YAAM,SAAS;AACf,YAAM,cAAc,OAAO,UAAU;AACrC,UAAI,OAAO,gBAAgB,YAAY,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAChF,aAAO;AAAA,QACL;AAAA,UACE,OAAO,OAAO,OAAO,UAAU,KAAK,eAAe,EAAE;AAAA,UACrD,OAAO;AAAA,UACP,UAAU,QAAQ,OAAO,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAAC,MAAoB,UAAwB;AAChE,UAAM,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC;AACrE,UAAM,QAAQ,CAAC,SAAS;AACtB,aAAO,IAAI,OAAO,KAAK,KAAK,GAAG,IAAI;AAAA,IACrC,CAAC;AACD,WAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,EAC5B;AAEA,QAAM,UAAUC;AAAA,IACd,MAAM,aAAa,gBAAgB,eAAe;AAAA,IAClD,CAAC,gBAAgB,eAAe;AAAA,EAClC;AAEA,YAAU,MAAM;AACd,UAAM,mBAAmB,EAAE,iBAAiB;AAC5C,QAAI,CAAC,SAAS;AACZ,wBAAkB,CAAC,CAAC;AACpB,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,MAChB,qBAAqB,iBAAiB,WAAW,CAAC,WAAW,OAAO;AACtE,UAAM,QAAQ,OAAO,WAAW,YAAY;AAC1C,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB,EAAE,CAAC,WAAW,GAAG,SAAS,MAAM,GAAG,SAAS;AAAA,UAC5C,EAAE,QAAQ,WAAW,OAAO;AAAA,QAC9B;AACA,YAAI,UAAU,EAAG,mBAAkB,aAAa,QAAQ,CAAC;AAAA,MAC3D,QAAQ;AACN,YAAI,UAAU,EAAG,mBAAkB,CAAC,CAAC;AAAA,MACvC,UAAE;AACA,YAAI,UAAU,EAAG,YAAW,KAAK;AAAA,MACnC;AAAA,IACF,GAAG,UAAU;AACb,WAAO,MAAM;AACX,aAAO,aAAa,KAAK;AACzB,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,YAAY,UAAU,aAAa,SAAS,UAAU,CAAC;AAEhF,YAAU,MAAM;AACd,UAAM,mBAAmB,EAAE,kBAAkB;AAC7C,QAAI,CAAC,SAAS;AACZ,yBAAmB,CAAC,CAAC;AACrB;AAAA,IACF;AACA,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,yBAAmB,CAAC,CAAC;AACrB;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,yBAAmB,CAAC,CAAC;AACrB;AAAA,IACF;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,MAChB,qBAAqB,kBAAkB,WAAW,CAAC,WAAW,OAAO;AACvE,UAAM,iBAA6B;AAAA,MACjC,OAAO,OAAO,KAAK;AAAA,MACnB;AAAA,IACF;AACA,uBAAmB,CAAC,cAAc,CAAC;AACnC,SAAK,QAAQ,EAAE,CAAC,UAAU,GAAG,OAAO,MAAM,GAAG,SAAS,GAAG,EAAE,QAAQ,WAAW,OAAO,CAAC,EACnF,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,UAAU,EAAG;AAClB,YAAM,kBAAkB,aAAa,QAAQ;AAC7C,UAAI,gBAAgB,QAAQ;AAC1B,2BAAmB,aAAa,CAAC,cAAc,GAAG,eAAe,CAAC;AAAA,MACpE;AAAA,IACF,CAAC,EACA,MAAM,MAAM,MAAS;AACxB,WAAO,MAAM;AACX,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,SAAS,OAAO,UAAU,CAAC;AAErD,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACC,YAAU;AAAA,MACV,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,wBAAwBO;AAAA,IAC5B,MAAM,qBAAqB,QAAQ,aAAa;AAAA,IAChD,CAAC,QAAQ,aAAa;AAAA,EACxB;AACA,QAAM,gBAAgBA;AAAA,IACpB,MACE,KAAK,UAAU,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,eAAe,KAAK,CAAC,GAAG,qBAAqB,CAAC;AAAA,IAC5F,CAAC,QAAQ,MAAM,qBAAqB;AAAA,EACtC;AACA,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IARK;AAAA,EASP;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+D;AAC7D,QAAM,CAAC,IAAI,IAAI,KAAK,QAAQ;AAC5B,SACE,gBAAAC,MAAC,QAAK,MAAY,eAA8B,QAAO,YAAW,UAAU,UAC1E;AAAA,oBAAAD,KAAC,cAAW,QAAgB,MAAY,eAA8B,MAAY;AAAA,IAClF,gBAAAC,MAAC,SACC;AAAA,sBAAAD,KAACK,SAAA,EAAO,UAAS,UAAS,SAAkB,MAAK,WAC9C,sBACH;AAAA,MACC,WAAW,gBAAAL,KAACK,SAAA,EAAO,SAAS,UAAU,0BAAE,IAAY;AAAA,MACpD;AAAA,OACH;AAAA,KACF;AAEJ;AAEO,SAAS,iBAAiB,QAAwD;AACvF,SAAO,OAAO;AAAA,IACZ,OACG,OAAO,CAAC,UAAU,MAAM,iBAAiB,MAAS,EAClD,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,YAAY,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,qBACP,QACA,eACA;AACA,QAAM,SAAS,mBAAmB,iBAAiB,MAAM,GAAG,aAAa;AACzE,QAAM,iBAAiB,EAAE,GAAG,OAAO;AACnC,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,MAAM,cAAc,gBAAgB,CAAC,MAAM,WAAY;AAC3D,UAAM,QAAmB,MAAM,QAAQ,eAAe,MAAM,KAAK,CAAC,IAC7D,eAAe,MAAM,KAAK,IAC3B,CAAC;AACL,mBAAe,MAAM,KAAK,IAAI,MAAM;AAAA,MAAI,CAAC,SACvC,qBAAqB,MAAM,cAAc,CAAC,GAAG,SAAS,IAAI,IAAI,OAAO,CAAC,CAAC;AAAA,IACzE;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEO,SAAS,mBACd,YACA,YACA;AACA,QAAM,eAAe,EAAE,GAAG,WAAW;AACrC,SAAO,QAAQ,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,QAAI,UAAU,OAAW;AACzB,UAAM,eAAe,aAAa,GAAG;AACrC,QAAI,SAAS,YAAY,KAAK,SAAS,KAAK,GAAG;AAC7C,mBAAa,GAAG,IAAI,mBAAmB,cAAc,KAAK;AAC1D;AAAA,IACF;AACA,iBAAa,GAAG,IAAI;AAAA,EACtB,CAAC;AACD,SAAO;AACT;AAEA,SAASF,cACP,QACA,MACA;AACA,QAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAChD,SAAO,MAAM,OAAgB,CAAC,SAAS,SAAS;AAC9C,QAAI,WAAW,OAAO,YAAY,SAAU,QAAQ,QAAoC,IAAI;AAC5F,WAAO;AAAA,EACT,GAAG,MAAM;AACX;AAEO,SAAS,kBACd,WACA,QACA,MACS;AACT,UAAQ,UAAU,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,uBAAuB,QAAQ,UAAU,KAAK,MAAM,UAAU;AAAA,IACvE,KAAK;AACH,aACE,uBAAuB,QAAQ,UAAU,KAAK,MAAM,UACpD,uBAAuB,QAAQ,UAAU,KAAK,MAAM,QACpD,uBAAuB,QAAQ,UAAU,KAAK,MAAM;AAAA,IAExD,KAAK;AACH,aAAO,SAAS,UAAU;AAAA,IAC5B,KAAK;AACH,aAAO,UAAU,WAAW,MAAM,CAAC,SAAS,kBAAkB,MAAM,QAAQ,IAAI,CAAC;AAAA,IACnF,KAAK;AACH,aAAO,UAAU,WAAW,KAAK,CAAC,SAAS,kBAAkB,MAAM,QAAQ,IAAI,CAAC;AAAA,IAClF,KAAK;AACH,aAAO,CAAC,kBAAkB,UAAU,WAAW,QAAQ,IAAI;AAAA,EAC/D;AACF;;;AChvBA,SAAS,aAAa;AA4BlB,gBAAAK,YAAA;AAbG,SAAS,eAAkD;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,eAAoC,QAAQ,IAAI,CAAC,YAAY;AAAA,IACjE,WAAW,OAAO;AAAA,IAClB,KAAK,OAAO;AAAA,IACZ,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB,EAAE;AACF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,MAAK;AAAA;AAAA,EACP;AAEJ;;;ACrCA,SAAS,QAAQ,aAAa;AAY1B,gBAAAC,YAAA;AAFG,SAAS,WAAW,EAAE,UAAU,MAAM,OAAO,QAAQ,GAAiB;AAC3E,SACE,gBAAAA,KAAC,UAAO,iBAAe,MAAC,MAAY,OAAc,OAAO,KAAK,SAC3D,UACH;AAEJ;AAEO,SAAS,UAAU,EAAE,UAAU,MAAM,OAAO,QAAQ,GAAiB;AAC1E,SACE,gBAAAA,KAAC,SAAM,iBAAe,MAAC,QAAQ,MAAM,MAAY,OAAc,UAAU,SACtE,UACH;AAEJ;;;ACvBA,SAAS,UAAAC,SAAQ,KAAK,cAAAC,aAAY,QAAAC,OAAM,SAAAC,QAAO,eAAAC,cAAa,KAAK,UAAAC,eAAc;AAC/E,OAAOC,YAAW;AAElB,SAAS,aAAAC,YAAW,WAAAC,UAAS,UAAAC,eAAc;AA0DnC,gBAAAC,MA8KE,QAAAC,aA9KF;AAzBR,SAAS,oBACP,QACA,eACA;AACA,SAAO,KAAK,UAAU;AAAA,IACpB,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,aAAa,MAAM;AAAA,MACnB,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB,EAAE;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,EAAE,OAAO,OAAO,UAAU,GAAG,aAAa,GAAsB;AACpF,QAAM,WAAW,gBAAgB;AACjC,UAAQ,MAAM,WAAW;AAAA,IACvB,KAAK;AACH,aACE,gBAAAD;AAAA,QAACE;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ,YAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,UACnB,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU,aAAa,MAAM;AAAA,UAC7B,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,UACnB;AAAA;AAAA,MACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,kBAAkB,KAAK;AAAA,UAC9B,UAAU,CAAC,MAAM,eACf,WAAW,yBAAyB,MAAM,UAAoB,CAAC;AAAA,UAEjE,UAAU,MAAM;AAAA,UAChB,cAAc,CAAC,YAAY,MAAM,YAAY,WAAW,QAAQ,QAAQC,OAAM,GAAG,KAAK;AAAA,UACtF,aAAa,MAAM;AAAA,UACnB,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAL;AAAA,QAACI,YAAW;AAAA,QAAX;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,uBAAuB,KAAK;AAAA,UACnC,UAAU,CAAC,OAAO,gBAChB,WAAW,8BAA8B,OAAO,WAA+B,CAAC;AAAA,UAElF,UAAU,MAAM;AAAA,UAChB,cAAc,CAAC,YAAY,MAAM,YAAY,WAAW,QAAQ,QAAQC,OAAM,GAAG,KAAK;AAAA,UACtF,OAAO,EAAE,OAAO,OAAO;AAAA;AAAA,MACzB;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAL;AAAA,QAACM,OAAM;AAAA,QAAN;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ;AACE,aACE,gBAAAN;AAAA,QAACM;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ,YAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,EAEN;AACF;AAEA,SAAS,WACP,MACA,OACA,QACA;AACA,OAAK,eAAe,OAAO,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,MAAS,CAAC,CAAC,CAAU;AAChG,OAAK,eAAe,KAAc;AACpC;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,gBAAgBC;AAAA,IACpB,MAAM,mBAAmB,iBAAiB,MAAM,GAAG,aAAa;AAAA,IAChE,CAAC,QAAQ,aAAa;AAAA,EACxB;AACA,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IATK,oBAAoB,QAAQ,aAAa;AAAA,EAUhD;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwF;AACtF,QAAM,CAAC,IAAI,IAAIQ,MAAK,QAAQ;AAC5B,QAAM,oBAAoBC,QAA2B,MAAS;AAC9D,QAAM,gBAAgBA,QAAO,KAAK;AAElC,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU,QAAW;AACvB,UAAI,cAAc,SAAS;AACzB,mBAAW,MAAM,CAAC,GAAG,MAAM;AAC3B,0BAAkB,UAAU,KAAK,UAAU,CAAC,CAAC;AAC7C,sBAAc,UAAU;AAAA,MAC1B;AACA;AAAA,IACF;AACA,kBAAc,UAAU;AACxB,UAAM,YAAY,KAAK,UAAU,KAAK;AACtC,QAAI,kBAAkB,YAAY,UAAW;AAC7C,eAAW,MAAM,OAAO,MAAM;AAC9B,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,QAAQ,MAAM,KAAK,CAAC;AAExB,SACE,gBAAAV;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,QAAO;AAAA,MACP,UAAU,CAAC,WAAW,SAAS,MAAiC;AAAA,MAChE,gBAAgB,CAAC,GAAG,WAAW,WAAW,MAAiC;AAAA,MAC3E,WAAU;AAAA,MAEV,0BAAAP,MAAC,OAAI,QAAQ,IAAI,OAAM,UACpB;AAAA,eACE,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,EAC/B,IAAI,CAAC,UACJ,gBAAAD,KAAC,OAAsB,MAAM,MAAM,QAAQ,GACzC,0BAAAA,KAACQ,MAAK,MAAL,EAAU,OAAO,MAAM,OAAO,MAAM,MAAM,OAAO,OAAO,WAAW,MAAM,KAAK,GAC7E,0BAAAR,KAAC,gBAAa,OAAc,GAC9B,KAHQ,MAAM,KAIhB,CACD;AAAA,QACH,gBAAAA,KAAC,OACC,0BAAAC,MAACO,MAAK,MAAL,EACC;AAAA,0BAAAR,KAACW,SAAA,EAAO,UAAS,UAAS,SAAkB,MAAK,WAC9C,sBACH;AAAA,UACA,gBAAAX;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,2BAAW,MAAM,eAAe,MAAM;AACtC,kCAAkB,UAAU,KAAK,UAAU,aAAa;AACxD,2BAAW,aAAa;AACxB,0BAAU,aAAa;AAAA,cACzB;AAAA,cACA,OAAO,EAAE,mBAAmB,EAAE;AAAA,cAC/B;AAAA;AAAA,UAED;AAAA,UACC;AAAA,WACH,GACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACjQA,SAAS,OAAO,QAAQ,YAAY;AAK9B,gBAAAC,YAAA;AAHC,SAAS,YAAY,EAAE,cAAc,qBAAM,GAA6B;AAC7E,SACE,gBAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,KAAK,YAAY,SAAS,GAClE,0BAAAA,KAAC,QAAK,KAAK,aAAa,GAC1B;AAEJ;AAEO,SAAS,UAAU,EAAE,cAAc,2BAAO,GAA6B;AAC5E,SAAO,gBAAAA,KAAC,SAAM,aAA0B;AAC1C;AAEO,SAAS,UAAU,EAAE,cAAc,2BAAO,GAA6B;AAC5E,SAAO,gBAAAA,KAAC,UAAO,QAAO,SAAQ,OAAO,aAAa;AACpD;;;AChBA;AAAA,EAEE;AAAA,OAGK;AA8CH,gBAAAC,aAAA;AA1BJ,IAAM,gBAA2F;AAAA,EAC/F,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,MAAM;AACR;AAEA,SAAS,YAAe,UAAa,OAAyC;AAC5E,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO,EAAE,GAAI,UAAqB,GAAK,SAAS,CAAC,EAAc;AACjE;AAEO,SAAS,UAId;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAAkD;AAChD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,CAAC,sBAAsB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrE;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,YAAY,eAAe,MAAkD;AAAA,MACrF,WACE,cAAc,QACV,QACA;AAAA,QACE,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAG,WAAW;AAAA,UACd,MAAM,EAAE,GAAG,WAAW,QAAQ,MAAM,SAAS,GAAG;AAAA,QAClD;AAAA,MACF;AAAA,MAEN,QAAQ,EAAE,UAAU;AAAA;AAAA,EACtB;AAEJ;;;ACvEA,OAAOC,YAAW;AAClB,OAAO,SAAS;AAIhBA,OAAM,OAAO,GAAG;AAIT,SAAS,gBACd,QACA,MACe;AACf,QAAM,EAAE,SAAS,UAAU,GAAG,QAAQ,IAAI;AAC1C,QAAM,iBAAiB,OAAO;AAAA,IAC5B,OAAO,QAAQ,QAAQ,CAAC,CAAC,EAAE;AAAA,MACzB,CAAC,UACC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,OAAO,YAAY,YAAY,UAAU,IAAI,UAAU;AAAA,IAC7D,UAAU,OAAO,aAAa,YAAY,WAAW,IAAI,WAAW;AAAA,IACpE;AAAA,IACA,GAAI,OAAO,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,IAAI,CAAC;AAAA,EACvE;AACF;AAEO,SAAS,gBAAgB,OAAgB,QAA6C;AAC3F,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,MAAI,CAAC,UAAU,WAAW,OAAQ,QAAO,OAAO,KAAK;AACrD,MAAI,WAAW,SAAS;AACtB,UAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC/D,WAAO,OAAO,SAAS,MAAM,IACzB,IAAI,KAAK,aAAa,SAAS;AAAA,MAC7B,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC,EAAE,OAAO,MAAM,IAChB,OAAO,KAAK;AAAA,EAClB;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,EAAE,iBAAiB,OAAO;AACtF,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,YAAoC;AACxC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,UAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM,KAAK,CAAC;AAC5E,gBACE,OAAO,SAAS,YAAY,KAAK,iBAAiB,IAC9C,KAAK,IAAI,YAAY,KAAK,OACxB,eACA,eAAe,MACjB;AAAA,EACR;AACA,QAAM,OAAOA,OAAM,IAAI,SAAS;AAChC,MAAI,CAAC,KAAK,QAAQ,EAAG,QAAO,OAAO,KAAK;AACxC,SAAO,KAAK,OAAO,WAAW,SAAS,eAAe,qBAAqB;AAC7E;AAEO,SAAS,aAAa,OAAgB,UAA0B;AACrE,SAAO,iBAAiB,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,UAAU;AAC1E;AAEO,SAAS,aAAa,OAAgB,QAA+B;AAC1E,SAAO,QAAQ,WAAY,iBAAiB,gBAAgB,MAAM,SAAS;AAC7E;AAEA,eAAsB,oBACpB,SACA,SACkB;AAClB,SAAO,CAAC,WAAW,QAAQ,OAAO;AACpC;AAEA,eAAsB,iBACpB,QACA,SAIA,SACA,SACkB;AAClB,MAAI,CAAE,MAAM,oBAAoB,SAAS,OAAO,EAAI,QAAO;AAC3D,QAAM,QAAQ,MAAM;AACpB,SAAO;AACT;AAEO,SAAS,wBACd,SACA,SACA;AACA,MAAI,WAAW;AACf,MAAI;AACJ,MAAI,SAA+B,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO,OAAO,EAAE;AAExE,SAAO;AAAA,IACL,MAAM,QAAQ,OAAqD;AACjE,kBAAY,MAAM;AAClB,mBAAa,IAAI,gBAAgB;AACjC,YAAM,oBAAoB;AAC1B,YAAM,kBAAkB,EAAE;AAC1B,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,OAAO,EAAE,QAAQ,kBAAkB,OAAO,CAAC;AAC1E,cAAM,eAAqC;AAAA,UACzC,MAAM,SAAS;AAAA,UACf,SAAS;AAAA,UACT,OAAO,SAAS;AAAA,QAClB;AACA,YAAI,oBAAoB,SAAU,QAAO;AACzC,iBAAS;AACT,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,oBAAoB,YAAY,aAAa,OAAO,kBAAkB,MAAM;AAC9E,iBAAO;AACT,gBAAQ,KAAK;AACb,eAAO,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO,OAAO,EAAE;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,QAAQ;AACN,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF;AACF;;;ACxHO,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAC9B,IAAM,6BAA6B;;;ACmB1C,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,YAAY,SAAS,MAAM,CAAC;AAEnE,SAAS,KAAK,aAAiC,MAAc,MAAcC,UAAiB;AAC1F,cAAY,KAAK,EAAE,MAAM,MAAM,SAAAA,SAAQ,CAAC;AAC1C;AAEA,SAAS,kBAAkB,WAAsB,MAAc,aAAiC;AAC9F,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,SAAK,aAAa,MAAM,kBAAkB,4CAAS;AACnD;AAAA,EACF;AACA,MAAI,UAAU,aAAa,UAAU;AACnC,QAAI,OAAO,UAAU,UAAU,YAAY,UAAU,UAAU,IAAI;AACjE,WAAK,aAAa,MAAM,mBAAmB,+DAAkB;AAAA,IAC/D;AACA;AAAA,EACF;AACA,MAAI,UAAU,aAAa,YAAY;AACrC,QAAI,OAAO,UAAU,UAAU,YAAY,UAAU,UAAU,IAAI;AACjE,WAAK,aAAa,MAAM,mBAAmB,iEAAoB;AAAA,IACjE;AACA;AAAA,EACF;AACA,MAAI,UAAU,aAAa,cAAc;AACvC;AAAA,EACF;AACA,OACG,UAAU,aAAa,SAAS,UAAU,aAAa,SACxD,CAAC,MAAM,QAAQ,UAAU,UAAU,GACnC;AACA,SAAK,aAAa,MAAM,wBAAwB,0EAAwB;AACxE;AAAA,EACF;AACA,MAAI,UAAU,aAAa,SAAS,UAAU,aAAa,MAAM;AAC/D,QAAI,UAAU,WAAW,WAAW,GAAG;AACrC,WAAK,aAAa,MAAM,mBAAmB,gFAAe;AAAA,IAC5D;AACA,cAAU,WAAW,QAAQ,CAAC,MAAM,UAAU;AAC5C,wBAAkB,MAAM,GAAG,IAAI,eAAe,KAAK,IAAI,WAAW;AAAA,IACpE,CAAC;AACD;AAAA,EACF;AACA,MAAI,UAAU,aAAa,OAAO;AAChC,QAAI,CAAC,UAAU,WAAW;AACxB,WAAK,aAAa,MAAM,qBAAqB,oDAAsB;AACnE;AAAA,IACF;AACA,sBAAkB,UAAU,WAAW,GAAG,IAAI,cAAc,WAAW;AACvE;AAAA,EACF;AACA,OAAK,aAAa,MAAM,sBAAsB,6CAAW,UAAqC,QAAQ,EAAE;AAC1G;AAEA,SAAS,eACP,QACA,MACA,UACA,aACA;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,UAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,UAAM,YAAY,GAAG,IAAI,IAAI,KAAK;AAClC,QAAI,CAAC,MAAM,MAAO,MAAK,aAAa,WAAW,iBAAiB,4CAAS;AACzE,QAAI,KAAK,IAAI,MAAM,KAAK;AACtB,WAAK,aAAa,WAAW,mBAAmB,iCAAQ,MAAM,KAAK,EAAE;AACvE,SAAK,IAAI,MAAM,KAAK;AACpB,QAAI,CAAC,gBAAgB,IAAI,MAAM,SAAS;AACtC,WAAK,aAAa,WAAW,mBAAmB,6CAAU,MAAM,SAAS,EAAE;AAC7E,QAAI,MAAM,QAAQ,YAAY,CAAC,SAAS,aAAa,MAAM,IAAI,GAAG;AAChE,WAAK,aAAa,WAAW,uBAAuB,uCAAS,MAAM,IAAI,EAAE;AAAA,IAC3E;AACA,QAAI,MAAM,cAAc,kBAAkB,CAAC,MAAM;AAC/C,WAAK,aAAa,WAAW,uBAAuB,qDAAiC;AACvF,QAAI,MAAM,iBAAiB,YAAY,CAAC,SAAS,SAAS,MAAM,aAAa;AAC3E,WAAK,aAAa,WAAW,oBAAoB,uCAAS,MAAM,aAAa,EAAE;AACjF,QAAI,MAAM,cAAc,UAAU,CAAC,MAAM;AACvC,WAAK,aAAa,WAAW,cAAc,oDAAsB;AACnE,QAAI,MAAM,cAAc,gBAAgB,CAAC,MAAM,YAAY;AACzD;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACF,QAAI,MAAM,YAAY;AACpB;AAAA,QACE,MAAM;AAAA,QACN,GAAG,SAAS;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AACF,QACE,MAAM,aAAa,UACnB,MAAM,aAAa,UACnB,MAAM,WAAW,MAAM;AAEvB,WAAK,aAAa,WAAW,0BAA0B,4CAAwB;AACjF,QAAI,MAAM,QAAQ,YAAY,CAAC,SAAS,MAAM,MAAM,IAAI;AACtD,WAAK,aAAa,WAAW,iBAAiB,uCAAS,MAAM,IAAI,EAAE;AACrE,QAAI,MAAM;AACR,wBAAkB,MAAM,aAAa,GAAG,SAAS,gBAAgB,WAAW;AAC9E,QAAI,MAAM;AACR,wBAAkB,MAAM,cAAc,GAAG,SAAS,iBAAiB,WAAW;AAAA,EAClF,CAAC;AACH;AAEA,SAAS,gBACP,SACA,MACA,UACA,kBACA,aACA;AACA,WAAS,QAAQ,CAAC,QAAQ,UAAU;AAClC,UAAM,aAAa,GAAG,IAAI,IAAI,KAAK;AACnC,QAAI,CAAC,OAAO,GAAI,MAAK,aAAa,YAAY,kBAAkB,0CAAY;AAC5E,QAAI,CAAC,eAAe,IAAI,OAAO,MAAM;AACnC,WAAK,aAAa,YAAY,iBAAiB,6CAAU,OAAO,MAAM,EAAE;AAC1E,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO;AAC3C,WAAK,aAAa,YAAY,cAAc,+CAA2B;AACzE,QAAI,OAAO,WAAW,YAAY,CAAC;AACjC,WAAK,aAAa,YAAY,wBAAwB,+DAAiC;AACzF,QAAI,OAAO,WAAW,UAAU,CAAC,OAAO;AACtC,WAAK,aAAa,YAAY,eAAe,oDAAsB;AACrE,QAAI,OAAO,UAAU,YAAY,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG;AACjE,WAAK,aAAa,YAAY,mBAAmB,uCAAS,OAAO,MAAM,EAAE;AAAA,IAC3E;AACA,QAAI,OAAO,QAAQ,YAAY,CAAC,SAAS,MAAM,OAAO,IAAI,GAAG;AAC3D,WAAK,aAAa,YAAY,iBAAiB,uCAAS,OAAO,IAAI,EAAE;AAAA,IACvE;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBACd,QACA,UACwB;AACxB,QAAM,cAAkC,CAAC;AACzC,MAAI,OAAO,YAAY;AACrB,SAAK,aAAa,YAAY,aAAa,sBAAO,cAAc,EAAE;AACpE,MAAI,OAAO,YAAY;AACrB,SAAK,aAAa,YAAY,kBAAkB,kCAAS,mBAAmB,EAAE;AAChF,MAAI,CAAC,OAAO,GAAI,MAAK,aAAa,OAAO,WAAW,0CAAY;AAChE,MAAI,CAAC,OAAO,MAAO,MAAK,aAAa,UAAU,cAAc,kDAAU;AACvE,MAAI,CAAC,OAAO,YAAY;AACtB,SAAK,aAAa,oBAAoB,gBAAgB,kDAAU;AAClE,MAAI,OAAO,YAAY,QAAQ,YAAY,CAAC,SAAS,aAAa,OAAO,WAAW,IAAI,GAAG;AACzF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,uCAAS,OAAO,WAAW,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,UAAU,YAAY,CAAC,SAAS,SAAS,OAAO,WAAW,MAAM,GAAG;AACzF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,uCAAS,OAAO,WAAW,MAAM;AAAA,IACnC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,UAAU,YAAY,CAAC,SAAS,SAAS,OAAO,WAAW,MAAM,GAAG;AACzF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,uCAAS,OAAO,WAAW,MAAM;AAAA,IACnC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,UAAU,YAAY,CAAC,SAAS,SAAS,OAAO,WAAW,MAAM,GAAG;AACzF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,uCAAS,OAAO,WAAW,MAAM;AAAA,IACnC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,UAAU,YAAY,CAAC,SAAS,SAAS,OAAO,WAAW,MAAM,GAAG;AACzF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,uCAAS,OAAO,WAAW,MAAM;AAAA,IACnC;AAAA,EACF;AACA,iBAAe,OAAO,QAAQ,WAAW,UAAU,WAAW;AAC9D,iBAAe,OAAO,MAAM,SAAS,UAAU,WAAW;AAC1D,MAAI,CAAC,OAAO,OAAO,OAAQ,MAAK,aAAa,iBAAiB,gBAAgB,iCAAa;AAC3F,MAAI,CAAC,OAAO,OAAO,SAAS;AAC1B,SAAK,aAAa,kBAAkB,iBAAiB,sCAAQ;AAC/D,SAAO,OAAO,SAAS,QAAQ,CAAC,QAAQ,UAAU;AAChD,QAAI,OAAO,UAAU,UAAa,OAAO,UAAU,UAAU,OAAO,UAAU,SAAS;AACrF;AAAA,QACE;AAAA,QACA,kBAAkB,KAAK;AAAA,QACvB;AAAA,QACA,yDAAY,OAAO,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,OAAO,UAAU,CAAC,cAAc,IAAI,OAAO,MAAM,GAAG;AACtD;AAAA,QACE;AAAA,QACA,kBAAkB,KAAK;AAAA,QACvB;AAAA,QACA,6CAAU,OAAO,MAAM;AAAA,MACzB;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,YAAY,CAAC,SAAS,aAAa,OAAO,IAAI,GAAG;AAClE;AAAA,QACE;AAAA,QACA,kBAAkB,KAAK;AAAA,QACvB;AAAA,QACA,uCAAS,OAAO,IAAI;AAAA,MACtB;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,YAAY,CAAC,SAAS,MAAM,OAAO,IAAI,GAAG;AAC3D;AAAA,QACE;AAAA,QACA,kBAAkB,KAAK;AAAA,QACvB;AAAA,QACA,uCAAS,OAAO,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,WAAW,QAAW;AAC/B,QACE,CAAC,OAAO,UACR,OAAO,OAAO,WAAW,YACzB,CAAC,MAAM,QAAQ,OAAO,OAAO,MAAM,GACnC;AACA,WAAK,aAAa,WAAW,eAAe,iEAAyB;AAAA,IACvE,OAAO;AACL,aAAO,OAAO,OAAO,QAAQ,CAAC,OAAO,UAAU;AAC7C,YAAI,MAAM,QAAQ,YAAY,CAAC,SAAS,MAAM,MAAM,IAAI;AACtD;AAAA,YACE;AAAA,YACA,kBAAkB,KAAK;AAAA,YACvB;AAAA,YACA,uCAAS,MAAM,IAAI;AAAA,UACrB;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACA;AAAA,IACE,OAAO,OAAO;AAAA,IACd;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,YAAY,MAAM;AAAA,IACjC;AAAA,EACF;AACA;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,YAAY,MAAM;AAAA,IACjC;AAAA,EACF;AACA,SAAO,EAAE,OAAO,YAAY,WAAW,GAAG,YAAY;AACxD;AAEO,SAAS,0BAA0B,QAAwB,UAAyB;AACzF,QAAM,SAAS,uBAAuB,QAAQ,QAAQ;AACtD,MAAI,CAAC,OAAO,OAAO;AACjB,UAAMA,WAAU,OAAO,YAAY,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI;AAC3F,UAAM,IAAI,MAAM;AAAA,EAAiBA,QAAO,EAAE;AAAA,EAC5C;AACF;AAEO,SAAS,yBACd,QACA,UACwB;AACxB,QAAM,cAAkC,CAAC;AACzC,MAAI,OAAO,YAAY;AACrB,SAAK,aAAa,YAAY,aAAa,sBAAO,qBAAqB,EAAE;AAC3E,MAAI,OAAO,YAAY;AACrB,SAAK,aAAa,YAAY,kBAAkB,kCAAS,0BAA0B,EAAE;AACvF,MAAI,CAAC,OAAO,GAAI,MAAK,aAAa,OAAO,WAAW,0CAAY;AAChE,MAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,WAAW,GAAG;AAC3D,SAAK,aAAa,SAAS,iBAAiB,kDAAU;AACtD,WAAO,EAAE,OAAO,OAAO,YAAY;AAAA,EACrC;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,KAAK,QAAQ,CAAC,KAAK,UAAU;AAClC,UAAM,OAAO,SAAS,KAAK;AAC3B,QAAI,CAAC,IAAI,IAAK,MAAK,aAAa,MAAM,WAAW,2CAAa;AAC9D,QAAI,KAAK,IAAI,IAAI,GAAG,EAAG,MAAK,aAAa,MAAM,iBAAiB,sCAAa,IAAI,GAAG,EAAE;AACtF,SAAK,IAAI,IAAI,GAAG;AAChB,QAAI,CAAC,IAAI,MAAO,MAAK,aAAa,MAAM,aAAa,kDAAU;AAC/D,QAAI,IAAI,QAAQ,SAAS,QAAQ;AAC/B,YAAM,SAAS,uBAAuB,IAAI,QAAQ,QAAQ,QAAQ;AAClE,kBAAY,KAAK,GAAG,OAAO,YAAY,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,GAAG,IAAI,kBAAkB,KAAK,IAAI,GAAG,EAAE,CAAC;AAAA,IACjH,WAAW,IAAI,QAAQ,SAAS,QAAQ;AACtC,UAAI,CAAC,IAAI,QAAQ,KAAM,MAAK,aAAa,MAAM,YAAY,oDAAsB;AACjF,UAAI,IAAI,QAAQ,QAAQ,YAAY,CAAC,SAAS,MAAM,IAAI,QAAQ,IAAI;AAClE,aAAK,aAAa,MAAM,iBAAiB,uCAAS,IAAI,QAAQ,IAAI,EAAE;AAAA,IACxE,OAAO;AACL,WAAK,aAAa,MAAM,eAAe,8DAAY;AAAA,IACrD;AAAA,EACF,CAAC;AACD,SAAO,EAAE,OAAO,YAAY,WAAW,GAAG,YAAY;AACxD;AAEO,SAAS,4BAA4B,QAA0B,UAAyB;AAC7F,QAAM,SAAS,yBAAyB,QAAQ,QAAQ;AACxD,MAAI,CAAC,OAAO,OAAO;AACjB,UAAMA,WAAU,OAAO,YAAY,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI;AAC3F,UAAM,IAAI,MAAM;AAAA,EAAiBA,QAAO,EAAE;AAAA,EAC5C;AACF;;;AbmCU,SAqGN,YAAAC,WArGM,OAAAC,OA8IJ,QAAAC,aA9II;AAjVV,SAAS,iBAAiB,QAAiC,QAA2B;AACpF,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AACrD,SAAO,OAAO;AAAA,IACZ,KAAK,QAAQ,CAAC,QAAQ;AACpB,YAAM,QAAQ,OAAO,GAAG;AACxB,aAAO,UAAU,SAAY,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAU;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBAAuB,QAAqB,QAAuB;AAC1E,QAAM,YAAyB,CAAC;AAChC,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,CAAC,OAAO,OAAO,QAAQ,MAAM,KAAK,EAAG;AACzC,UAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,QAAI,MAAM,cAAc,gBAAgB,MAAM,QAAQ,KAAK,KAAK,MAAM,YAAY,QAAQ;AACxF,gBAAU,MAAM,KAAK,IAAI,MAAM;AAAA,QAAI,CAAC,SAClCC,UAAS,IAAI,IAAI,uBAAuB,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;AAAA,MAC1E;AACA;AAAA,IACF;AACA,cAAU,MAAM,KAAK,IAAI;AAAA,EAC3B,CAAC;AACD,SAAO;AACT;AAEO,SAAS,sBACd,QACA,QACA,QACA;AACA,SAAO,EAAE,GAAG,QAAQ,GAAG,iBAAiB,QAAQ,MAAM,EAAE;AAC1D;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,mBACP,QACA,QACA,QACA;AACA,SAAO,SAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,QAAQ,MAAM,EAAE,IAAI;AAClF;AAEA,SAAS,kBACP,OACA,cACA,OACqB;AACrB,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,MAAM,OAAQ,aAAa,MAAM,IAAI,KAAK,CAAC,IAAK,CAAC;AACjE,QAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB;AAAA,IACA,eAAe,MAAM;AAAA,IACrB,aAAa,MAAM;AAAA,IACnB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,YAAY,MAAM,YAAY;AAAA,MAAI,CAAC,SACjC,kBAAkB,MAAqB,cAAc,KAAK;AAAA,IAC5D;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,QAAQ,OAAO,CAAC,YAAY,MAAM,IAAI,IAAI,OAAO,IAAI;AAAA,IACrD,OACE,MAAM,YAAY,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,QAAQ,IACjD,CAAC,EAAE,UAAU,MAAM,SAAS,qBAAM,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,IAC3D;AAAA,EACR;AACF;AAEA,SAAS,UAAU,SAAwB,CAAC,GAAG;AAC7C,QAAM,WAAW,gBAAgB;AACjC,SAAO,OAAO,IAAI,CAAC,UAAU,kBAAkB,OAAO,SAAS,cAAc,SAAS,KAAK,CAAC;AAC9F;AAEA,SAAS,cACP,OACA,YACA,OACiB;AACjB,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,MAAM,OACpB,OAAO;AAAA,KACJ,WAAW,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAC/E,IACA;AACJ,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,QAAQ,OACJ,CAAC,OAAO,WAAW,MAAM,IAAI,IAAI,EAAE,OAAO,MAAM,OAAO,QAAQ,MAAM,CAAC,KAAK,MAC3E;AAAA,EACN;AACF;AAEA,SAAS,cACP,QACA,YACA,OAC8B;AAC9B,QAAM,OAAO,OAAO;AACpB,QAAM,YAAY,OAAO,OACrB,OAAO;AAAA,KACJ,WAAW,OAAO,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,EAC1F,IACA;AACJ,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd;AAAA,IACA,YACE,OAAO,UAAU,CAAC,QAAQ,CAAC,OAAO,OAC9B,CAAC,UAAU,gBAAgB,OAAO,OAAO,MAAM,IAC/C;AAAA,IACN,QAAQ,OACJ,CAAC,QAAQ,WACP,MAAM,IAAI,IAAI;AAAA,MACZ,OAAO,OAAO;AAAA,MACd;AAAA,MACA,OAAO,OAAO,OAAO,KAAK;AAAA,IAC5B,CAAC,KAAK,MACR;AAAA,EACN;AACF;AAEA,SAAS,uBACP,OACA,YAC8B;AAC9B,QAAM,aAAa,MAAM;AACvB,YAAQ,MAAM,WAAW;AAAA,MACvB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG;AACH,QAAM,UAAU,MAAM,OAAQ,WAAW,MAAM,IAAI,KAAK,CAAC,IAAK;AAC9D,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc,MAAM;AAAA,IACpB,YAAY;AAAA,MACV,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,GAAI,MAAM,YAAY,UAClB,EAAE,cAAc,CAAC,YAAyB,QAAQ,QAAQC,OAAM,GAAG,KAAK,EAAE,IAC1E,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAiB;AACtC,SAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,IAAAC,OAAM,QAAQ;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM,MAAM,QAAQ,IAAI;AAAA,MACxB,UAAU,MAAM,QAAQ,KAAK;AAAA,IAC/B,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,aAAa,EAAE,SAAS,WAAW,OAAO,GAAsB;AAC9E,QAAM,WAAW,gBAAgB;AACjC,4BAA0B,QAAQ,QAAQ;AAC1C,QAAM,wBAAwB,mBAAmB,OAAO,WAAW,IAAI;AACvE,MAAI,CAAC,sBAAuB,OAAM,IAAI,MAAM,mDAAW,OAAO,WAAW,IAAI,EAAE;AAC/E,QAAM,cAAc;AAAA,IAClB,OACEC,QACA,YACG;AACH,YAAM,WAAW,MAAM,sBAAsBA,QAAO,OAAO;AAC3D,aAAO,SAAS,WAAW,EAAE,GAAG,UAAU,OAAO,QAAQ,SAAS,SAAS,KAAK,EAAE,IAAI;AAAA,IACxF;AAAA,IACA,CAAC,SAAS,qBAAqB;AAAA,EACjC;AACA,QAAM,eAAe,UAAU,OAAO,MAAM;AAC5C,QAAM,gBACJ,OAAO,eAAe,gBACtB,OAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,cAAc;AACnE,QAAM,aAAa,UAAU,OAAO,IAAI;AACxC,QAAM,YAAYC,QAAmB,MAAS;AAC9C,QAAM,sBAAsBC,SAAQ,MAAM,iBAAiB,YAAY,GAAG,CAAC,YAAY,CAAC;AACxF,QAAM,mBAAmBA;AAAA,IACvB,MAAM,IAAI,IAAI,aAAa,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAAA,IACtD,CAAC,YAAY;AAAA,EACf;AACA,QAAM,wBAAwBA;AAAA,IAC5B,MACE,KAAK;AAAA,MACH,aAAa,IAAI,CAAC,WAAW;AAAA,QAC3B,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB,cAAc,MAAM;AAAA,MACtB,EAAE;AAAA,IACJ;AAAA,IACF,CAAC,YAAY;AAAA,EACf;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAsB,mBAAmB;AACnE,QAAM,WAAWF,QAAoB,mBAAmB;AACxD,QAAM,gBAAgBA,QAAO;AAAA,IAC3B,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIE,UAAsB,EAAE,MAAM,SAAS,CAAC;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,gBAAgBF,QAAO,KAAK;AAElC,QAAM,eAAe;AAAA,IACnB,OAAO,QAA0B,WAAyB;AACxD,UAAI,OAAO,UAAU,CAAC,SAAS,OAAO,OAAO,MAAM,EAAG;AACtD,UAAI,OAAO,WAAW,YAAY,CAAE,MAAM,oBAAoB,OAAO,SAAS,aAAa;AACzF;AACF,UAAI,OAAO,WAAW,aAAc,WAAU,EAAE,MAAM,UAAU,OAAO,CAAC;AACxE,UAAI,OAAO,WAAW,YAAY;AAChC,YAAI,aAAa;AACjB,YAAI,OAAO,WAAW,QAAQ;AAC5B,gBAAM,gBAAgB,SAAS,SAAS,OAAO,WAAW,MAAM;AAChE,cAAI,CAAC,eAAe;AAClB,oBAAQ,MAAM,uCAAS,OAAO,WAAW,MAAM,EAAE;AACjD;AAAA,UACF;AACA,cAAI;AACF,kBAAM,SAAS,MAAM,cAAc,UAAU,CAAC,CAAC;AAC/C,gBAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,oBAAM,mBAAmB,SAAS,aAC9B,QAAQ,WAAW,MAAqB,IACvC;AACL,2BAAa,mBAAmB,QAAQ,kBAAkB,OAAO,MAAM,MAAM;AAAA,YAC/E;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAM,aAAa,OAAO,GAAG,OAAO,KAAK,0EAAc,CAAC;AAChE;AAAA,UACF;AAAA,QACF;AACA,kBAAU,EAAE,MAAM,QAAQ,QAAQ,WAAW,CAAC;AAAA,MAChD;AACA,UAAI,OAAO,WAAW,aAAc,WAAU,EAAE,MAAM,SAAS,CAAC;AAChE,UAAI,OAAO,WAAW,YAAY,OAAO,WAAW,QAAQ;AAC1D,cAAM,gBAAgB,SAAS,SAAS,OAAO,WAAW,MAAM;AAChE,YAAI,CAAC,eAAe;AAClB,kBAAQ,MAAM,uCAAS,OAAO,WAAW,MAAM,EAAE;AACjD;AAAA,QACF;AACA,YAAI;AACF,gBAAM,UAAU,MAAM;AAAA,YACpB,UAAU,CAAC;AAAA,YACX;AAAA,YACA,OAAO,WAAW,2BAAO,OAAO,KAAK;AAAA,YACrC;AAAA,UACF;AACA,cAAI,SAAS;AACX,oBAAQ,QAAQ,0BAAM;AACtB,sBAAU,SAAS,OAAO;AAAA,UAC5B;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,aAAa,OAAO,8DAAY,CAAC;AAAA,QACjD;AAAA,MACF;AACA,UAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAClD,cAAM,YAAY,SAAS,QAAQ,OAAO,MAAM;AAChD,YAAI,CAAC,WAAW;AACd,kBAAQ,MAAM,uCAAS,OAAO,MAAM,EAAE;AACtC;AAAA,QACF;AACA,YAAI;AACF,gBAAM,UAAU,EAAE,OAAO,CAAC;AAC1B,oBAAU,SAAS,OAAO;AAAA,QAC5B,SAAS,OAAO;AACd,kBAAQ,MAAM,aAAa,OAAO,GAAG,OAAO,KAAK,kDAAU,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,UAAU,MAAM;AAAA,EAC5B;AAEA,QAAM,UAAUC,SAAwC,MAAM;AAC5D,UAAM,uBAAuB,gBAAgB,CAAC,IAAK,OAAO,UAAU,CAAC;AACrE,UAAM,gBAAgB,IAAI;AAAA,MACxB,qBAAqB,IAAI,CAAC,UAAU;AAAA,QAClC,MAAM;AAAA,QACN,uBAAuB,OAAO,SAAS,YAAY;AAAA,MACrD,CAAC;AAAA,IACH;AACA,UAAM,oBAAoB,OAAO,MAAM,QAAQ,IAAI,CAAC,WAAW;AAC7D,YAAM,cAAc,cAAc,QAAQ,SAAS,cAAc,SAAS,KAAK;AAC/E,YAAM,eAAe,cAAc,IAAI,OAAO,KAAK;AACnD,UAAI,CAAC,aAAc,QAAO;AAC1B,oBAAc,OAAO,OAAO,KAAK;AACjC,aAAO,EAAE,GAAG,aAAa,GAAG,cAAc,aAAa,MAAM;AAAA,IAC/D,CAAC;AACD,sBAAkB,KAAK,GAAG,cAAc,OAAO,CAAC;AAChD,QAAI,CAAC,OAAO,MAAM,SAAS,OAAQ,QAAO;AAC1C,UAAM,oBAAoB,KAAK,IAAI,KAAK,OAAO,MAAM,QAAQ,SAAS,KAAK,EAAE;AAC7E,sBAAkB,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAAC,GAAG,WACV,OAAO,MAAM,SAAS,IAAI,CAAC,WACzB,gBAAAP,MAAC,gBAAa,QAAgC,QAAgB,WAAW,gBAAtC,OAAO,EAA6C,CACxF;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb;AAAA,EACF,CAAC;AAED,QAAM,cAAcO;AAAA,IAClB,MACE;AAAA,MAAwB;AAAA,MAAa,CAAC,UACpC,QAAQ,MAAM,aAAa,OAAO,GAAG,OAAO,KAAK,8DAAY,CAAC;AAAA,IAChE;AAAA,IACF,CAAC,aAAa,OAAO,KAAK;AAAA,EAC5B;AACA,QAAM,SAAS,OAAO,MAAM;AAC5B,QAAM,UAAU;AAAA,IACd,CAAC,QAAqB,SACpB,YAAY;AAAA,MACV,gBAAgB,EAAE,GAAG,QAAQ,GAAI,gBAAgB,SAAS,UAAU,CAAC,EAAG,GAAG,IAAI;AAAA,IACjF;AAAA,IACF,CAAC,aAAa,aAAa;AAAA,EAC7B;AAEA,kBAAgB,MAAM;AACpB,UAAM,WAAW,cAAc;AAC/B,QAAI,SAAS,aAAa,OAAO,MAAM,SAAS,0BAA0B;AACxE;AAEF,UAAM,oBAAoB,SAAS,aAAa,OAAO,MAAM,CAAC,SAAS;AACvE,UAAM,YAAY,oBACd,sBACA,OAAO;AAAA,MACL,OAAO,QAAQ,SAAS,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,iBAAiB,IAAI,KAAK,CAAC;AAAA,IAClF;AACJ,aAAS,UAAU;AACnB,aAAS,SAAS;AAClB,kBAAc,UAAU;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA,aAAa,oBAAoB,QAAQ,SAAS;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,OAAO,IAAI,qBAAqB,kBAAkB,qBAAqB,CAAC;AAE5E,EAAAE,WAAU,MAAM,MAAM,YAAY,MAAM,GAAG,CAAC,WAAW,CAAC;AAExD,QAAM,aAAa;AAAA,IACjB,OAAO,WAAwB;AAC7B,UAAI,cAAc,QAAS;AAC3B,YAAM,aACJ,OAAO,SAAS,SAAS,OAAO,WAAW,SAAS,OAAO,WAAW;AACxE,UAAI,CAAC,YAAY;AACf,gBAAQ,MAAM,GAAG,OAAO,SAAS,SAAS,iBAAO,cAAI,gCAAO;AAC5D;AAAA,MACF;AACA,YAAM,UAAU,SAAS,SAAS,UAAU;AAC5C,UAAI,CAAC,SAAS;AACZ,gBAAQ,MAAM,uCAAS,UAAU,EAAE;AACnC;AAAA,MACF;AACA,YAAM,SAAS,OAAO,SAAS,WAAW,SAAY,OAAO;AAC7D,YAAM,gBACJ,OAAO,SAAS,SACZ,sBAAsB,uBAAuB,QAAQ,UAAU,GAAG,QAAQ,MAAM,IAChF,uBAAuB,QAAQ,UAAU;AAC/C,oBAAc,UAAU;AACxB,oBAAc,IAAI;AAClB,UAAI;AACF,cAAM,UACJ,OAAO,SAAS,SACX,SAAS,kBAAkB,eAAe,MAAM,KAAK,gBACrD,SAAS,kBAAkB,aAAa,KAAK;AACpD,cAAM,QAAQ,OAAO;AACrB,gBAAQ,QAAQ,0BAAM;AACtB,kBAAU,EAAE,MAAM,SAAS,CAAC;AAC5B,kBAAU,SAAS,OAAO;AAAA,MAC5B,SAAS,OAAO;AACd,gBAAQ,MAAM,aAAa,OAAO,8DAAY,CAAC;AAAA,MACjD,UAAE;AACA,sBAAc,KAAK;AACnB,sBAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,OAAO,WAAW;AAAA,MAClB,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAR,MAAAF,WAAA,EACG;AAAA,qBAAiB,aAAa,SAC7B,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,eAAe;AAAA,QACf,SAAS,CAAC,WAAW;AACnB,mBAAS,UAAU;AACnB,wBAAc,UAAU,EAAE,GAAG,cAAc,SAAS,aAAa,KAAK;AACtE,mBAAS,MAAM;AACf,oBAAU,SAAS,OAAO;AAAA,QAC5B;AAAA,QACA,UAAU,CAAC,WAAW;AAGpB,mBAAS,UAAU;AACnB,wBAAc,UAAU,EAAE,GAAG,cAAc,SAAS,aAAa,KAAK;AACtE,mBAAS,MAAM;AACf,oBAAU,SAAS,OAAO;AAAA,QAC5B;AAAA;AAAA,IACF,IACE;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,EAAE,iBAAiB,MAAM,iBAAiB,OAAO,MAAM,YAAY,GAAG;AAAA,QAClF;AAAA,QACA,QACE,MAAM,QAAQ,MAAM,IAChB,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IACvE;AAAA,QAEN,QAAQ,gBAAgB,QAAQ;AAAA,QAChC,QAAQ,OAAO,MAAM,UAAU,EAAE,GAAG,OAAO,MAAM,QAAQ,IAAI;AAAA,QAC7D,eAAe,MACb,OAAO,SAAS,IAAI,CAAC,WACnB,gBAAAA,MAAC,gBAAa,QAAgC,WAAW,gBAAtB,OAAO,EAA6B,CACxE,KAAK,CAAC;AAAA;AAAA,IAEX;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,OAAO,SAAS;AAAA,QACtB,OACE,OAAO,SAAS,WACZ,GAAG,OAAO,KAAK,iBACf,OAAO,SAAS,SACd,eAAK,OAAO,KAAK,KACjB,eAAK,OAAO,KAAK;AAAA,QAEzB,SAAS,MAAM,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,QAE1C;AAAA,iBAAO,SAAS,WACf,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,QACE,OAAO,QAAQ,OAAO;AAAA,gBAAI,CAAC,UACzB,cAAc,OAAO,SAAS,cAAc,SAAS,KAAK;AAAA,cAC5D,KAAK,CAAC;AAAA,cAER,QAAQ,OAAO;AAAA;AAAA,UACjB,IACE;AAAA,UACH,OAAO,SAAS,UAAU,OAAO,SAAS,WACzC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ;AAAA,cACR,eAAe,OAAO;AAAA,cACtB,SAAS;AAAA,cACT,MAAM,OAAO;AAAA,cACb,UAAU,MAAM,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,cAC5C,UAAU,CAAC,WAAW;AACpB,qBAAK,WAAW,MAAM;AAAA,cACxB;AAAA;AAAA,UACF,IACE;AAAA;AAAA;AAAA,IACN;AAAA,KACF;AAGF,WAAS,aAAa;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,YAAY,CAAC,OAAO,UAAU,SAAS,OAAO,OAAO,MAAM;AACjE,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,OAAO,WAAW,UAAU,OAAO,MAAM;AAC3C,aAAO,SAAS,MAAM,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,KAAK;AAAA,IACtD;AACA,WACE,gBAAAA;AAAA,MAACU;AAAA,MAAA;AAAA,QAEC,MAAM,OAAO,cAAc;AAAA,QAC3B,SAAS,MAAM;AACb,eAAK,UAAU,QAAQ,MAAM;AAAA,QAC/B;AAAA,QAEC,iBAAO;AAAA;AAAA,MANH,OAAO;AAAA,IAOd;AAAA,EAEJ;AACF;;;AcjlBA,SAAS,YAAY;AAuBX,gBAAAC,aAAA;AAXH,SAAS,eAAe,EAAE,WAAW,OAAO,GAAwB;AACzE,QAAM,WAAW,gBAAgB;AACjC,8BAA4B,QAAQ,QAAQ;AAC5C,QAAM,QAAQ,OAAO,KAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,SAAS,OAAO,IAAI,MAAM,CAAC,EAC1D,IAAI,CAAC,SAAS;AAAA,IACb,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,iBAAiB,IAAI;AAAA,IACrB,UACE,IAAI,QAAQ,SAAS,SACnB,gBAAAA,MAAC,gBAAa,QAAQ,IAAI,QAAQ,QAAQ,IAE1C,SAAS,MAAM,IAAI,QAAQ,IAAI,IAAI,EAAE,QAAQ,OAAO,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK;AAAA,EAEpF,EAAE;AACJ,SAAO,gBAAAA,MAAC,QAAK,WAAsB,OAAc;AACnD;",
6
+ "names": ["Button", "Modal", "dayjs", "useEffect", "useMemo", "useRef", "useState", "useMemo", "jsx", "jsx", "jsx", "Button", "Input", "dayjs", "useMemo", "useState", "jsx", "jsxs", "dayjs", "getPathValue", "Input", "Button", "useState", "useMemo", "jsx", "jsx", "Button", "DatePicker", "Form", "Input", "InputNumber", "Select", "dayjs", "useEffect", "useMemo", "useRef", "jsx", "jsxs", "Select", "InputNumber", "DatePicker", "dayjs", "Input", "useMemo", "Form", "useRef", "useEffect", "Button", "jsx", "jsx", "dayjs", "message", "Fragment", "jsx", "jsxs", "isRecord", "dayjs", "Modal", "query", "useRef", "useMemo", "useState", "useEffect", "Button", "jsx"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ import type { TabbedPageSchema } from './schema';
2
+ export type BestTabbedPageProps = {
3
+ className?: string;
4
+ schema: TabbedPageSchema;
5
+ };
6
+ /** Renders declarative tabs whose contents are either a CRUD schema or a registered slot. */
7
+ export declare function BestTabbedPage({ className, schema }: BestTabbedPageProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=BestTabbedPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BestTabbedPage.d.ts","sourceRoot":"","sources":["../../src/lowcode/BestTabbedPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAGhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,mBAAmB,+BAiBxE"}
@@ -1,9 +1,11 @@
1
1
  export { createBestCrudAdapter, normalizeBestValues } from './adapter';
2
2
  export type { BestCrudPageProps, CrudDataAdapter } from './BestCrudPage';
3
3
  export { BestCrudPage } from './BestCrudPage';
4
+ export type { BestTabbedPageProps } from './BestTabbedPage';
5
+ export { BestTabbedPage } from './BestTabbedPage';
4
6
  export type { BestListQuery, BestListResult, BestListService } from './list';
5
- export type { Condition, CrudPageSchema, DetailFieldSchema, FieldSchema, FormMode, PageActionButtonType, PageActionSchema, TableColumnSchema } from './schema';
6
- export { CRUD_SCHEMA_ID, CRUD_SCHEMA_VERSION } from './schema';
7
+ export type { Condition, CrudPageSchema, DetailFieldSchema, FieldSchema, FormMode, PageActionButtonType, PageActionSchema, TableColumnSchema, TabContentSchema, TabbedPageSchema, TabSchema } from './schema';
8
+ export { CRUD_SCHEMA_ID, CRUD_SCHEMA_VERSION, TABBED_PAGE_SCHEMA_ID, TABBED_PAGE_SCHEMA_VERSION } from './schema';
7
9
  export type { SchemaDiagnostic, SchemaValidationResult } from './validate';
8
- export { assertValidCrudPageSchema, validateCrudPageSchema } from './validate';
10
+ export { assertValidCrudPageSchema, assertValidTabbedPageSchema, validateCrudPageSchema, validateTabbedPageSchema } from './validate';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lowcode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACtE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAC5E,YAAY,EACV,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9D,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lowcode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACtE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAC5E,YAAY,EACV,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACV,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,UAAU,CAAA;AACjB,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import type { BestFieldComponent, BestFieldRule } from '../ui/types';
2
2
  export declare const CRUD_SCHEMA_ID: "https://best.dev/schema/crud/v1";
3
3
  export declare const CRUD_SCHEMA_VERSION: 1;
4
+ export declare const TABBED_PAGE_SCHEMA_ID: "https://best.dev/schema/tabs/v1";
5
+ export declare const TABBED_PAGE_SCHEMA_VERSION: 1;
4
6
  export type Condition = {
5
7
  operator: 'equals';
6
8
  field: string;
@@ -109,4 +111,27 @@ export type CrudPageSchema = {
109
111
  generatedAt?: string;
110
112
  };
111
113
  };
114
+ export type TabContentSchema = {
115
+ type: 'crud';
116
+ schema: CrudPageSchema;
117
+ } | {
118
+ type: 'slot';
119
+ slot: string;
120
+ };
121
+ export type TabSchema = {
122
+ key: string;
123
+ label: string;
124
+ access?: string;
125
+ /** Defaults to true so inactive CRUD pages do not fetch until selected. */
126
+ destroyOnHidden?: boolean;
127
+ content: TabContentSchema;
128
+ };
129
+ /** A page composition schema with runtime-owned tab navigation. */
130
+ export type TabbedPageSchema = {
131
+ $schema: typeof TABBED_PAGE_SCHEMA_ID;
132
+ version: typeof TABBED_PAGE_SCHEMA_VERSION;
133
+ id: string;
134
+ kind: 'tabs';
135
+ tabs: TabSchema[];
136
+ };
112
137
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lowcode/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lowcode/schema.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { BestRegistry } from '../runtime';
2
- import { type CrudPageSchema } from './schema';
2
+ import { type CrudPageSchema, type TabbedPageSchema } from './schema';
3
3
  export type SchemaDiagnostic = {
4
4
  path: string;
5
5
  code: string;
@@ -11,4 +11,6 @@ export type SchemaValidationResult = {
11
11
  };
12
12
  export declare function validateCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry): SchemaValidationResult;
13
13
  export declare function assertValidCrudPageSchema(schema: CrudPageSchema, registry?: BestRegistry): void;
14
+ export declare function validateTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry): SchemaValidationResult;
15
+ export declare function assertValidTabbedPageSchema(schema: TabbedPageSchema, registry?: BestRegistry): void;
14
16
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lowcode/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAIL,KAAK,cAAc,EAGpB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAChC,CAAA;AA0JD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,sBAAsB,CA2HxB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,YAAY,QAMxF"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lowcode/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAIL,KAAK,cAAc,EAKnB,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAChC,CAAA;AA0JD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,sBAAsB,CA2HxB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,YAAY,QAMxF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,CAAC,EAAE,YAAY,GACtB,sBAAsB,CA8BxB;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,YAAY,QAM5F"}
@@ -10,6 +10,8 @@ export type BestService = (params: Record<string, unknown>, options?: {
10
10
  signal?: AbortSignal;
11
11
  }) => Promise<unknown>;
12
12
  export type BestSlotContext = {
13
+ pageId?: string;
14
+ tabKey?: string;
13
15
  field?: string;
14
16
  record?: Record<string, unknown>;
15
17
  value?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"BestProvider.d.ts","sourceRoot":"","sources":["../../src/runtime/BestProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAC9F,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC/B,OAAO,CAAC,OAAO,CAAC,CAAA;AACrB,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,SAAS,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAC7C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAA;IACtF,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,GAAG;IACtE,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;CAChC,CAAA;AAqBD,wBAAgB,mBAAmB,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAyBhF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,iBAAiB,CAAC,UAAU,CAAM,GAAG,YAAY,CAE7F;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,+BAW5E;AAED,wBAAgB,eAAe,iBAE9B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAIvD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE3E;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAGpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAIrD"}
1
+ {"version":3,"file":"BestProvider.d.ts","sourceRoot":"","sources":["../../src/runtime/BestProvider.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-lowcode-runtime",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "BEST React low-code runtime, CRUD page renderer, and UI components.",
5
5
  "keywords": [
6
6
  "best",
@@ -30,12 +30,6 @@
30
30
  },
31
31
  "./style.css": "./dist/index.css"
32
32
  },
33
- "scripts": {
34
- "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
35
- "check": "tsc -p tsconfig.json --noEmit",
36
- "prepack": "pnpm run build",
37
- "test": "vitest run"
38
- },
39
33
  "peerDependencies": {
40
34
  "@ant-design/pro-components": "^3.1.5-0",
41
35
  "antd": "^6.2.1",
@@ -52,5 +46,10 @@
52
46
  "publishConfig": {
53
47
  "access": "public",
54
48
  "registry": "https://registry.npmjs.org/"
49
+ },
50
+ "scripts": {
51
+ "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
52
+ "check": "tsc -p tsconfig.json --noEmit",
53
+ "test": "vitest run"
55
54
  }
56
- }
55
+ }