best-lowcode-runtime 0.2.0 → 0.2.2

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 CHANGED
@@ -27,16 +27,47 @@ function push(diagnostics, path, code, message) {
27
27
  diagnostics.push({ path, code, message });
28
28
  }
29
29
  function validateCondition(condition, path, diagnostics) {
30
- if ((condition.operator === "and" || condition.operator === "or") && condition.conditions.length === 0) {
31
- push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
30
+ if (!condition || typeof condition !== "object") {
31
+ push(diagnostics, path, "condition.type", "\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61");
32
+ return;
33
+ }
34
+ if (condition.operator === "equals") {
35
+ if (typeof condition.field !== "string" || condition.field === "") {
36
+ push(diagnostics, path, "condition.field", "equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
37
+ }
38
+ return;
39
+ }
40
+ if (condition.operator === "notEmpty") {
41
+ if (typeof condition.field !== "string" || condition.field === "") {
42
+ push(diagnostics, path, "condition.field", "notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
43
+ }
44
+ return;
45
+ }
46
+ if (condition.operator === "modeEquals") {
47
+ return;
48
+ }
49
+ if ((condition.operator === "and" || condition.operator === "or") && !Array.isArray(condition.conditions)) {
50
+ push(diagnostics, path, "condition.conditions", "\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4");
51
+ return;
32
52
  }
33
53
  if (condition.operator === "and" || condition.operator === "or") {
54
+ if (condition.conditions.length === 0) {
55
+ push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
56
+ }
34
57
  condition.conditions.forEach((item, index) => {
35
58
  validateCondition(item, `${path}/conditions/${index}`, diagnostics);
36
59
  });
60
+ return;
37
61
  }
38
- if (condition.operator === "not")
62
+ if (condition.operator === "not") {
63
+ if (!condition.condition) {
64
+ push(diagnostics, path, "condition.missing", "not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition");
65
+ return;
66
+ }
39
67
  validateCondition(condition.condition, `${path}/condition`, diagnostics);
68
+ return;
69
+ }
70
+ push(diagnostics, path, "condition.operator", `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${condition.operator}`);
40
71
  }
41
72
  function validateFields(fields, path, registry, diagnostics) {
42
73
  const seen = /* @__PURE__ */ new Set();
@@ -182,15 +213,21 @@ function validateCrudPageSchema(schema, registry) {
182
213
  );
183
214
  }
184
215
  });
185
- schema.detail?.fields.forEach((field, index) => {
186
- if (field.slot && registry && !registry.slots[field.slot])
187
- push(
188
- diagnostics,
189
- `/detail/fields/${index}/slot`,
190
- "registry.slot",
191
- `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
192
- );
193
- });
216
+ if (schema.detail !== void 0) {
217
+ if (!schema.detail || typeof schema.detail !== "object" || !Array.isArray(schema.detail.fields)) {
218
+ push(diagnostics, "/detail", "detail.type", "detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4");
219
+ } else {
220
+ schema.detail.fields.forEach((field, index) => {
221
+ if (field.slot && registry && !registry.slots[field.slot])
222
+ push(
223
+ diagnostics,
224
+ `/detail/fields/${index}/slot`,
225
+ "registry.slot",
226
+ `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
227
+ );
228
+ });
229
+ }
230
+ }
194
231
  validateActions(
195
232
  schema.table?.actions,
196
233
  "/table/actions",
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 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 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}\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 (\n (condition.operator === 'and' || condition.operator === 'or') &&\n condition.conditions.length === 0\n ) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n }\n if (condition.operator === 'not')\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\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.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 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 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\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 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 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}\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.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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",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -140,11 +140,20 @@ import { Descriptions } from "antd";
140
140
  import { jsx as jsx3 } from "react/jsx-runtime";
141
141
  function BestDetail({ fields, record = {}, column = 2 }) {
142
142
  return /* @__PURE__ */ jsx3(Descriptions, { bordered: true, column, size: "small", children: fields.map((field) => {
143
- const value = record[field.field];
143
+ const value = getPathValue(record, field.field);
144
144
  const display = field.render ? field.render(value, record) : field.valueEnum?.[String(value)] ?? (value == null || value === "" ? "-" : String(value));
145
145
  return /* @__PURE__ */ jsx3(Descriptions.Item, { label: field.label, span: field.span, children: display }, field.field);
146
146
  }) });
147
147
  }
