Skip to content

Core Plugin(L4) ​

Core Plugin 注册逻辑能力:Widget 身份、validator、rule function、dialect、x-*、serializer、valueInitializer。不要把 Vue/React 组件写进 defineWidget()。

createFormEnvironment({ plugins }) 得到冻结 Environment。同一个对象 identity 必须同时传给 compileForm 与 createForm。不要靠 Plugin 列表长得像来匹配。长期复用可用 createFormEngine({ plugins }),它闭包持有同一 Environment。

ts
import { compileForm, createForm, defineForm } from "@xunserver-jsf/core";
import {
  createFormEnvironment,
  definePlugin,
  defineRuleFunction,
  defineWidget,
} from "@xunserver-jsf/core/extension";
import { AJV_VALIDATOR_KEY, createAjvValidator } from "@xunserver-jsf/validator-ajv";

const currencyWidget = defineWidget({
  name: "company.currency",
  valueContract: { jsonTypes: ["string"], canonical: "json-scalar" },
  interaction: { setValue: true, touch: true, focus: true, blur: true },
});

const environment = createFormEnvironment({
  plugins: [
    definePlugin({
      id: "company",
      dependsOn: ["core"],
      contributes: {
        widgets: { "company.currency": currencyWidget },
        validators: { [AJV_VALIDATOR_KEY]: createAjvValidator() },
        ruleFunctions: {
          "company.tax": defineRuleFunction({
            name: "company.tax",
            evaluate: (args) => args[0] ?? 0,
          }),
        },
      },
    }),
  ],
});

const definition = defineForm({
  schema: {
    type: "object",
    properties: { amount: { type: "string" } },
  },
  uiSchema: {
    fields: { amount: { widget: "company.currency", display: { label: "金额" } } },
  },
  config: { schemaValidator: AJV_VALIDATOR_KEY },
});

const { model } = compileForm(definition, { environment });
const form = createForm(model, { environment });

这一步之后表单还不会画出货币控件:还要在 Adapter 安装同名 WidgetBinding,见 追加与覆盖。

Playground 逻辑层实现:examples/shared/src/environment.ts。

可注册的能力 ​

定义约束
defineWidget()identity + valueContract + interaction;不安装 UI
defineRuleFunction()Compiled Model 只保存 key
defineValidator()必须进入冻结 Environment
SchemaDialectDefinition纯同步 convert()
SchemaExtensionDefinitionkeyword 必须是 x-*
ValueInitializerDefinitionidentity materialization 之前同步执行一次

冲突、空 URI 或非 x- 前缀以 source: "plugin" 阻断,不发布 partial Registry。Core 不内置 draft-07 adapter,也不内置 x-* 词汇。