148
+ function getPathValue(values, path) {
149
+ if (Object.hasOwn(values, path)) return values[path];
150
+ return path.split(".").reduce((current, part) => {
151
+ if (current && typeof current === "object") {
152
+ return current[part];
153
+ }
154
+ return void 0;
155
+ }, values);
156
+ }
148
157
 
149
158
  // src/ui/BestFilePreview.tsx
150
159
  import { Button, Image, List, Typography } from "antd";
@@ -197,10 +206,10 @@ function appendNamePath(path, ...segments) {
197
206
  }
198
207
  function getConditionFieldValue(values, field) {
199
208
  if (Object.hasOwn(values, field)) return values[field];
200
- return getPathValue(values, field.split("."));
209
+ return getPathValue2(values, field.split("."));
201
210
  }
202
211
  function getScopedValues(values, itemPath) {
203
- const itemValues = getPathValue(values, itemPath);
212
+ const itemValues = getPathValue2(values, itemPath);
204
213
  return isRecord(itemValues) ? { ...values, ...itemValues } : values;
205
214
  }
206
215
  function isFieldVisible(field, values, mode) {
@@ -284,7 +293,7 @@ function FormControl({
284
293
  RemoteSelect,
285
294
  {
286
295
  field,
287
- value: value !== void 0 ? value : getPathValue(values, namePath ?? field.field),
296
+ value: value !== void 0 ? value : getPathValue2(values, namePath ?? field.field),
288
297
  disabled: field.disabled,
289
298
  placeholder: field.placeholder,
290
299
  onChange: (nextValue) => {
@@ -300,7 +309,12 @@ function FormControl({
300
309
  {
301
310
  ...controlProps,
302
311
  value,
303
- onChange,
312
+ onChange: (nextValue) => {
313
+ onChange?.(nextValue);
314
+ const fieldPath = namePath ?? field.field;
315
+ form.setFieldValue(fieldPath, nextValue);
316
+ void form.validateFields([fieldPath]).catch(() => void 0);
317
+ },
304
318
  disabled: field.disabled,
305
319
  placeholder: field.placeholder,
306
320
  style: { width: "100%" }
@@ -314,6 +328,7 @@ function FormControl({
314
328
  value: toDatePickerValue(value),
315
329
  onChange: (date, dateString) => onChange?.(serializeDatePickerValue(date, dateString)),
316
330
  disabled: field.disabled,
331
+ disabledDate: (current) => field.maxDate === "today" && current.isAfter(dayjs2(), "day"),
317
332
  style: { width: "100%" }
318
333
  }
319
334
  );
@@ -325,6 +340,7 @@ function FormControl({
325
340
  value: toDateRangePickerValue(value),
326
341
  onChange: (dates, dateStrings) => onChange?.(serializeDateRangePickerValue(dates, dateStrings)),
327
342
  disabled: field.disabled,
343
+ disabledDate: (current) => field.maxDate === "today" && current.isAfter(dayjs2(), "day"),
328
344
  style: { width: "100%" }
329
345
  }
330
346
  );
@@ -343,7 +359,7 @@ function FormControl({
343
359
  return /* @__PURE__ */ jsx5(Fragment, { children: field.render?.({
344
360
  field: field.field,
345
361
  values: renderValues,
346
- value: value !== void 0 ? value : getPathValue(values, namePath ?? field.field),
362
+ value: value !== void 0 ? value : getPathValue2(values, namePath ?? field.field),
347
363
  mode,
348
364
  disabled: field.disabled,
349
365
  setValue: (name, nextValue) => form.setFieldValue(
@@ -422,13 +438,13 @@ function RepeatableFieldRow({
422
438
  values
423
439
  }) {
424
440
  const itemPath = appendNamePath(listName, itemName);
425
- const itemValues = getPathValue(values, itemPath);
441
+ const itemValues = getPathValue2(values, itemPath);
426
442
  const scopeValues = getScopedValues(values, itemPath);
427
443
  useEffect(() => {
428
444
  field.itemFields?.forEach((itemField) => {
429
445
  if (!itemField.clearWhenHidden) return;
430
446
  const nextPath = appendNamePath(itemPath, itemField.field);
431
- if (!isFieldVisible(itemField, scopeValues, mode) && getPathValue(values, nextPath) !== void 0) {
447
+ if (!isFieldVisible(itemField, scopeValues, mode) && getPathValue2(values, nextPath) !== void 0) {
432
448
  form.setFieldValue(nextPath, void 0);
433
449
  }
434
450
  });
@@ -733,7 +749,7 @@ function mergeDefinedValues(baseValues, nextValues) {
733
749
  });
734
750
  return mergedValues;
735
751
  }
736
- function getPathValue(values, path) {
752
+ function getPathValue2(values, path) {
737
753
  const parts = Array.isArray(path) ? path : [path];
738
754
  return parts.reduce((current, part) => {
739
755
  if (current && typeof current === "object") return current[part];
@@ -1180,16 +1196,47 @@ function push(diagnostics, path, code, message2) {
1180
1196
  diagnostics.push({ path, code, message: message2 });
1181
1197
  }
1182
1198
  function validateCondition(condition, path, diagnostics) {
1183
- if ((condition.operator === "and" || condition.operator === "or") && condition.conditions.length === 0) {
1184
- push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
1199
+ if (!condition || typeof condition !== "object") {
1200
+ push(diagnostics, path, "condition.type", "\u6761\u4EF6\u5FC5\u987B\u662F\u5BF9\u8C61");
1201
+ return;
1202
+ }
1203
+ if (condition.operator === "equals") {
1204
+ if (typeof condition.field !== "string" || condition.field === "") {
1205
+ push(diagnostics, path, "condition.field", "equals \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
1206
+ }
1207
+ return;
1208
+ }
1209
+ if (condition.operator === "notEmpty") {
1210
+ if (typeof condition.field !== "string" || condition.field === "") {
1211
+ push(diagnostics, path, "condition.field", "notEmpty \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A\u5B57\u6BB5\u540D");
1212
+ }
1213
+ return;
1214
+ }
1215
+ if (condition.operator === "modeEquals") {
1216
+ return;
1217
+ }
1218
+ if ((condition.operator === "and" || condition.operator === "or") && !Array.isArray(condition.conditions)) {
1219
+ push(diagnostics, path, "condition.conditions", "\u7EC4\u5408\u6761\u4EF6\u5FC5\u987B\u6307\u5B9A conditions \u6570\u7EC4");
1220
+ return;
1185
1221
  }
1186
1222
  if (condition.operator === "and" || condition.operator === "or") {
1223
+ if (condition.conditions.length === 0) {
1224
+ push(diagnostics, path, "condition.empty", "\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6");
1225
+ }
1187
1226
  condition.conditions.forEach((item, index) => {
1188
1227
  validateCondition(item, `${path}/conditions/${index}`, diagnostics);
1189
1228
  });
1229
+ return;
1190
1230
  }
1191
- if (condition.operator === "not")
1231
+ if (condition.operator === "not") {
1232
+ if (!condition.condition) {
1233
+ push(diagnostics, path, "condition.missing", "not \u6761\u4EF6\u5FC5\u987B\u6307\u5B9A condition");
1234
+ return;
1235
+ }
1192
1236
  validateCondition(condition.condition, `${path}/condition`, diagnostics);
1237
+ return;
1238
+ }
1239
+ push(diagnostics, path, "condition.operator", `\u4E0D\u652F\u6301\u7684\u6761\u4EF6\uFF1A${condition.operator}`);
1193
1240
  }
1194
1241
  function validateFields(fields, path, registry, diagnostics) {
1195
1242
  const seen = /* @__PURE__ */ new Set();
@@ -1335,15 +1382,21 @@ function validateCrudPageSchema(schema, registry) {
1335
1382
  );
1336
1383
  }
1337
1384
  });
1338
- schema.detail?.fields.forEach((field, index) => {
1339
- if (field.slot && registry && !registry.slots[field.slot])
1340
- push(
1341
- diagnostics,
1342
- `/detail/fields/${index}/slot`,
1343
- "registry.slot",
1344
- `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
1345
- );
1346
- });
1385
+ if (schema.detail !== void 0) {
1386
+ if (!schema.detail || typeof schema.detail !== "object" || !Array.isArray(schema.detail.fields)) {
1387
+ push(diagnostics, "/detail", "detail.type", "detail \u5FC5\u987B\u5305\u542B fields \u5BF9\u8C61\u6570\u7EC4");
1388
+ } else {
1389
+ schema.detail.fields.forEach((field, index) => {
1390
+ if (field.slot && registry && !registry.slots[field.slot])
1391
+ push(
1392
+ diagnostics,
1393
+ `/detail/fields/${index}/slot`,
1394
+ "registry.slot",
1395
+ `\u672A\u6CE8\u518C\u63D2\u69FD\uFF1A${field.slot}`
1396
+ );
1397
+ });
1398
+ }
1399
+ }
1347
1400
  validateActions(
1348
1401
  schema.table?.actions,
1349
1402
  "/table/actions",
@@ -1371,6 +1424,40 @@ ${message2}`);
1371
1424
 
1372
1425
  // src/lowcode/BestCrudPage.tsx
1373
1426
  import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
1427
+ function pickRowKeyValues(record, rowKey) {
1428
+ if (!record) return {};
1429
+ const keys = Array.isArray(rowKey) ? rowKey : [rowKey];
1430
+ return Object.fromEntries(
1431
+ keys.flatMap((key) => {
1432
+ const value = record[key];
1433
+ return value === void 0 ? [] : [[key, value]];
1434
+ })
1435
+ );
1436
+ }
1437
+ function projectSubmittedValues(values, fields) {
1438
+ const projected = {};
1439
+ fields.forEach((field) => {
1440
+ if (!Object.hasOwn(values, field.field)) return;
1441
+ const value = values[field.field];
1442
+ if (field.component === "repeatable" && Array.isArray(value) && field.itemFields?.length) {
1443
+ projected[field.field] = value.map(
1444
+ (item) => isRecord2(item) ? projectSubmittedValues(item, field.itemFields ?? []) : item
1445
+ );
1446
+ return;
1447
+ }
1448
+ projected[field.field] = value;
1449
+ });
1450
+ return projected;
1451
+ }
1452
+ function buildCrudSubmitValues(values, record, rowKey) {
1453
+ return { ...values, ...pickRowKeyValues(record, rowKey) };
1454
+ }
1455
+ function isRecord2(value) {
1456
+ return !!value && typeof value === "object" && !Array.isArray(value);
1457
+ }
1458
+ function mergeRecordForEdit(record, detail, rowKey) {
1459
+ return record ? { ...record, ...detail, ...pickRowKeyValues(record, rowKey) } : detail;
1460
+ }
1374
1461
  function toFieldDefinition(field, dictionaries, slots) {
1375
1462
  const slot = field.slot;
1376
1463
  const options = field.dict ? dictionaries[field.dict] ?? [] : [];
@@ -1423,6 +1510,7 @@ function toDetailField(field, dictionary, slots) {
1423
1510
  };
1424
1511
  }
1425
1512
  function toTableColumn(column, dictionary, slots) {
1513
+ const slot = column.slot;
1426
1514
  const valueEnum = column.dict ? Object.fromEntries(
1427
1515
  (dictionary[column.dict] ?? []).map((item) => [String(item.value), { text: item.label }])
1428
1516
  ) : void 0;
@@ -1432,7 +1520,12 @@ function toTableColumn(column, dictionary, slots) {
1432
1520
  title: column.title,
1433
1521
  width: column.width,
1434
1522
  valueEnum,
1435
- render: (value, record) => column.slot ? slots[column.slot]?.({ field: column.field, record, value }) ?? "-" : formatCrudValue(value, column.format)
1523
+ renderText: column.format && !slot && !column.dict ? (value) => formatCrudValue(value, column.format) : void 0,
1524
+ render: slot ? (_value, record) => slots[slot]?.({
1525
+ field: column.field,
1526
+ record,
1527
+ value: record[column.field]
1528
+ }) ?? "-" : void 0
1436
1529
  };
1437
1530
  }
1438
1531
  function toProTableSearchColumn(field, dictionary) {
@@ -1533,7 +1626,8 @@ function BestCrudPage({ adapter, className, schema }) {
1533
1626
  try {
1534
1627
  const detail = await detailService(record ?? {});
1535
1628
  if (detail && typeof detail === "object" && !Array.isArray(detail)) {
1536
- editRecord = adapter?.fromDetail ? adapter.fromDetail(detail) : detail;
1629
+ const normalizedDetail = adapter?.fromDetail ? adapter.fromDetail(detail) : detail;
1630
+ editRecord = mergeRecordForEdit(record, normalizedDetail, schema.table.rowKey);
1537
1631
  }
1538
1632
  } catch (error) {
1539
1633
  message.error(errorMessage(error, `${schema.title}\u8BE6\u60C5\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5`));
@@ -1619,6 +1713,7 @@ function BestCrudPage({ adapter, className, schema }) {
1619
1713
  ),
1620
1714
  [listService, schema.title]
1621
1715
  );
1716
+ const rowKey = schema.table.rowKey;
1622
1717
  const request = useCallback(
1623
1718
  (params, sort) => pageRequest.request(
1624
1719
  toBestListQuery({ ...params, ...useBestSearch ? queryRef.current : {} }, sort)
@@ -1642,7 +1737,6 @@ function BestCrudPage({ adapter, className, schema }) {
1642
1737
  };
1643
1738
  }, [schema.id, searchDefaultValues, searchFieldNames, searchSchemaSignature]);
1644
1739
  useEffect3(() => () => pageRequest.abort(), [pageRequest]);
1645
- const rowKey = schema.table.rowKey;
1646
1740
  const submitForm = useCallback(
1647
1741
  async (values) => {
1648
1742
  if (submittingRef.current) return;
@@ -1657,11 +1751,11 @@ function BestCrudPage({ adapter, className, schema }) {
1657
1751
  return;
1658
1752
  }
1659
1753
  const record = drawer.mode === "closed" ? void 0 : drawer.record;
1754
+ const payloadValues = drawer.mode === "edit" ? buildCrudSubmitValues(projectSubmittedValues(values, formFields), record, rowKey) : projectSubmittedValues(values, formFields);
1660
1755
  submittingRef.current = true;
1661
1756
  setSubmitting(true);
1662
1757
  try {
1663
- const mergedValues = { ...record, ...values };
1664
- const payload = drawer.mode === "edit" ? adapter?.toUpdatePayload?.(mergedValues, record) ?? mergedValues : adapter?.toCreatePayload?.(mergedValues) ?? mergedValues;
1758
+ const payload = drawer.mode === "edit" ? adapter?.toUpdatePayload?.(payloadValues, record) ?? payloadValues : adapter?.toCreatePayload?.(payloadValues) ?? payloadValues;
1665
1759
  await service(payload);
1666
1760
  message.success("\u4FDD\u5B58\u6210\u529F");
1667
1761
  setDrawer({ mode: "closed" });
@@ -1673,7 +1767,15 @@ function BestCrudPage({ adapter, className, schema }) {
1673
1767
  submittingRef.current = false;
1674
1768
  }
1675
1769
  },
1676
- [adapter, drawer, registry.services, schema.dataSource.create, schema.dataSource.update]
1770
+ [
1771
+ adapter,
1772
+ drawer,
1773
+ formFields,
1774
+ registry.services,
1775
+ rowKey,
1776
+ schema.dataSource.create,
1777
+ schema.dataSource.update
1778
+ ]
1677
1779
  );
1678
1780
  return /* @__PURE__ */ jsxs4(Fragment2, { children: [
1679
1781
  useBestSearch && searchFields.length ? /* @__PURE__ */ jsx11(
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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/ui/BestTable.module.less", "../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 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 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 valueEnum,\n render: (value, record) =>\n column.slot\n ? (slots[column.slot]?.({ field: column.field, record, value }) ?? '-')\n : formatCrudValue(value, column.format)\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 editRecord = adapter?.fromDetail\n ? adapter.fromDetail(detail as RecordValue)\n : (detail as RecordValue)\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 configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\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 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 const rowKey = schema.table.rowKey\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 submittingRef.current = true\n setSubmitting(true)\n try {\n const mergedValues = { ...record, ...values }\n const payload =\n drawer.mode === 'edit'\n ? (adapter?.toUpdatePayload?.(mergedValues, record) ?? mergedValues)\n : (adapter?.toCreatePayload?.(mergedValues) ?? mergedValues)\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 [adapter, drawer, registry.services, schema.dataSource.create, schema.dataSource.update]\n )\n\n return (\n <>\n {useBestSearch && searchFields.length ? (\n <BestSearch\n fields={searchFields}\n value={query}\n defaultValues={searchDefaultValues}\n onReset={() => {\n queryRef.current = {}\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery({})\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='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\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 createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return {\n listServices: registry.listServices ?? {},\n services: registry.services ?? {},\n dictionaries: registry.dictionaries ?? {},\n actions: registry.actions ?? {},\n slots: registry.slots ?? {},\n access: registry.access ?? emptyRegistry.access\n }\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 = 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", "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 { 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 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 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) {\n return rules?.map((rule) => ({\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))) throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\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'\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?: () => 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 style={{ marginBottom: 16 }}\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, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n onChange?.({})\n onReset?.()\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 styles from './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={[styles.root, 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", ".root {\n :global(.ant-pro-card-body) {\n padding: 12px;\n }\n\n :global(.ant-pro-query-filter-actions .ant-form-item-label) {\n display: none;\n }\n\n :global(.ant-pro-query-filter-actions) {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n}\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 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 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}\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 (\n (condition.operator === 'and' || condition.operator === 'or') &&\n condition.conditions.length === 0\n ) {\n push(diagnostics, path, 'condition.empty', '\u7EC4\u5408\u6761\u4EF6\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B50\u6761\u4EF6')\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n condition.conditions.forEach((item, index) => {\n validateCondition(item, `${path}/conditions/${index}`, diagnostics)\n })\n }\n if (condition.operator === 'not')\n validateCondition(condition.condition, `${path}/condition`, diagnostics)\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.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 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 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", "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", "dayjs", "Modal", "query", "useRef", "useMemo", "useState", "useEffect", "Button"]
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 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 configuredColumns.push({\n title: '\u64CD\u4F5C',\n valueType: 'option',\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={() => {\n queryRef.current = {}\n queryStateRef.current = { ...queryStateRef.current, userTouched: true }\n setQuery({})\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='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\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 createBestRegistry(registry: BestProviderProps['registry'] = {}): BestRegistry {\n return {\n listServices: registry.listServices ?? {},\n services: registry.services ?? {},\n dictionaries: registry.dictionaries ?? {},\n actions: registry.actions ?? {},\n slots: registry.slots ?? {},\n access: registry.access ?? emptyRegistry.access\n }\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 { 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={(nextValue) => {\n onChange?.(nextValue)\n const fieldPath = namePath ?? field.field\n form.setFieldValue(fieldPath, nextValue)\n void form.validateFields([fieldPath]).catch(() => undefined)\n }}\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) {\n return rules?.map((rule) => ({\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))) throw new Error(rule.message ?? '\u8BF7\u8F93\u5165\u6574\u6570')\n }\n : undefined\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'\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?: () => 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 style={{ marginBottom: 16 }}\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, {}, fields)\n valueSignatureRef.current = JSON.stringify({})\n onChange?.({})\n onReset?.()\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 styles from './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={[styles.root, 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", ".root {\n :global(.ant-pro-card-body) {\n padding: 12px;\n }\n\n :global(.ant-pro-query-filter-actions .ant-form-item-label) {\n display: none;\n }\n\n :global(.ant-pro-query-filter-actions) {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n}\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 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 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}\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.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"]
7
7
  }
@@ -11,6 +11,9 @@ export type CrudDataAdapter = {
11
11
  toCreatePayload?: (values: RecordValue) => RecordValue;
12
12
  toUpdatePayload?: (values: RecordValue, record?: RecordValue) => RecordValue;
13
13
  };
14
+ export declare function buildCrudSubmitValues(values: RecordValue, record: RecordValue | undefined, rowKey: string | string[]): {
15
+ [x: string]: unknown;
16
+ };
14
17
  export declare function BestCrudPage({ adapter, className, schema }: BestCrudPageProps): import("react/jsx-runtime").JSX.Element;
15
18
  export {};
16
19
  //# sourceMappingURL=BestCrudPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BestCrudPage.d.ts","sourceRoot":"","sources":["../../src/lowcode/BestCrudPage.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,cAAc,EAMf,MAAM,UAAU,CAAA;AAGjB,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAA;IACpD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACtD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAA;CAC7E,CAAA;AA+ID,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA2U7E"}
1
+ {"version":3,"file":"BestCrudPage.d.ts","sourceRoot":"","sources":["../../src/lowcode/BestCrudPage.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,cAAc,EAMf,MAAM,UAAU,CAAA;AAGjB,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAA;IACpD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,CAAA;IACtD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAA;CAC7E,CAAA;AA+BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;;EAG1B;AAkKD,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAuV7E"}
@@ -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;AA2HD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,sBAAsB,CAyGxB;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,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,CAmHxB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,YAAY,QAMxF"}
@@ -1 +1 @@
1
- {"version":3,"file":"BestForm.d.ts","sourceRoot":"","sources":["../../src/ui/BestForm.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAiFD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAI1F;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,sBAE3E;AAED,wBAAgB,6BAA6B,CAC3C,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,gCAG9B;AAiUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS;;;;;;;oBAUzC,OAAO,SAAS,OAAO;gBAM1C;AAWD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACT,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAC7C,2CA+HA;AAED,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,aAAa,EACb,OAAO,EACP,UAAiB,EACjB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACT,EAAE,aAAa,2CAuBf;AA2BD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvF;AAoBD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;EAahD;AAaD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,EAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,QAAQ,GACb,OAAO,CAmBT"}
1
+ {"version":3,"file":"BestForm.d.ts","sourceRoot":"","sources":["../../src/ui/BestForm.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAc,MAAM,SAAS,CAAA;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAiFD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAI1F;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,sBAE3E;AAED,wBAAgB,6BAA6B,CAC3C,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,gCAG9B;AAwUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS;;;;;;;oBAUzC,OAAO,SAAS,OAAO;gBAM1C;AAWD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACT,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAC7C,2CA+HA;AAED,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,aAAa,EACb,OAAO,EACP,UAAiB,EACjB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACT,EAAE,aAAa,2CAuBf;AA2BD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvF;AAoBD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;EAahD;AAaD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,EAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,QAAQ,GACb,OAAO,CAmBT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-lowcode-runtime",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "BEST React low-code runtime, CRUD page renderer, and UI components.",
5
5
  "keywords": [
6
6
  "best",
@@ -39,12 +39,6 @@
39
39
  },
40
40
  "./style.css": "./dist/index.css"
41
41
  },
42
- "scripts": {
43
- "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
44
- "check": "tsc -p tsconfig.json --noEmit",
45
- "prepack": "pnpm run build",
46
- "test": "vitest run"
47
- },
48
42
  "peerDependencies": {
49
43
  "@ant-design/pro-components": "^3.1.5-0",
50
44
  "antd": "^6.2.1",
@@ -61,5 +55,10 @@
61
55
  "publishConfig": {
62
56
  "access": "public",
63
57
  "registry": "https://registry.npmjs.org/"
58
+ },
59
+ "scripts": {
60
+ "build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/bundle.mjs",
61
+ "check": "tsc -p tsconfig.json --noEmit",
62
+ "test": "vitest run"
64
63
  }
65
- }
64
+ }