This is page 1 of 52. Use http://codebase.md/alibaba/formily?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .all-contributorsrc ├── .codecov.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows │ ├── check-pr-title.yml │ ├── ci.yml │ ├── commitlint.yml │ ├── issue-open-check.yml │ ├── package-size.yml │ └── pr-welcome.yml ├── .gitignore ├── .prettierrc.js ├── .umirc.js ├── .vscode │ └── cspell.json ├── .yarnrc ├── CHANGELOG.md ├── commitlint.config.js ├── devtools │ ├── .eslintrc │ └── chrome-extension │ ├── .npmignore │ ├── assets │ │ └── img │ │ ├── loading.svg │ │ └── logo │ │ ├── 128x128.png │ │ ├── 16x16.png │ │ ├── 38x38.png │ │ ├── 48x48.png │ │ ├── error.png │ │ ├── gray.png │ │ └── scalable.png │ ├── config │ │ ├── webpack.base.ts │ │ ├── webpack.dev.ts │ │ └── webpack.prod.ts │ ├── LICENSE.md │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── components │ │ │ │ ├── FieldTree.tsx │ │ │ │ ├── filter.ts │ │ │ │ ├── LeftPanel.tsx │ │ │ │ ├── RightPanel.tsx │ │ │ │ ├── SearchBox.tsx │ │ │ │ └── Tabs.tsx │ │ │ ├── demo.tsx │ │ │ └── index.tsx │ │ └── extension │ │ ├── backend.ts │ │ ├── background.ts │ │ ├── content.ts │ │ ├── devpanel.tsx │ │ ├── devtools.tsx │ │ ├── inject.ts │ │ ├── manifest.json │ │ ├── popup.tsx │ │ └── views │ │ ├── devpanel.ejs │ │ ├── devtools.ejs │ │ └── popup.ejs │ ├── tsconfig.build.json │ └── tsconfig.json ├── docs │ ├── functions │ │ ├── contributors.ts │ │ └── npm-search.ts │ ├── guide │ │ ├── advanced │ │ │ ├── async.md │ │ │ ├── async.zh-CN.md │ │ │ ├── build.md │ │ │ ├── build.zh-CN.md │ │ │ ├── business-logic.md │ │ │ ├── business-logic.zh-CN.md │ │ │ ├── calculator.md │ │ │ ├── calculator.zh-CN.md │ │ │ ├── controlled.md │ │ │ ├── controlled.zh-CN.md │ │ │ ├── custom.md │ │ │ ├── custom.zh-CN.md │ │ │ ├── destructor.md │ │ │ ├── destructor.zh-CN.md │ │ │ ├── input.less │ │ │ ├── layout.md │ │ │ ├── layout.zh-CN.md │ │ │ ├── linkages.md │ │ │ ├── linkages.zh-CN.md │ │ │ ├── validate.md │ │ │ └── validate.zh-CN.md │ │ ├── contribution.md │ │ ├── contribution.zh-CN.md │ │ ├── form-builder.md │ │ ├── form-builder.zh-CN.md │ │ ├── index.md │ │ ├── index.zh-CN.md │ │ ├── issue-helper.md │ │ ├── issue-helper.zh-CN.md │ │ ├── learn-formily.md │ │ ├── learn-formily.zh-CN.md │ │ ├── quick-start.md │ │ ├── quick-start.zh-CN.md │ │ ├── scenes │ │ │ ├── dialog-drawer.md │ │ │ ├── dialog-drawer.zh-CN.md │ │ │ ├── edit-detail.md │ │ │ ├── edit-detail.zh-CN.md │ │ │ ├── index.less │ │ │ ├── login-register.md │ │ │ ├── login-register.zh-CN.md │ │ │ ├── more.md │ │ │ ├── more.zh-CN.md │ │ │ ├── query-list.md │ │ │ ├── query-list.zh-CN.md │ │ │ ├── step-form.md │ │ │ ├── step-form.zh-CN.md │ │ │ ├── tab-form.md │ │ │ ├── tab-form.zh-CN.md │ │ │ └── VerifyCode.tsx │ │ ├── upgrade.md │ │ └── upgrade.zh-CN.md │ ├── index.md │ ├── index.zh-CN.md │ └── site │ ├── Contributors.less │ ├── Contributors.tsx │ ├── QrCode.less │ ├── QrCode.tsx │ ├── Section.less │ ├── Section.tsx │ └── styles.less ├── global.config.ts ├── jest.config.js ├── lerna.json ├── LICENSE.md ├── package.json ├── packages │ ├── .eslintrc │ ├── antd │ │ ├── __tests__ │ │ │ ├── moment.spec.ts │ │ │ └── sideEffects.spec.ts │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── build-style.ts │ │ ├── create-style.ts │ │ ├── docs │ │ │ ├── components │ │ │ │ ├── ArrayCards.md │ │ │ │ ├── ArrayCards.zh-CN.md │ │ │ │ ├── ArrayCollapse.md │ │ │ │ ├── ArrayCollapse.zh-CN.md │ │ │ │ ├── ArrayItems.md │ │ │ │ ├── ArrayItems.zh-CN.md │ │ │ │ ├── ArrayTable.md │ │ │ │ ├── ArrayTable.zh-CN.md │ │ │ │ ├── ArrayTabs.md │ │ │ │ ├── ArrayTabs.zh-CN.md │ │ │ │ ├── Cascader.md │ │ │ │ ├── Cascader.zh-CN.md │ │ │ │ ├── Checkbox.md │ │ │ │ ├── Checkbox.zh-CN.md │ │ │ │ ├── DatePicker.md │ │ │ │ ├── DatePicker.zh-CN.md │ │ │ │ ├── Editable.md │ │ │ │ ├── Editable.zh-CN.md │ │ │ │ ├── Form.md │ │ │ │ ├── Form.zh-CN.md │ │ │ │ ├── FormButtonGroup.md │ │ │ │ ├── FormButtonGroup.zh-CN.md │ │ │ │ ├── FormCollapse.md │ │ │ │ ├── FormCollapse.zh-CN.md │ │ │ │ ├── FormDialog.md │ │ │ │ ├── FormDialog.zh-CN.md │ │ │ │ ├── FormDrawer.md │ │ │ │ ├── FormDrawer.zh-CN.md │ │ │ │ ├── FormGrid.md │ │ │ │ ├── FormGrid.zh-CN.md │ │ │ │ ├── FormItem.md │ │ │ │ ├── FormItem.zh-CN.md │ │ │ │ ├── FormLayout.md │ │ │ │ ├── FormLayout.zh-CN.md │ │ │ │ ├── FormStep.md │ │ │ │ ├── FormStep.zh-CN.md │ │ │ │ ├── FormTab.md │ │ │ │ ├── FormTab.zh-CN.md │ │ │ │ ├── index.md │ │ │ │ ├── index.zh-CN.md │ │ │ │ ├── Input.md │ │ │ │ ├── Input.zh-CN.md │ │ │ │ ├── NumberPicker.md │ │ │ │ ├── NumberPicker.zh-CN.md │ │ │ │ ├── Password.md │ │ │ │ ├── Password.zh-CN.md │ │ │ │ ├── PreviewText.md │ │ │ │ ├── PreviewText.zh-CN.md │ │ │ │ ├── Radio.md │ │ │ │ ├── Radio.zh-CN.md │ │ │ │ ├── Reset.md │ │ │ │ ├── Reset.zh-CN.md │ │ │ │ ├── Select.md │ │ │ │ ├── Select.zh-CN.md │ │ │ │ ├── SelectTable.md │ │ │ │ ├── SelectTable.zh-CN.md │ │ │ │ ├── Space.md │ │ │ │ ├── Space.zh-CN.md │ │ │ │ ├── Submit.md │ │ │ │ ├── Submit.zh-CN.md │ │ │ │ ├── Switch.md │ │ │ │ ├── Switch.zh-CN.md │ │ │ │ ├── TimePicker.md │ │ │ │ ├── TimePicker.zh-CN.md │ │ │ │ ├── Transfer.md │ │ │ │ ├── Transfer.zh-CN.md │ │ │ │ ├── TreeSelect.md │ │ │ │ ├── TreeSelect.zh-CN.md │ │ │ │ ├── Upload.md │ │ │ │ └── Upload.zh-CN.md │ │ │ ├── index.md │ │ │ └── index.zh-CN.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __builtins__ │ │ │ │ ├── hooks │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useClickAway.ts │ │ │ │ │ └── usePrefixCls.ts │ │ │ │ ├── index.ts │ │ │ │ ├── loading.ts │ │ │ │ ├── moment.ts │ │ │ │ ├── pickDataProps.ts │ │ │ │ ├── portal.tsx │ │ │ │ ├── render.ts │ │ │ │ └── sort.tsx │ │ │ ├── array-base │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── array-cards │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── array-collapse │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── array-items │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── array-table │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── array-tabs │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── cascader │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── checkbox │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── date-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── editable │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── form │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── form-button-group │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── form-collapse │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-dialog │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-drawer │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-grid │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── form-item │ │ │ │ ├── animation.less │ │ │ │ ├── grid.less │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── form-layout │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ ├── style.ts │ │ │ │ └── useResponsiveFormLayout.ts │ │ │ ├── form-step │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-tab │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── index.ts │ │ │ ├── input │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── number-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── password │ │ │ │ ├── index.tsx │ │ │ │ ├── PasswordStrength.tsx │ │ │ │ └── style.ts │ │ │ ├── preview-text │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── radio │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── style.ts │ │ │ ├── reset │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── select │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── select-table │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ ├── style.ts │ │ │ │ ├── useCheckSlackly.tsx │ │ │ │ ├── useFilterOptions.tsx │ │ │ │ ├── useFlatOptions.tsx │ │ │ │ ├── useSize.tsx │ │ │ │ ├── useTitleAddon.tsx │ │ │ │ └── utils.ts │ │ │ ├── space │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── style.less │ │ │ ├── style.ts │ │ │ ├── submit │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── switch │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── time-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── transfer │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── tree-select │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ └── upload │ │ │ ├── index.tsx │ │ │ ├── placeholder.ts │ │ │ └── style.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── benchmark │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ └── index.tsx │ │ ├── template.ejs │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ ├── webpack.base.ts │ │ ├── webpack.dev.ts │ │ └── webpack.prod.ts │ ├── core │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── docs │ │ │ ├── api │ │ │ │ ├── entry │ │ │ │ │ ├── ActionResponse.less │ │ │ │ │ ├── ActionResponse.tsx │ │ │ │ │ ├── createForm.md │ │ │ │ │ ├── createForm.zh-CN.md │ │ │ │ │ ├── FieldEffectHooks.md │ │ │ │ │ ├── FieldEffectHooks.zh-CN.md │ │ │ │ │ ├── FormChecker.md │ │ │ │ │ ├── FormChecker.zh-CN.md │ │ │ │ │ ├── FormEffectHooks.md │ │ │ │ │ ├── FormEffectHooks.zh-CN.md │ │ │ │ │ ├── FormHooksAPI.md │ │ │ │ │ ├── FormHooksAPI.zh-CN.md │ │ │ │ │ ├── FormPath.md │ │ │ │ │ ├── FormPath.zh-CN.md │ │ │ │ │ ├── FormValidatorRegistry.md │ │ │ │ │ └── FormValidatorRegistry.zh-CN.md │ │ │ │ └── models │ │ │ │ ├── ArrayField.md │ │ │ │ ├── ArrayField.zh-CN.md │ │ │ │ ├── Field.md │ │ │ │ ├── Field.zh-CN.md │ │ │ │ ├── Form.md │ │ │ │ ├── Form.zh-CN.md │ │ │ │ ├── ObjectField.md │ │ │ │ ├── ObjectField.zh-CN.md │ │ │ │ ├── Query.md │ │ │ │ ├── Query.zh-CN.md │ │ │ │ ├── VoidField.md │ │ │ │ └── VoidField.zh-CN.md │ │ │ ├── guide │ │ │ │ ├── architecture.md │ │ │ │ ├── architecture.zh-CN.md │ │ │ │ ├── field.md │ │ │ │ ├── field.zh-CN.md │ │ │ │ ├── form.md │ │ │ │ ├── form.zh-CN.md │ │ │ │ ├── index.md │ │ │ │ ├── index.zh-CN.md │ │ │ │ ├── mvvm.md │ │ │ │ ├── mvvm.zh-CN.md │ │ │ │ ├── values.md │ │ │ │ └── values.zh-CN.md │ │ │ ├── index.md │ │ │ └── index.zh-CN.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── array.spec.ts │ │ │ │ ├── effects.spec.ts │ │ │ │ ├── externals.spec.ts │ │ │ │ ├── field.spec.ts │ │ │ │ ├── form.spec.ts │ │ │ │ ├── graph.spec.ts │ │ │ │ ├── heart.spec.ts │ │ │ │ ├── internals.spec.ts │ │ │ │ ├── lifecycle.spec.ts │ │ │ │ ├── object.spec.ts │ │ │ │ ├── shared.ts │ │ │ │ └── void.spec.ts │ │ │ ├── effects │ │ │ │ ├── index.ts │ │ │ │ ├── onFieldEffects.ts │ │ │ │ └── onFormEffects.ts │ │ │ ├── global.d.ts │ │ │ ├── index.ts │ │ │ ├── models │ │ │ │ ├── ArrayField.ts │ │ │ │ ├── BaseField.ts │ │ │ │ ├── Field.ts │ │ │ │ ├── Form.ts │ │ │ │ ├── Graph.ts │ │ │ │ ├── Heart.ts │ │ │ │ ├── index.ts │ │ │ │ ├── LifeCycle.ts │ │ │ │ ├── ObjectField.ts │ │ │ │ ├── Query.ts │ │ │ │ ├── types.ts │ │ │ │ └── VoidField.ts │ │ │ ├── shared │ │ │ │ ├── checkers.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── effective.ts │ │ │ │ ├── externals.ts │ │ │ │ └── internals.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── element │ │ ├── .npmignore │ │ ├── build-style.ts │ │ ├── create-style.ts │ │ ├── docs │ │ │ ├── .vuepress │ │ │ │ ├── components │ │ │ │ │ ├── createCodeSandBox.js │ │ │ │ │ ├── dumi-previewer.vue │ │ │ │ │ └── highlight.js │ │ │ │ ├── config.js │ │ │ │ ├── enhanceApp.js │ │ │ │ ├── styles │ │ │ │ │ └── index.styl │ │ │ │ └── util.js │ │ │ ├── demos │ │ │ │ ├── guide │ │ │ │ │ ├── array-cards │ │ │ │ │ │ ├── effects-json-schema.vue │ │ │ │ │ │ ├── effects-markup-schema.vue │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── array-collapse │ │ │ │ │ │ ├── effects-json-schema.vue │ │ │ │ │ │ ├── effects-markup-schema.vue │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── array-items │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── array-table │ │ │ │ │ │ ├── effects-json-schema.vue │ │ │ │ │ │ ├── effects-markup-schema.vue │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── array-tabs │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── cascader │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── checkbox │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── date-picker │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── editable │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── form-button-group.vue │ │ │ │ │ ├── form-collapse │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── form-dialog │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── form-drawer │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── form-grid │ │ │ │ │ │ ├── form.vue │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── native.vue │ │ │ │ │ ├── form-item │ │ │ │ │ │ ├── bordered-none.vue │ │ │ │ │ │ ├── common.vue │ │ │ │ │ │ ├── feedback.vue │ │ │ │ │ │ ├── inset.vue │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ ├── size.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── form-layout │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── form-step │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── form-tab │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ └── markup-schema.vue │ │ │ │ │ ├── form.vue │ │ │ │ │ ├── input │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── input-number │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── password │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── preview-text │ │ │ │ │ │ ├── base.vue │ │ │ │ │ │ └── extend.vue │ │ │ │ │ ├── radio │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── reset │ │ │ │ │ │ ├── base.vue │ │ │ │ │ │ ├── force.vue │ │ │ │ │ │ └── validate.vue │ │ │ │ │ ├── select │ │ │ │ │ │ ├── json-schema-async.vue │ │ │ │ │ │ ├── json-schema-sync.vue │ │ │ │ │ │ ├── markup-schema-async-search.vue │ │ │ │ │ │ ├── markup-schema-async.vue │ │ │ │ │ │ ├── markup-schema-sync.vue │ │ │ │ │ │ ├── template-async.vue │ │ │ │ │ │ └── template-sync.vue │ │ │ │ │ ├── space │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── submit │ │ │ │ │ │ ├── base.vue │ │ │ │ │ │ └── loading.vue │ │ │ │ │ ├── switch │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── time-picker │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ ├── transfer │ │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ │ └── template.vue │ │ │ │ │ └── upload │ │ │ │ │ ├── json-schema.vue │ │ │ │ │ ├── markup-schema.vue │ │ │ │ │ └── template.vue │ │ │ │ └── index.vue │ │ │ ├── guide │ │ │ │ ├── array-cards.md │ │ │ │ ├── array-collapse.md │ │ │ │ ├── array-items.md │ │ │ │ ├── array-table.md │ │ │ │ ├── array-tabs.md │ │ │ │ ├── cascader.md │ │ │ │ ├── checkbox.md │ │ │ │ ├── date-picker.md │ │ │ │ ├── editable.md │ │ │ │ ├── form-button-group.md │ │ │ │ ├── form-collapse.md │ │ │ │ ├── form-dialog.md │ │ │ │ ├── form-drawer.md │ │ │ │ ├── form-grid.md │ │ │ │ ├── form-item.md │ │ │ │ ├── form-layout.md │ │ │ │ ├── form-step.md │ │ │ │ ├── form-tab.md │ │ │ │ ├── form.md │ │ │ │ ├── index.md │ │ │ │ ├── input-number.md │ │ │ │ ├── input.md │ │ │ │ ├── password.md │ │ │ │ ├── preview-text.md │ │ │ │ ├── radio.md │ │ │ │ ├── reset.md │ │ │ │ ├── select.md │ │ │ │ ├── space.md │ │ │ │ ├── submit.md │ │ │ │ ├── switch.md │ │ │ │ ├── time-picker.md │ │ │ │ ├── transfer.md │ │ │ │ └── upload.md │ │ │ └── README.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __builtins__ │ │ │ │ ├── configs │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── shared │ │ │ │ │ ├── create-context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loading.ts │ │ │ │ │ ├── portal.ts │ │ │ │ │ ├── resolve-component.ts │ │ │ │ │ ├── transform-component.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── styles │ │ │ │ └── common.scss │ │ │ ├── array-base │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── array-cards │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── array-collapse │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── array-items │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── array-table │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── array-tabs │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── cascader │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── checkbox │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── date-picker │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── editable │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── el-form │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── el-form-item │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── form │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── form-button-group │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── form-collapse │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── form-dialog │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── form-drawer │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── form-grid │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── form-item │ │ │ │ ├── animation.scss │ │ │ │ ├── grid.scss │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ ├── style.ts │ │ │ │ └── var.scss │ │ │ ├── form-layout │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ ├── style.ts │ │ │ │ └── useResponsiveFormLayout.ts │ │ │ ├── form-step │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── form-tab │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── index.ts │ │ │ ├── input │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── input-number │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── password │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── preview-text │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── radio │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── reset │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── select │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── space │ │ │ │ ├── index.ts │ │ │ │ ├── style.scss │ │ │ │ └── style.ts │ │ │ ├── style.ts │ │ │ ├── submit │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── switch │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── time-picker │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ ├── transfer │ │ │ │ ├── index.ts │ │ │ │ └── style.ts │ │ │ └── upload │ │ │ ├── index.ts │ │ │ └── style.ts │ │ ├── transformer.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── grid │ │ ├── .npmignore │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── index.ts │ │ │ └── observer.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── json-schema │ │ ├── .npmignore │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── schema.spec.ts.snap │ │ │ │ ├── compiler.spec.ts │ │ │ │ ├── patches.spec.ts │ │ │ │ ├── schema.spec.ts │ │ │ │ ├── server-validate.spec.ts │ │ │ │ ├── shared.spec.ts │ │ │ │ ├── transformer.spec.ts │ │ │ │ └── traverse.spec.ts │ │ │ ├── compiler.ts │ │ │ ├── global.d.ts │ │ │ ├── index.ts │ │ │ ├── patches.ts │ │ │ ├── polyfills │ │ │ │ ├── index.ts │ │ │ │ └── SPECIFICATION_1_0.ts │ │ │ ├── schema.ts │ │ │ ├── shared.ts │ │ │ ├── transformer.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── next │ │ ├── __tests__ │ │ │ ├── moment.spec.ts │ │ │ └── sideEffects.spec.ts │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── build-style.ts │ │ ├── create-style.ts │ │ ├── docs │ │ │ ├── components │ │ │ │ ├── ArrayCards.md │ │ │ │ ├── ArrayCards.zh-CN.md │ │ │ │ ├── ArrayCollapse.md │ │ │ │ ├── ArrayCollapse.zh-CN.md │ │ │ │ ├── ArrayItems.md │ │ │ │ ├── ArrayItems.zh-CN.md │ │ │ │ ├── ArrayTable.md │ │ │ │ ├── ArrayTable.zh-CN.md │ │ │ │ ├── Cascader.md │ │ │ │ ├── Cascader.zh-CN.md │ │ │ │ ├── Checkbox.md │ │ │ │ ├── Checkbox.zh-CN.md │ │ │ │ ├── DatePicker.md │ │ │ │ ├── DatePicker.zh-CN.md │ │ │ │ ├── DatePicker2.md │ │ │ │ ├── DatePicker2.zh-CN.md │ │ │ │ ├── Editable.md │ │ │ │ ├── Editable.zh-CN.md │ │ │ │ ├── Form.md │ │ │ │ ├── Form.zh-CN.md │ │ │ │ ├── FormButtonGroup.md │ │ │ │ ├── FormButtonGroup.zh-CN.md │ │ │ │ ├── FormCollapse.md │ │ │ │ ├── FormCollapse.zh-CN.md │ │ │ │ ├── FormDialog.md │ │ │ │ ├── FormDialog.zh-CN.md │ │ │ │ ├── FormDrawer.md │ │ │ │ ├── FormDrawer.zh-CN.md │ │ │ │ ├── FormGrid.md │ │ │ │ ├── FormGrid.zh-CN.md │ │ │ │ ├── FormItem.md │ │ │ │ ├── FormItem.zh-CN.md │ │ │ │ ├── FormLayout.md │ │ │ │ ├── FormLayout.zh-CN.md │ │ │ │ ├── FormStep.md │ │ │ │ ├── FormStep.zh-CN.md │ │ │ │ ├── FormTab.md │ │ │ │ ├── FormTab.zh-CN.md │ │ │ │ ├── index.md │ │ │ │ ├── index.zh-CN.md │ │ │ │ ├── Input.md │ │ │ │ ├── Input.zh-CN.md │ │ │ │ ├── NumberPicker.md │ │ │ │ ├── NumberPicker.zh-CN.md │ │ │ │ ├── Password.md │ │ │ │ ├── Password.zh-CN.md │ │ │ │ ├── PreviewText.md │ │ │ │ ├── PreviewText.zh-CN.md │ │ │ │ ├── Radio.md │ │ │ │ ├── Radio.zh-CN.md │ │ │ │ ├── Reset.md │ │ │ │ ├── Reset.zh-CN.md │ │ │ │ ├── Select.md │ │ │ │ ├── Select.zh-CN.md │ │ │ │ ├── SelectTable.md │ │ │ │ ├── SelectTable.zh-CN.md │ │ │ │ ├── Space.md │ │ │ │ ├── Space.zh-CN.md │ │ │ │ ├── Submit.md │ │ │ │ ├── Submit.zh-CN.md │ │ │ │ ├── Switch.md │ │ │ │ ├── Switch.zh-CN.md │ │ │ │ ├── TimePicker.md │ │ │ │ ├── TimePicker.zh-CN.md │ │ │ │ ├── TimePicker2.md │ │ │ │ ├── TimePicker2.zh-CN.md │ │ │ │ ├── Transfer.md │ │ │ │ ├── Transfer.zh-CN.md │ │ │ │ ├── TreeSelect.md │ │ │ │ ├── TreeSelect.zh-CN.md │ │ │ │ ├── Upload.md │ │ │ │ └── Upload.zh-CN.md │ │ │ ├── index.md │ │ │ └── index.zh-CN.md │ │ ├── LESENCE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __builtins__ │ │ │ │ ├── empty.tsx │ │ │ │ ├── hooks │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useClickAway.ts │ │ │ │ │ └── usePrefixCls.ts │ │ │ │ ├── icons.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── loading.ts │ │ │ │ ├── mapSize.ts │ │ │ │ ├── mapStatus.ts │ │ │ │ ├── moment.ts │ │ │ │ ├── pickDataProps.ts │ │ │ │ ├── portal.tsx │ │ │ │ ├── render.ts │ │ │ │ └── toArray.ts │ │ │ ├── array-base │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── array-cards │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── array-collapse │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── array-items │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── array-table │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── cascader │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── checkbox │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── date-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── date-picker2 │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── editable │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── form │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── form-button-group │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── form-collapse │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-dialog │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-drawer │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-grid │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── form-item │ │ │ │ ├── animation.scss │ │ │ │ ├── grid.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ ├── scss │ │ │ │ │ └── variable.scss │ │ │ │ └── style.ts │ │ │ ├── form-layout │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ ├── style.ts │ │ │ │ └── useResponsiveFormLayout.ts │ │ │ ├── form-step │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── form-tab │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── index.ts │ │ │ ├── input │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── main.scss │ │ │ ├── number-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── password │ │ │ │ ├── index.tsx │ │ │ │ ├── PasswordStrength.tsx │ │ │ │ └── style.ts │ │ │ ├── preview-text │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── radio │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── reset │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── select │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── select-table │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ ├── style.ts │ │ │ │ ├── useCheckSlackly.tsx │ │ │ │ ├── useFilterOptions.tsx │ │ │ │ ├── useFlatOptions.tsx │ │ │ │ ├── useSize.tsx │ │ │ │ ├── useTitleAddon.tsx │ │ │ │ └── utils.ts │ │ │ ├── space │ │ │ │ ├── index.tsx │ │ │ │ ├── main.scss │ │ │ │ └── style.ts │ │ │ ├── style.ts │ │ │ ├── submit │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── switch │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── time-picker │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── time-picker2 │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── transfer │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── tree-select │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ └── upload │ │ │ ├── index.tsx │ │ │ ├── main.scss │ │ │ ├── placeholder.ts │ │ │ └── style.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── path │ │ ├── .npmignore │ │ ├── benchmark.ts │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── accessor.spec.ts │ │ │ │ ├── basic.spec.ts │ │ │ │ ├── match.spec.ts │ │ │ │ ├── parser.spec.ts │ │ │ │ └── share.spec.ts │ │ │ ├── contexts.ts │ │ │ ├── destructor.ts │ │ │ ├── index.ts │ │ │ ├── matcher.ts │ │ │ ├── parser.ts │ │ │ ├── shared.ts │ │ │ ├── tokenizer.ts │ │ │ ├── tokens.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── react │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── docs │ │ │ ├── api │ │ │ │ ├── components │ │ │ │ │ ├── ArrayField.md │ │ │ │ │ ├── ArrayField.zh-CN.md │ │ │ │ │ ├── ExpressionScope.md │ │ │ │ │ ├── ExpressionScope.zh-CN.md │ │ │ │ │ ├── Field.md │ │ │ │ │ ├── Field.zh-CN.md │ │ │ │ │ ├── FormConsumer.md │ │ │ │ │ ├── FormConsumer.zh-CN.md │ │ │ │ │ ├── FormProvider.md │ │ │ │ │ ├── FormProvider.zh-CN.md │ │ │ │ │ ├── ObjectField.md │ │ │ │ │ ├── ObjectField.zh-CN.md │ │ │ │ │ ├── RecordScope.md │ │ │ │ │ ├── RecordScope.zh-CN.md │ │ │ │ │ ├── RecordsScope.md │ │ │ │ │ ├── RecordsScope.zh-CN.md │ │ │ │ │ ├── RecursionField.md │ │ │ │ │ ├── RecursionField.zh-CN.md │ │ │ │ │ ├── SchemaField.md │ │ │ │ │ ├── SchemaField.zh-CN.md │ │ │ │ │ ├── VoidField.md │ │ │ │ │ └── VoidField.zh-CN.md │ │ │ │ ├── hooks │ │ │ │ │ ├── useExpressionScope.md │ │ │ │ │ ├── useExpressionScope.zh-CN.md │ │ │ │ │ ├── useField.md │ │ │ │ │ ├── useField.zh-CN.md │ │ │ │ │ ├── useFieldSchema.md │ │ │ │ │ ├── useFieldSchema.zh-CN.md │ │ │ │ │ ├── useForm.md │ │ │ │ │ ├── useForm.zh-CN.md │ │ │ │ │ ├── useFormEffects.md │ │ │ │ │ ├── useFormEffects.zh-CN.md │ │ │ │ │ ├── useParentForm.md │ │ │ │ │ └── useParentForm.zh-CN.md │ │ │ │ └── shared │ │ │ │ ├── connect.md │ │ │ │ ├── connect.zh-CN.md │ │ │ │ ├── context.md │ │ │ │ ├── context.zh-CN.md │ │ │ │ ├── mapProps.md │ │ │ │ ├── mapProps.zh-CN.md │ │ │ │ ├── mapReadPretty.md │ │ │ │ ├── mapReadPretty.zh-CN.md │ │ │ │ ├── observer.md │ │ │ │ ├── observer.zh-CN.md │ │ │ │ ├── Schema.md │ │ │ │ └── Schema.zh-CN.md │ │ │ ├── guide │ │ │ │ ├── architecture.md │ │ │ │ ├── architecture.zh-CN.md │ │ │ │ ├── concept.md │ │ │ │ ├── concept.zh-CN.md │ │ │ │ ├── index.md │ │ │ │ └── index.zh-CN.md │ │ │ ├── index.md │ │ │ └── index.zh-CN.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── expression.spec.tsx │ │ │ │ ├── field.spec.tsx │ │ │ │ ├── form.spec.tsx │ │ │ │ ├── schema.json.spec.tsx │ │ │ │ ├── schema.markup.spec.tsx │ │ │ │ └── shared.tsx │ │ │ ├── components │ │ │ │ ├── ArrayField.tsx │ │ │ │ ├── ExpressionScope.tsx │ │ │ │ ├── Field.tsx │ │ │ │ ├── FormConsumer.tsx │ │ │ │ ├── FormProvider.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── ObjectField.tsx │ │ │ │ ├── ReactiveField.tsx │ │ │ │ ├── RecordScope.tsx │ │ │ │ ├── RecordsScope.tsx │ │ │ │ ├── RecursionField.tsx │ │ │ │ ├── SchemaField.tsx │ │ │ │ └── VoidField.tsx │ │ │ ├── global.d.ts │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ ├── useAttach.ts │ │ │ │ ├── useExpressionScope.ts │ │ │ │ ├── useField.ts │ │ │ │ ├── useFieldSchema.ts │ │ │ │ ├── useForm.ts │ │ │ │ ├── useFormEffects.ts │ │ │ │ └── useParentForm.ts │ │ │ ├── index.ts │ │ │ ├── shared │ │ │ │ ├── connect.ts │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ └── render.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── reactive │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── benchmark.ts │ │ ├── docs │ │ │ ├── api │ │ │ │ ├── action.md │ │ │ │ ├── action.zh-CN.md │ │ │ │ ├── autorun.md │ │ │ │ ├── autorun.zh-CN.md │ │ │ │ ├── batch.md │ │ │ │ ├── batch.zh-CN.md │ │ │ │ ├── define.md │ │ │ │ ├── define.zh-CN.md │ │ │ │ ├── hasCollected.md │ │ │ │ ├── hasCollected.zh-CN.md │ │ │ │ ├── markObservable.md │ │ │ │ ├── markObservable.zh-CN.md │ │ │ │ ├── markRaw.md │ │ │ │ ├── markRaw.zh-CN.md │ │ │ │ ├── model.md │ │ │ │ ├── model.zh-CN.md │ │ │ │ ├── observable.md │ │ │ │ ├── observable.zh-CN.md │ │ │ │ ├── observe.md │ │ │ │ ├── observe.zh-CN.md │ │ │ │ ├── raw.md │ │ │ │ ├── raw.zh-CN.md │ │ │ │ ├── react │ │ │ │ │ ├── observer.md │ │ │ │ │ └── observer.zh-CN.md │ │ │ │ ├── reaction.md │ │ │ │ ├── reaction.zh-CN.md │ │ │ │ ├── toJS.md │ │ │ │ ├── toJS.zh-CN.md │ │ │ │ ├── tracker.md │ │ │ │ ├── tracker.zh-CN.md │ │ │ │ ├── typeChecker.md │ │ │ │ ├── typeChecker.zh-CN.md │ │ │ │ ├── untracked.md │ │ │ │ ├── untracked.zh-CN.md │ │ │ │ └── vue │ │ │ │ ├── observer.md │ │ │ │ └── observer.zh-CN.md │ │ │ ├── guide │ │ │ │ ├── best-practice.md │ │ │ │ ├── best-practice.zh-CN.md │ │ │ │ ├── concept.md │ │ │ │ ├── concept.zh-CN.md │ │ │ │ ├── index.md │ │ │ │ └── index.zh-CN.md │ │ │ ├── index.md │ │ │ └── index.zh-CN.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── action.spec.ts │ │ │ │ ├── annotations.spec.ts │ │ │ │ ├── array.spec.ts │ │ │ │ ├── autorun.spec.ts │ │ │ │ ├── batch.spec.ts │ │ │ │ ├── collections-map.spec.ts │ │ │ │ ├── collections-set.spec.ts │ │ │ │ ├── collections-weakmap.spec.ts │ │ │ │ ├── collections-weakset.spec.ts │ │ │ │ ├── define.spec.ts │ │ │ │ ├── externals.spec.ts │ │ │ │ ├── hasCollected.spec.ts │ │ │ │ ├── observable.spec.ts │ │ │ │ ├── observe.spec.ts │ │ │ │ ├── tracker.spec.ts │ │ │ │ └── untracked.spec.ts │ │ │ ├── action.ts │ │ │ ├── annotations │ │ │ │ ├── box.ts │ │ │ │ ├── computed.ts │ │ │ │ ├── index.ts │ │ │ │ ├── observable.ts │ │ │ │ ├── ref.ts │ │ │ │ └── shallow.ts │ │ │ ├── array.ts │ │ │ ├── autorun.ts │ │ │ ├── batch.ts │ │ │ ├── checkers.ts │ │ │ ├── environment.ts │ │ │ ├── externals.ts │ │ │ ├── global.d.ts │ │ │ ├── handlers.ts │ │ │ ├── index.ts │ │ │ ├── internals.ts │ │ │ ├── model.ts │ │ │ ├── observable.ts │ │ │ ├── observe.ts │ │ │ ├── reaction.ts │ │ │ ├── tracker.ts │ │ │ ├── tree.ts │ │ │ ├── types.ts │ │ │ └── untracked.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── reactive-react │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ ├── useCompatEffect.ts │ │ │ │ ├── useCompatFactory.ts │ │ │ │ ├── useDidUpdate.ts │ │ │ │ ├── useForceUpdate.ts │ │ │ │ ├── useLayoutEffect.ts │ │ │ │ └── useObserver.ts │ │ │ ├── index.ts │ │ │ ├── observer.ts │ │ │ ├── shared │ │ │ │ ├── gc.ts │ │ │ │ ├── global.ts │ │ │ │ ├── immediate.ts │ │ │ │ └── index.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── reactive-test-cases-for-react18 │ │ ├── .npmignore │ │ ├── .umirc.js │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ ├── index.js │ │ │ └── MySlowList.js │ │ ├── template.ejs │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ ├── webpack.base.ts │ │ ├── webpack.dev.ts │ │ └── webpack.prod.ts │ ├── reactive-vue │ │ ├── .npmignore │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ └── observer.spec.ts │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ └── useObserver.ts │ │ │ ├── index.ts │ │ │ ├── observer │ │ │ │ ├── collectData.ts │ │ │ │ ├── index.ts │ │ │ │ ├── observerInVue2.ts │ │ │ │ └── observerInVue3.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── shared │ │ ├── .npmignore │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ └── index.spec.ts │ │ │ ├── array.ts │ │ │ ├── case.ts │ │ │ ├── checkers.ts │ │ │ ├── clone.ts │ │ │ ├── compare.ts │ │ │ ├── defaults.ts │ │ │ ├── deprecate.ts │ │ │ ├── global.ts │ │ │ ├── index.ts │ │ │ ├── instanceof.ts │ │ │ ├── isEmpty.ts │ │ │ ├── merge.ts │ │ │ ├── middleware.ts │ │ │ ├── path.ts │ │ │ ├── string.ts │ │ │ ├── subscribable.ts │ │ │ └── uid.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── validator │ │ ├── .npmignore │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── README.md │ │ ├── rollup.config.js │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ ├── parser.spec.ts │ │ │ │ ├── registry.spec.ts │ │ │ │ └── validator.spec.ts │ │ │ ├── formats.ts │ │ │ ├── index.ts │ │ │ ├── locale.ts │ │ │ ├── parser.ts │ │ │ ├── registry.ts │ │ │ ├── rules.ts │ │ │ ├── template.ts │ │ │ ├── types.ts │ │ │ └── validator.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── vue │ ├── .npmignore │ ├── bin │ │ ├── formily-vue-fix.js │ │ └── formily-vue-switch.js │ ├── docs │ │ ├── .vuepress │ │ │ ├── components │ │ │ │ ├── createCodeSandBox.js │ │ │ │ ├── dumi-previewer.vue │ │ │ │ └── highlight.js │ │ │ ├── config.js │ │ │ ├── enhanceApp.js │ │ │ └── styles │ │ │ └── index.styl │ │ ├── api │ │ │ ├── components │ │ │ │ ├── array-field.md │ │ │ │ ├── expression-scope.md │ │ │ │ ├── field.md │ │ │ │ ├── form-consumer.md │ │ │ │ ├── form-provider.md │ │ │ │ ├── object-field.md │ │ │ │ ├── recursion-field-with-component.md │ │ │ │ ├── recursion-field.md │ │ │ │ ├── schema-field-with-schema.md │ │ │ │ ├── schema-field.md │ │ │ │ └── void-field.md │ │ │ ├── hooks │ │ │ │ ├── use-field-schema.md │ │ │ │ ├── use-field.md │ │ │ │ ├── use-form-effects.md │ │ │ │ ├── use-form.md │ │ │ │ └── use-parent-form.md │ │ │ └── shared │ │ │ ├── connect.md │ │ │ ├── injections.md │ │ │ ├── map-props.md │ │ │ ├── map-read-pretty.md │ │ │ ├── observer.md │ │ │ └── schema.md │ │ ├── demos │ │ │ ├── api │ │ │ │ ├── components │ │ │ │ │ ├── array-field.vue │ │ │ │ │ ├── expression-scope.vue │ │ │ │ │ ├── field.vue │ │ │ │ │ ├── form-consumer.vue │ │ │ │ │ ├── form-provider.vue │ │ │ │ │ ├── object-field.vue │ │ │ │ │ ├── recursion-field-with-component.vue │ │ │ │ │ ├── recursion-field.vue │ │ │ │ │ ├── schema-field-with-schema.vue │ │ │ │ │ ├── schema-field.vue │ │ │ │ │ └── void-field.vue │ │ │ │ ├── hooks │ │ │ │ │ ├── use-field-schema.vue │ │ │ │ │ ├── use-field.vue │ │ │ │ │ ├── use-form-effects.vue │ │ │ │ │ ├── use-form.vue │ │ │ │ │ └── use-parent-form.vue │ │ │ │ └── shared │ │ │ │ ├── connect.vue │ │ │ │ ├── map-props.vue │ │ │ │ ├── map-read-pretty.vue │ │ │ │ └── observer.vue │ │ │ ├── index.vue │ │ │ └── questions │ │ │ ├── default-slot.vue │ │ │ ├── events.vue │ │ │ ├── named-slot.vue │ │ │ └── scoped-slot.vue │ │ ├── guide │ │ │ ├── architecture.md │ │ │ ├── concept.md │ │ │ └── README.md │ │ ├── questions │ │ │ └── README.md │ │ └── README.md │ ├── package.json │ ├── README.md │ ├── rollup.config.js │ ├── scripts │ │ ├── postinstall.js │ │ ├── switch-cli.js │ │ └── utils.js │ ├── src │ │ ├── __tests__ │ │ │ ├── expression.scope.spec.ts │ │ │ ├── field.spec.ts │ │ │ ├── form.spec.ts │ │ │ ├── schema.json.spec.ts │ │ │ ├── schema.markup.spec.ts │ │ │ ├── shared.spec.ts │ │ │ └── utils.spec.ts │ │ ├── components │ │ │ ├── ArrayField.ts │ │ │ ├── ExpressionScope.ts │ │ │ ├── Field.ts │ │ │ ├── FormConsumer.ts │ │ │ ├── FormProvider.ts │ │ │ ├── index.ts │ │ │ ├── ObjectField.ts │ │ │ ├── ReactiveField.ts │ │ │ ├── RecursionField.ts │ │ │ ├── SchemaField.ts │ │ │ └── VoidField.ts │ │ ├── global.d.ts │ │ ├── hooks │ │ │ ├── index.ts │ │ │ ├── useAttach.ts │ │ │ ├── useField.ts │ │ │ ├── useFieldSchema.ts │ │ │ ├── useForm.ts │ │ │ ├── useFormEffects.ts │ │ │ ├── useInjectionCleaner.ts │ │ │ └── useParentForm.ts │ │ ├── index.ts │ │ ├── shared │ │ │ ├── connect.ts │ │ │ ├── context.ts │ │ │ ├── createForm.ts │ │ │ ├── fragment.ts │ │ │ ├── h.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ ├── utils │ │ │ ├── formatVNodeData.ts │ │ │ ├── getFieldProps.ts │ │ │ ├── getRawComponent.ts │ │ │ └── resolveSchemaProps.ts │ │ └── vue2-components.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.types.json ├── README.md ├── README.zh-cn.md ├── scripts │ ├── build-style │ │ ├── buildAllStyles.ts │ │ ├── copy.ts │ │ ├── helper.ts │ │ └── index.ts │ └── rollup.base.js ├── tsconfig.build.json ├── tsconfig.jest.json ├── tsconfig.json └── yarn.lock ``` # Files -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- ``` 1 | registry "https://registry.yarnpkg.com" ``` -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- ```javascript 1 | module.exports = { 2 | semi: false, 3 | tabWidth: 2, 4 | singleQuote: true, 5 | } ``` -------------------------------------------------------------------------------- /devtools/chrome-extension/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/antd/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/benchmark/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/core/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/grid/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/json-schema/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/next/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/path/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/react/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/reactive-react/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/reactive-test-cases-for-react18/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/reactive-vue/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/reactive/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/shared/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/validator/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | tsconfig.json 10 | .umi 11 | src ``` -------------------------------------------------------------------------------- /packages/element/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | vue.config.js 10 | tsconfig.json 11 | .umi 12 | src ``` -------------------------------------------------------------------------------- /packages/vue/.npmignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | *.log 3 | build 4 | docs 5 | doc-site 6 | __tests__ 7 | .eslintrc 8 | jest.config.js 9 | vue.config.js 10 | tsconfig.json 11 | .umi 12 | src ``` -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- ``` 1 | node_modules 2 | lib 3 | dist 4 | build 5 | coverage 6 | expected 7 | website 8 | gh-pages 9 | weex 10 | build.ts 11 | packages/vue 12 | packages/element 13 | esm 14 | doc-site 15 | public 16 | package ``` -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- ```yaml 1 | coverage: 2 | status: 3 | project: 4 | default: 5 | threshold: 0.1% 6 | patch: 7 | default: 8 | threshold: 0.1% 9 | target: 95% 10 | ``` -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- ``` 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 2 12 | 13 | [*.gradle] 14 | indent_size = 4 ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | *~ 2 | *.swp 3 | .DS_Store 4 | .tea 5 | npm-debug.log 6 | lerna-debug.log 7 | npm-debug.log* 8 | package-lock.json 9 | lib/ 10 | esm/ 11 | temp_esm/ 12 | dist/ 13 | type-artefacts/ 14 | build/ 15 | coverage/ 16 | node_modules/ 17 | examples/test 18 | .idea/ 19 | TODO.md 20 | tsconfig.tsbuildinfo 21 | package/ 22 | package.zip 23 | .umi 24 | .umi-production 25 | .cjsescache 26 | doc-site 27 | .lerna-changelog 28 | .history 29 | .lint-report.log 30 | ``` -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- ``` 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "extends": [ 6 | "plugin:react/recommended", 7 | "plugin:@typescript-eslint/recommended", 8 | "prettier/@typescript-eslint" 9 | ], 10 | "globals": { 11 | "sleep": true, 12 | "prettyFormat": true 13 | }, 14 | "parserOptions": { 15 | "ecmaVersion": 10, 16 | "sourceType": "module", 17 | "ecmaFeatures": { 18 | "jsx": true 19 | } 20 | }, 21 | "parser": "@typescript-eslint/parser", 22 | "plugins": ["@typescript-eslint", "react", "prettier", "markdown"], 23 | "settings": { 24 | "react": { 25 | "version": "detect" 26 | } 27 | }, 28 | "rules": { 29 | "@typescript-eslint/explicit-module-boundary-types": "off", 30 | "@typescript-eslint/no-var-requires": "off", 31 | "@typescript-eslint/no-explicit-any": "off", 32 | "@typescript-eslint/no-unused-vars": "error", 33 | "@typescript-eslint/ban-ts-comment": "off", 34 | "react/no-unescaped-entities": "off", 35 | "react/prop-types": "off" 36 | }, 37 | "overrides": [ 38 | { 39 | "files": ["**/*.md"], 40 | "processor": "markdown/markdown" 41 | }, 42 | { 43 | "files": ["**/*.md/*.{jsx,tsx}"], 44 | "rules": { 45 | "@typescript-eslint/no-unused-vars": "error", 46 | "no-unused-vars": "error", 47 | "no-console": "off", 48 | "react/display-name": "off", 49 | "react/prop-types": "off" 50 | } 51 | }, 52 | { 53 | "files": ["**/*.md/*.{js,ts}"], 54 | "rules": { 55 | "@typescript-eslint/no-unused-vars": "off", 56 | "no-unused-vars": "off", 57 | "no-console": "off", 58 | "react/display-name": "off", 59 | "react/prop-types": "off" 60 | } 61 | } 62 | ] 63 | } 64 | ``` -------------------------------------------------------------------------------- /packages/benchmark/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Formily', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Guide', 14 | path: '/guide', 15 | }, 16 | { 17 | title: 'API', 18 | path: '/api', 19 | }, 20 | { 21 | title: 'Home Site', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'zh-CN': [ 30 | { 31 | title: '指南', 32 | path: '/zh-CN/guide', 33 | }, 34 | { 35 | title: 'API', 36 | path: '/zh-CN/api', 37 | }, 38 | { 39 | title: '主站', 40 | path: 'https://formilyjs.org', 41 | }, 42 | { 43 | title: 'GITHUB', 44 | path: 'https://github.com/alibaba/formily', 45 | }, 46 | ], 47 | }, 48 | links: [ 49 | { 50 | rel: 'stylesheet', 51 | href: 'https://esm.sh/[email protected]/dist/antd.css', 52 | }, 53 | ], 54 | styles: [ 55 | `.__dumi-default-navbar-logo{ 56 | height: 60px !important; 57 | width: 150px !important; 58 | padding-left:0 !important; 59 | color: transparent !important; 60 | } 61 | .__dumi-default-navbar{ 62 | padding: 0 28px !important; 63 | } 64 | .__dumi-default-layout-hero{ 65 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 66 | background-size: cover; 67 | background-repeat: no-repeat; 68 | } 69 | nav a{ 70 | text-decoration: none !important; 71 | } 72 | `, 73 | ], 74 | menus: { 75 | '/guide': [ 76 | { 77 | title: 'Introduction', 78 | path: '/guide', 79 | }, 80 | { title: 'Architecture', path: '/guide/architecture' }, 81 | { title: 'Concept', path: '/guide/concept' }, 82 | ], 83 | '/zh-CN/guide': [ 84 | { 85 | title: '介绍', 86 | path: '/guide', 87 | }, 88 | { title: '核心架构', path: '/zh-CN/guide/architecture' }, 89 | { title: '核心概念', path: '/zh-CN/guide/concept' }, 90 | ], 91 | }, 92 | } 93 | ``` -------------------------------------------------------------------------------- /packages/reactive-test-cases-for-react18/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Formily', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Guide', 14 | path: '/guide', 15 | }, 16 | { 17 | title: 'API', 18 | path: '/api', 19 | }, 20 | { 21 | title: 'Home Site', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'zh-CN': [ 30 | { 31 | title: '指南', 32 | path: '/zh-CN/guide', 33 | }, 34 | { 35 | title: 'API', 36 | path: '/zh-CN/api', 37 | }, 38 | { 39 | title: '主站', 40 | path: 'https://formilyjs.org', 41 | }, 42 | { 43 | title: 'GITHUB', 44 | path: 'https://github.com/alibaba/formily', 45 | }, 46 | ], 47 | }, 48 | links: [ 49 | { 50 | rel: 'stylesheet', 51 | href: 'https://esm.sh/[email protected]/dist/antd.css', 52 | }, 53 | ], 54 | styles: [ 55 | `.__dumi-default-navbar-logo{ 56 | height: 60px !important; 57 | width: 150px !important; 58 | padding-left:0 !important; 59 | color: transparent !important; 60 | } 61 | .__dumi-default-navbar{ 62 | padding: 0 28px !important; 63 | } 64 | .__dumi-default-layout-hero{ 65 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 66 | background-size: cover; 67 | background-repeat: no-repeat; 68 | } 69 | nav a{ 70 | text-decoration: none !important; 71 | } 72 | `, 73 | ], 74 | menus: { 75 | '/guide': [ 76 | { 77 | title: 'Introduction', 78 | path: '/guide', 79 | }, 80 | { title: 'Architecture', path: '/guide/architecture' }, 81 | { title: 'Concept', path: '/guide/concept' }, 82 | ], 83 | '/zh-CN/guide': [ 84 | { 85 | title: '介绍', 86 | path: '/guide', 87 | }, 88 | { title: '核心架构', path: '/zh-CN/guide/architecture' }, 89 | { title: '核心概念', path: '/zh-CN/guide/concept' }, 90 | ], 91 | }, 92 | } 93 | ``` -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- ``` 1 | { 2 | "projectName": "formily", 3 | "projectOwner": "alibaba", 4 | "repoType": "github", 5 | "repoHost": "https://github.com", 6 | "files": [ 7 | "README.md" 8 | ], 9 | "imageSize": 100, 10 | "commit": false, 11 | "contributors": [ 12 | { 13 | "login": "janryWang", 14 | "name": "Janry", 15 | "avatar_url": "https://avatars0.githubusercontent.com/u/4060976?v=4", 16 | "profile": "https://github.com/janryWang", 17 | "contributions": [ 18 | "design" 19 | ] 20 | }, 21 | { 22 | "login": "cnt1992", 23 | "name": "SkyCai", 24 | "avatar_url": "https://avatars1.githubusercontent.com/u/3118988?v=4", 25 | "profile": "http://cnt1992.github.io", 26 | "contributions": [ 27 | "design" 28 | ] 29 | }, 30 | { 31 | "login": "yujiangshui", 32 | "name": "Harry Yu", 33 | "avatar_url": "https://avatars3.githubusercontent.com/u/2942913?v=4", 34 | "profile": "https://www.linkedin.com/in/harry-yu-0a931a69/", 35 | "contributions": [ 36 | "doc", 37 | "code" 38 | ] 39 | }, 40 | { 41 | "login": "zsirfs", 42 | "name": "zsir", 43 | "avatar_url": "https://avatars2.githubusercontent.com/u/22249411?v=4", 44 | "profile": "https://www.luoyangfu.com", 45 | "contributions": [ 46 | "code" 47 | ] 48 | }, 49 | { 50 | "login": "monkindey", 51 | "name": "Kiho · Cham", 52 | "avatar_url": "https://avatars0.githubusercontent.com/u/6913898?v=4", 53 | "profile": "http://www.monkindey.xyz/", 54 | "contributions": [ 55 | "code", 56 | "doc" 57 | ] 58 | }, 59 | { 60 | "login": "whj1995", 61 | "name": "Hongjiang Wu", 62 | "avatar_url": "https://avatars2.githubusercontent.com/u/22634735?v=4", 63 | "profile": "http://whj1995.xyz", 64 | "contributions": [ 65 | "doc" 66 | ] 67 | }, 68 | { 69 | "login": "anyuxuan", 70 | "name": "合木", 71 | "avatar_url": "https://avatars3.githubusercontent.com/u/24931869?v=4", 72 | "profile": "https://github.com/anyuxuan", 73 | "contributions": [ 74 | "code" 75 | ] 76 | }, 77 | { 78 | "login": "Azath0th", 79 | "name": "Chen YuBen", 80 | "avatar_url": "https://avatars2.githubusercontent.com/u/18497361?v=4", 81 | "profile": "https://github.com/Azath0th", 82 | "contributions": [ 83 | "code" 84 | ] 85 | }, 86 | { 87 | "login": "HarrisFeng", 88 | "name": "Harris Feng", 89 | "avatar_url": "https://avatars1.githubusercontent.com/u/7928957?v=4", 90 | "profile": "https://github.com/HarrisFeng", 91 | "contributions": [ 92 | "code" 93 | ] 94 | } 95 | ], 96 | "contributorsPerLine": 7 97 | } 98 | ``` -------------------------------------------------------------------------------- /devtools/.eslintrc: -------------------------------------------------------------------------------- ``` 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "extends": [ 4 | "plugin:react/recommended", 5 | "plugin:@typescript-eslint/recommended", 6 | "prettier/@typescript-eslint" 7 | ], 8 | "env": { 9 | "node": true 10 | }, 11 | "plugins": ["@typescript-eslint", "react", "prettier", "markdown"], 12 | "parserOptions": { 13 | "sourceType": "module", 14 | "ecmaVersion": 10, 15 | "ecmaFeatures": { 16 | "jsx": true 17 | } 18 | }, 19 | "settings": { 20 | "react": { 21 | "version": "detect" 22 | } 23 | }, 24 | "rules": { 25 | "prettier/prettier": 0, 26 | // don't force es6 functions to include space before paren 27 | "space-before-function-paren": 0, 28 | "react/prop-types": 0, 29 | "react/no-find-dom-node": 0, 30 | "react/display-name": 0, 31 | // allow specifying true explicitly for boolean props 32 | "react/jsx-boolean-value": 0, 33 | "react/no-did-update-set-state": 0, 34 | // maybe we should no-public 35 | "@typescript-eslint/explicit-member-accessibility": 0, 36 | "@typescript-eslint/interface-name-prefix": 0, 37 | "@typescript-eslint/no-explicit-any": 0, 38 | "@typescript-eslint/explicit-function-return-type": 0, 39 | "@typescript-eslint/no-parameter-properties": 0, 40 | "@typescript-eslint/array-type": 0, 41 | "@typescript-eslint/no-object-literal-type-assertion": 0, 42 | "@typescript-eslint/no-use-before-define": 0, 43 | "@typescript-eslint/no-unused-vars": 1, 44 | "@typescript-eslint/no-namespace": 0, 45 | "@typescript-eslint/ban-types": 0, 46 | "@typescript-eslint/adjacent-overload-signatures": 0, 47 | "@typescript-eslint/explicit-module-boundary-types": 0, 48 | "@typescript-eslint/triple-slash-reference": 0, 49 | "@typescript-eslint/no-empty-function": 0, 50 | "no-console": [ 51 | "error", 52 | { 53 | "allow": ["warn", "error", "info"] 54 | } 55 | ], 56 | "prefer-const": 0, 57 | "no-var": 1, 58 | "prefer-rest-params": 0 59 | }, 60 | "overrides": [ 61 | { 62 | "files": ["**/*.md.{jsx,tsx}"], 63 | "processor": "markdown/markdown" 64 | }, 65 | { 66 | "files": ["**/*.md/*.{jsx,tsx}"], 67 | "rules": { 68 | "@typescript-eslint/no-unused-vars": "error", 69 | "no-unused-vars": "error", 70 | "no-console": "off", 71 | "react/display-name": "off", 72 | "react/prop-types": "off" 73 | } 74 | }, 75 | { 76 | "files": ["**/*.md/*.{js,ts}"], 77 | "rules": { 78 | "@typescript-eslint/no-unused-vars": "off", 79 | "no-unused-vars": "off", 80 | "no-console": "off", 81 | "react/display-name": "off", 82 | "react/prop-types": "off" 83 | } 84 | } 85 | ] 86 | } 87 | ``` -------------------------------------------------------------------------------- /packages/.eslintrc: -------------------------------------------------------------------------------- ``` 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "extends": [ 4 | "plugin:react/recommended", 5 | "plugin:@typescript-eslint/recommended", 6 | "prettier/@typescript-eslint" 7 | ], 8 | "env": { 9 | "node": true 10 | }, 11 | "plugins": ["@typescript-eslint", "react", "prettier", "markdown"], 12 | "parserOptions": { 13 | "sourceType": "module", 14 | "ecmaVersion": 10, 15 | "ecmaFeatures": { 16 | "jsx": true 17 | } 18 | }, 19 | "settings": { 20 | "react": { 21 | "version": "detect" 22 | } 23 | }, 24 | "rules": { 25 | "prettier/prettier": 0, 26 | // don't force es6 functions to include space before paren 27 | "space-before-function-paren": 0, 28 | "react/prop-types": 0, 29 | "react/no-find-dom-node": 0, 30 | "react/display-name": 0, 31 | // allow specifying true explicitly for boolean props 32 | "react/jsx-boolean-value": 0, 33 | "react/no-did-update-set-state": 0, 34 | "react/no-unescaped-entities": "off", 35 | // maybe we should no-public 36 | "@typescript-eslint/explicit-member-accessibility": 0, 37 | "@typescript-eslint/interface-name-prefix": 0, 38 | "@typescript-eslint/no-explicit-any": 0, 39 | "@typescript-eslint/explicit-function-return-type": 0, 40 | "@typescript-eslint/no-parameter-properties": 0, 41 | "@typescript-eslint/array-type": 0, 42 | "@typescript-eslint/no-object-literal-type-assertion": 0, 43 | "@typescript-eslint/no-use-before-define": 0, 44 | "@typescript-eslint/no-unused-vars": 1, 45 | "@typescript-eslint/no-namespace": 0, 46 | "@typescript-eslint/ban-ts-comment": 0, 47 | "@typescript-eslint/ban-types": 0, 48 | "@typescript-eslint/adjacent-overload-signatures": 0, 49 | "@typescript-eslint/explicit-module-boundary-types": 0, 50 | "@typescript-eslint/triple-slash-reference": 0, 51 | "@typescript-eslint/no-empty-function": 0, 52 | "no-console": [ 53 | "error", 54 | { 55 | "allow": ["warn", "error", "info"] 56 | } 57 | ], 58 | "prefer-const": 0, 59 | "no-var": 1, 60 | "prefer-rest-params": 0 61 | }, 62 | "overrides": [ 63 | { 64 | "files": ["**/*.md.{jsx,tsx}"], 65 | "processor": "markdown/markdown" 66 | }, 67 | { 68 | "files": ["**/*.md/*.{jsx,tsx}"], 69 | "rules": { 70 | "@typescript-eslint/no-unused-vars": "error", 71 | "no-unused-vars": "error", 72 | "no-console": "off", 73 | "react/display-name": "off", 74 | "react/prop-types": "off" 75 | } 76 | }, 77 | { 78 | "files": ["**/*.md/*.{js,ts}"], 79 | "rules": { 80 | "@typescript-eslint/no-unused-vars": "off", 81 | "no-unused-vars": "off", 82 | "no-console": "off", 83 | "react/display-name": "off", 84 | "react/prop-types": "off" 85 | } 86 | } 87 | ] 88 | } 89 | ``` -------------------------------------------------------------------------------- /packages/reactive-react/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'doc', 4 | logo: 'https://img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Formily', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | headScripts: [ 11 | ` 12 | function loadAd(){ 13 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 14 | if(header && !header.querySelector('#_carbonads_js')){ 15 | var script = document.createElement('script') 16 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 17 | script.id = '_carbonads_js' 18 | script.classList.add('head-ad') 19 | header.appendChild(script) 20 | } 21 | } 22 | var request = null 23 | var observer = new MutationObserver(function(){ 24 | cancelIdleCallback(request) 25 | request = requestIdleCallback(loadAd) 26 | }) 27 | document.addEventListener('DOMContentLoaded',function(){ 28 | loadAd() 29 | observer.observe( 30 | document.body, 31 | { 32 | childList:true, 33 | subtree:true 34 | } 35 | ) 36 | }) 37 | `, 38 | ], 39 | styles: [ 40 | `.__dumi-default-navbar-logo{ 41 | background-size: 140px!important; 42 | background-position: center left!important; 43 | background-repeat: no-repeat!important; 44 | padding-left: 150px!important;/*可根据title的宽度调整*/ 45 | font-size: 22px!important; 46 | color: #000!important; 47 | font-weight: lighter!important; 48 | } 49 | .__dumi-default-navbar{ 50 | padding: 0 28px !important; 51 | } 52 | .__dumi-default-layout-hero{ 53 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 54 | background-size: cover; 55 | background-repeat: no-repeat; 56 | padding: 120px 0 !important; 57 | } 58 | .__dumi-default-layout-hero h1{ 59 | color:#45124e !important; 60 | font-size:80px !important; 61 | padding-bottom: 30px !important; 62 | } 63 | .__dumi-default-dark-switch { 64 | display:none 65 | } 66 | nav a{ 67 | text-decoration: none !important; 68 | } 69 | #carbonads * { 70 | margin: initial; 71 | padding: initial; 72 | } 73 | #carbonads { 74 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 75 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 76 | sans-serif; 77 | } 78 | #carbonads { 79 | display: flex; 80 | max-width: 330px; 81 | background-color: hsl(0, 0%, 98%); 82 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 83 | z-index: 100; 84 | float:right; 85 | } 86 | #carbonads a { 87 | color: inherit; 88 | text-decoration: none; 89 | } 90 | #carbonads a:hover { 91 | color: inherit; 92 | } 93 | #carbonads span { 94 | position: relative; 95 | display: block; 96 | overflow: hidden; 97 | } 98 | #carbonads .carbon-wrap { 99 | display: flex; 100 | } 101 | #carbonads .carbon-img { 102 | display: block; 103 | margin: 0; 104 | line-height: 1; 105 | } 106 | #carbonads .carbon-img img { 107 | display: block; 108 | } 109 | #carbonads .carbon-text { 110 | font-size: 13px; 111 | padding: 10px; 112 | margin-bottom: 16px; 113 | line-height: 1.5; 114 | text-align: left; 115 | } 116 | #carbonads .carbon-poweredby { 117 | display: block; 118 | padding: 6px 8px; 119 | background: #f1f1f2; 120 | text-align: center; 121 | text-transform: uppercase; 122 | letter-spacing: 0.5px; 123 | font-weight: 600; 124 | font-size: 8px; 125 | line-height: 1; 126 | border-top-left-radius: 3px; 127 | position: absolute; 128 | bottom: 0; 129 | right: 0; 130 | } 131 | `, 132 | ], 133 | } 134 | ``` -------------------------------------------------------------------------------- /packages/antd/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Ant Design', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | locales: [ 11 | ['en-US', 'English'], 12 | ['zh-CN', '中文'], 13 | ], 14 | navs: { 15 | 'zh-CN': [ 16 | { 17 | title: 'Ant Design', 18 | path: '/zh-CN/components', 19 | }, 20 | { 21 | title: '主站', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'en-US': [ 30 | { 31 | title: 'Ant Design', 32 | path: '/components', 33 | }, 34 | { 35 | title: 'Home Site', 36 | path: 'https://formilyjs.org', 37 | }, 38 | { 39 | title: 'GITHUB', 40 | path: 'https://github.com/alibaba/formily', 41 | }, 42 | ], 43 | }, 44 | links: [ 45 | { 46 | rel: 'stylesheet', 47 | href: 'https://esm.sh/[email protected]/dist/antd.css', 48 | }, 49 | ], 50 | headScripts: [ 51 | ` 52 | function loadAd(){ 53 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 54 | if(header && !header.querySelector('#_carbonads_js')){ 55 | var script = document.createElement('script') 56 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 57 | script.id = '_carbonads_js' 58 | script.classList.add('head-ad') 59 | header.appendChild(script) 60 | } 61 | } 62 | var request = null 63 | var observer = new MutationObserver(function(){ 64 | cancelIdleCallback(request) 65 | request = requestIdleCallback(loadAd) 66 | }) 67 | document.addEventListener('DOMContentLoaded',function(){ 68 | loadAd() 69 | observer.observe( 70 | document.body, 71 | { 72 | childList:true, 73 | subtree:true 74 | } 75 | ) 76 | }) 77 | `, 78 | ], 79 | styles: [ 80 | `.__dumi-default-navbar-logo{ 81 | height: 60px !important; 82 | width: 150px !important; 83 | padding-left:0 !important; 84 | color: transparent !important; 85 | } 86 | .__dumi-default-navbar{ 87 | padding: 0 28px !important; 88 | } 89 | .__dumi-default-layout-hero{ 90 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 91 | background-size: cover; 92 | background-repeat: no-repeat; 93 | padding: 120px 0 !important; 94 | } 95 | .__dumi-default-layout-hero h1{ 96 | color:#45124e !important; 97 | font-size:80px !important; 98 | padding-bottom: 30px !important; 99 | } 100 | .__dumi-default-dark-switch { 101 | display:none 102 | } 103 | nav a{ 104 | text-decoration: none !important; 105 | } 106 | #carbonads * { 107 | margin: initial; 108 | padding: initial; 109 | } 110 | #carbonads { 111 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 112 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 113 | sans-serif; 114 | } 115 | #carbonads { 116 | display: flex; 117 | max-width: 330px; 118 | background-color: hsl(0, 0%, 98%); 119 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 120 | z-index: 100; 121 | float:right; 122 | } 123 | #carbonads a { 124 | color: inherit; 125 | text-decoration: none; 126 | } 127 | #carbonads a:hover { 128 | color: inherit; 129 | } 130 | #carbonads span { 131 | position: relative; 132 | display: block; 133 | overflow: hidden; 134 | } 135 | #carbonads .carbon-wrap { 136 | display: flex; 137 | } 138 | #carbonads .carbon-img { 139 | display: block; 140 | margin: 0; 141 | line-height: 1; 142 | } 143 | #carbonads .carbon-img img { 144 | display: block; 145 | } 146 | #carbonads .carbon-text { 147 | font-size: 13px; 148 | padding: 10px; 149 | margin-bottom: 16px; 150 | line-height: 1.5; 151 | text-align: left; 152 | } 153 | #carbonads .carbon-poweredby { 154 | display: block; 155 | padding: 6px 8px; 156 | background: #f1f1f2; 157 | text-align: center; 158 | text-transform: uppercase; 159 | letter-spacing: 0.5px; 160 | font-weight: 600; 161 | font-size: 8px; 162 | line-height: 1; 163 | border-top-left-radius: 3px; 164 | position: absolute; 165 | bottom: 0; 166 | right: 0; 167 | } 168 | `, 169 | ], 170 | } 171 | ``` -------------------------------------------------------------------------------- /packages/next/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Fusion', 6 | favicon: 7 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 8 | hash: true, 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Alibaba Fusion', 14 | path: '/components', 15 | }, 16 | { 17 | title: 'Home Site', 18 | path: 'https://formilyjs.org', 19 | }, 20 | { 21 | title: 'GITHUB', 22 | path: 'https://github.com/alibaba/formily', 23 | }, 24 | ], 25 | 'zh-CN': [ 26 | { 27 | title: 'Alibaba Fusion', 28 | path: '/zh-CN/components', 29 | }, 30 | { 31 | title: '主站', 32 | path: 'https://formilyjs.org', 33 | }, 34 | { 35 | title: 'GITHUB', 36 | path: 'https://github.com/alibaba/formily', 37 | }, 38 | ], 39 | }, 40 | links: [ 41 | { 42 | rel: 'stylesheet', 43 | href: 'https://esm.sh/@alifd/next/dist/next-noreset.css', 44 | }, 45 | ], 46 | headScripts: [ 47 | ` 48 | function loadAd(){ 49 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 50 | if(header && !header.querySelector('#_carbonads_js')){ 51 | var script = document.createElement('script') 52 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 53 | script.id = '_carbonads_js' 54 | script.classList.add('head-ad') 55 | header.appendChild(script) 56 | } 57 | } 58 | var request = null 59 | var observer = new MutationObserver(function(){ 60 | cancelIdleCallback(request) 61 | request = requestIdleCallback(loadAd) 62 | }) 63 | document.addEventListener('DOMContentLoaded',function(){ 64 | loadAd() 65 | observer.observe( 66 | document.body, 67 | { 68 | childList:true, 69 | subtree:true 70 | } 71 | ) 72 | }) 73 | `, 74 | ], 75 | styles: [ 76 | `.__dumi-default-navbar-logo{ 77 | background-size: 140px!important; 78 | background-position: center left!important; 79 | background-repeat: no-repeat!important; 80 | padding-left: 150px!important;/*可根据title的宽度调整*/ 81 | font-size: 22px!important; 82 | color: #000!important; 83 | font-weight: lighter!important; 84 | } 85 | .__dumi-default-navbar{ 86 | padding: 0 28px !important; 87 | } 88 | .__dumi-default-layout-hero{ 89 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 90 | background-size: cover; 91 | background-repeat: no-repeat; 92 | padding: 120px 0 !important; 93 | } 94 | .__dumi-default-layout-hero h1{ 95 | color:#45124e !important; 96 | font-size:80px !important; 97 | padding-bottom: 30px !important; 98 | } 99 | .__dumi-default-dark-switch { 100 | display:none 101 | } 102 | nav a{ 103 | text-decoration: none !important; 104 | } 105 | #carbonads * { 106 | margin: initial; 107 | padding: initial; 108 | } 109 | #carbonads { 110 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 111 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 112 | sans-serif; 113 | } 114 | #carbonads { 115 | display: flex; 116 | max-width: 330px; 117 | background-color: hsl(0, 0%, 98%); 118 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 119 | z-index: 100; 120 | float:right; 121 | } 122 | #carbonads a { 123 | color: inherit; 124 | text-decoration: none; 125 | } 126 | #carbonads a:hover { 127 | color: inherit; 128 | } 129 | #carbonads span { 130 | position: relative; 131 | display: block; 132 | overflow: hidden; 133 | } 134 | #carbonads .carbon-wrap { 135 | display: flex; 136 | } 137 | #carbonads .carbon-img { 138 | display: block; 139 | margin: 0; 140 | line-height: 1; 141 | } 142 | #carbonads .carbon-img img { 143 | display: block; 144 | } 145 | #carbonads .carbon-text { 146 | font-size: 13px; 147 | padding: 10px; 148 | margin-bottom: 16px; 149 | line-height: 1.5; 150 | text-align: left; 151 | } 152 | #carbonads .carbon-poweredby { 153 | display: block; 154 | padding: 6px 8px; 155 | background: #f1f1f2; 156 | text-align: center; 157 | text-transform: uppercase; 158 | letter-spacing: 0.5px; 159 | font-weight: 600; 160 | font-size: 8px; 161 | line-height: 1; 162 | border-top-left-radius: 3px; 163 | position: absolute; 164 | bottom: 0; 165 | right: 0; 166 | } 167 | `, 168 | ], 169 | } 170 | ``` -------------------------------------------------------------------------------- /packages/react/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'React', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Guide', 14 | path: '/guide', 15 | }, 16 | { 17 | title: 'API', 18 | path: '/api', 19 | }, 20 | { 21 | title: 'Home Site', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'zh-CN': [ 30 | { 31 | title: '指南', 32 | path: '/zh-CN/guide', 33 | }, 34 | { 35 | title: 'API', 36 | path: '/zh-CN/api', 37 | }, 38 | { 39 | title: '主站', 40 | path: 'https://formilyjs.org', 41 | }, 42 | { 43 | title: 'GITHUB', 44 | path: 'https://github.com/alibaba/formily', 45 | }, 46 | ], 47 | }, 48 | links: [ 49 | { 50 | rel: 'stylesheet', 51 | href: 'https://esm.sh/[email protected]/dist/antd.css', 52 | }, 53 | ], 54 | headScripts: [ 55 | ` 56 | function loadAd(){ 57 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 58 | if(header && !header.querySelector('#_carbonads_js')){ 59 | var script = document.createElement('script') 60 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 61 | script.id = '_carbonads_js' 62 | script.classList.add('head-ad') 63 | header.appendChild(script) 64 | } 65 | } 66 | var request = null 67 | var observer = new MutationObserver(function(){ 68 | cancelIdleCallback(request) 69 | request = requestIdleCallback(loadAd) 70 | }) 71 | document.addEventListener('DOMContentLoaded',function(){ 72 | loadAd() 73 | observer.observe( 74 | document.body, 75 | { 76 | childList:true, 77 | subtree:true 78 | } 79 | ) 80 | }) 81 | `, 82 | ], 83 | styles: [ 84 | `.__dumi-default-navbar-logo{ 85 | background-size: 140px!important; 86 | background-position: center left!important; 87 | background-repeat: no-repeat!important; 88 | padding-left: 150px!important;/*可根据title的宽度调整*/ 89 | font-size: 22px!important; 90 | color: #000!important; 91 | font-weight: lighter!important; 92 | } 93 | .__dumi-default-navbar{ 94 | padding: 0 28px !important; 95 | } 96 | .__dumi-default-layout-hero{ 97 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 98 | background-size: cover; 99 | background-repeat: no-repeat; 100 | padding: 120px 0 !important; 101 | } 102 | .__dumi-default-layout-hero h1{ 103 | color:#45124e !important; 104 | font-size:80px !important; 105 | padding-bottom: 30px !important; 106 | } 107 | .__dumi-default-dark-switch { 108 | display:none 109 | } 110 | nav a{ 111 | text-decoration: none !important; 112 | } 113 | #carbonads * { 114 | margin: initial; 115 | padding: initial; 116 | } 117 | #carbonads { 118 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 119 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 120 | sans-serif; 121 | } 122 | #carbonads { 123 | display: flex; 124 | max-width: 330px; 125 | background-color: hsl(0, 0%, 98%); 126 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 127 | z-index: 100; 128 | float:right; 129 | } 130 | #carbonads a { 131 | color: inherit; 132 | text-decoration: none; 133 | } 134 | #carbonads a:hover { 135 | color: inherit; 136 | } 137 | #carbonads span { 138 | position: relative; 139 | display: block; 140 | overflow: hidden; 141 | } 142 | #carbonads .carbon-wrap { 143 | display: flex; 144 | } 145 | #carbonads .carbon-img { 146 | display: block; 147 | margin: 0; 148 | line-height: 1; 149 | } 150 | #carbonads .carbon-img img { 151 | display: block; 152 | } 153 | #carbonads .carbon-text { 154 | font-size: 13px; 155 | padding: 10px; 156 | margin-bottom: 16px; 157 | line-height: 1.5; 158 | text-align: left; 159 | } 160 | #carbonads .carbon-poweredby { 161 | display: block; 162 | padding: 6px 8px; 163 | background: #f1f1f2; 164 | text-align: center; 165 | text-transform: uppercase; 166 | letter-spacing: 0.5px; 167 | font-weight: 600; 168 | font-size: 8px; 169 | line-height: 1; 170 | border-top-left-radius: 3px; 171 | position: absolute; 172 | bottom: 0; 173 | right: 0; 174 | } 175 | `, 176 | ], 177 | menus: { 178 | '/guide': [ 179 | { 180 | title: 'Introduction', 181 | path: '/guide', 182 | }, 183 | { title: 'Architecture', path: '/guide/architecture' }, 184 | { title: 'Concept', path: '/guide/concept' }, 185 | ], 186 | '/zh-CN/guide': [ 187 | { 188 | title: '介绍', 189 | path: '/guide', 190 | }, 191 | { title: '核心架构', path: '/zh-CN/guide/architecture' }, 192 | { title: '核心概念', path: '/zh-CN/guide/concept' }, 193 | ], 194 | }, 195 | } 196 | ``` -------------------------------------------------------------------------------- /packages/core/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: 'https://img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Core', 6 | hash: true, 7 | favicon: 8 | 'https://img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Guide', 14 | path: '/guide', 15 | }, 16 | { 17 | title: 'API', 18 | path: '/api', 19 | }, 20 | { 21 | title: 'Home Site', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'zh-CN': [ 30 | { 31 | title: '指南', 32 | path: '/zh-CN/guide', 33 | }, 34 | { 35 | title: 'API', 36 | path: '/zh-CN/api', 37 | }, 38 | { 39 | title: '主站', 40 | path: 'https://formilyjs.org', 41 | }, 42 | { 43 | title: 'GITHUB', 44 | path: 'https://github.com/alibaba/formily', 45 | }, 46 | ], 47 | }, 48 | headScripts: [ 49 | ` 50 | function loadAd(){ 51 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 52 | if(header && !header.querySelector('#_carbonads_js')){ 53 | var script = document.createElement('script') 54 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 55 | script.id = '_carbonads_js' 56 | script.classList.add('head-ad') 57 | header.appendChild(script) 58 | } 59 | } 60 | var request = null 61 | var observer = new MutationObserver(function(){ 62 | cancelIdleCallback(request) 63 | request = requestIdleCallback(loadAd) 64 | }) 65 | document.addEventListener('DOMContentLoaded',function(){ 66 | loadAd() 67 | observer.observe( 68 | document.body, 69 | { 70 | childList:true, 71 | subtree:true 72 | } 73 | ) 74 | }) 75 | `, 76 | ], 77 | styles: [ 78 | `.__dumi-default-navbar-logo{ 79 | background-size: 140px!important; 80 | background-position: center left!important; 81 | background-repeat: no-repeat!important; 82 | padding-left: 150px!important;/*可根据title的宽度调整*/ 83 | font-size: 22px!important; 84 | color: #000!important; 85 | font-weight: lighter!important; 86 | } 87 | .__dumi-default-navbar{ 88 | padding: 0 28px !important; 89 | } 90 | .__dumi-default-layout-hero{ 91 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 92 | background-size: cover; 93 | background-repeat: no-repeat; 94 | padding: 120px 0 !important; 95 | } 96 | .__dumi-default-layout-hero h1{ 97 | color:#45124e !important; 98 | font-size:80px !important; 99 | padding-bottom: 30px !important; 100 | } 101 | .__dumi-default-dark-switch { 102 | display:none 103 | } 104 | nav a{ 105 | text-decoration: none !important; 106 | } 107 | #carbonads * { 108 | margin: initial; 109 | padding: initial; 110 | } 111 | #carbonads { 112 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 113 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 114 | sans-serif; 115 | } 116 | #carbonads { 117 | display: flex; 118 | max-width: 330px; 119 | background-color: hsl(0, 0%, 98%); 120 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 121 | z-index: 100; 122 | float:right; 123 | } 124 | #carbonads a { 125 | color: inherit; 126 | text-decoration: none; 127 | } 128 | #carbonads a:hover { 129 | color: inherit; 130 | } 131 | #carbonads span { 132 | position: relative; 133 | display: block; 134 | overflow: hidden; 135 | } 136 | #carbonads .carbon-wrap { 137 | display: flex; 138 | } 139 | #carbonads .carbon-img { 140 | display: block; 141 | margin: 0; 142 | line-height: 1; 143 | } 144 | #carbonads .carbon-img img { 145 | display: block; 146 | } 147 | #carbonads .carbon-text { 148 | font-size: 13px; 149 | padding: 10px; 150 | margin-bottom: 16px; 151 | line-height: 1.5; 152 | text-align: left; 153 | } 154 | #carbonads .carbon-poweredby { 155 | display: block; 156 | padding: 6px 8px; 157 | background: #f1f1f2; 158 | text-align: center; 159 | text-transform: uppercase; 160 | letter-spacing: 0.5px; 161 | font-weight: 600; 162 | font-size: 8px; 163 | line-height: 1; 164 | border-top-left-radius: 3px; 165 | position: absolute; 166 | bottom: 0; 167 | right: 0; 168 | } 169 | `, 170 | ], 171 | menus: { 172 | '/guide': [ 173 | { 174 | title: 'Introduction', 175 | children: [ 176 | { 177 | title: 'Introduction', 178 | path: '/guide', 179 | }, 180 | { title: 'Architecture', path: '/guide/architecture' }, 181 | ], 182 | }, 183 | { 184 | title: 'Concept', 185 | children: [ 186 | { 187 | title: 'MVVM', 188 | path: '/guide/mvvm', 189 | }, 190 | { 191 | title: 'Form Model', 192 | path: '/guide/form', 193 | }, 194 | { 195 | title: 'Field Model', 196 | path: '/guide/field', 197 | }, 198 | ], 199 | }, 200 | ], 201 | 202 | '/zh-CN/guide': [ 203 | { 204 | title: '概览', 205 | children: [ 206 | { 207 | title: '介绍', 208 | path: '/zh-CN/guide', 209 | }, 210 | { title: '核心架构', path: '/zh-CN/guide/architecture' }, 211 | ], 212 | }, 213 | { 214 | title: '概念', 215 | children: [ 216 | { 217 | title: 'MVVM', 218 | path: '/zh-CN/guide/mvvm', 219 | }, 220 | { 221 | title: '表单模型', 222 | path: '/zh-CN/guide/form', 223 | }, 224 | { 225 | title: '字段模型', 226 | path: '/zh-CN/guide/field', 227 | }, 228 | ], 229 | }, 230 | ], 231 | }, 232 | } 233 | ``` -------------------------------------------------------------------------------- /packages/reactive/.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | import { resolve } from 'path' 2 | export default { 3 | mode: 'site', 4 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 5 | title: 'Reactive', 6 | hash: true, 7 | favicon: 8 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 9 | outputPath: './doc-site', 10 | navs: { 11 | 'en-US': [ 12 | { 13 | title: 'Guide', 14 | path: '/guide', 15 | }, 16 | { 17 | title: 'API', 18 | path: '/api', 19 | }, 20 | { 21 | title: 'Home Site', 22 | path: 'https://formilyjs.org', 23 | }, 24 | { 25 | title: 'GITHUB', 26 | path: 'https://github.com/alibaba/formily', 27 | }, 28 | ], 29 | 'zh-CN': [ 30 | { 31 | title: '指南', 32 | path: '/zh-CN/guide', 33 | }, 34 | { 35 | title: 'API', 36 | path: '/zh-CN/api', 37 | }, 38 | { 39 | title: '主站', 40 | path: 'https://formilyjs.org', 41 | }, 42 | { 43 | title: 'GITHUB', 44 | path: 'https://github.com/alibaba/formily', 45 | }, 46 | ], 47 | }, 48 | headScripts: [ 49 | ` 50 | function loadAd(){ 51 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 52 | if(header && !header.querySelector('#_carbonads_js')){ 53 | var script = document.createElement('script') 54 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 55 | script.id = '_carbonads_js' 56 | script.classList.add('head-ad') 57 | header.appendChild(script) 58 | } 59 | } 60 | var request = null 61 | var observer = new MutationObserver(function(){ 62 | cancelIdleCallback(request) 63 | request = requestIdleCallback(loadAd) 64 | }) 65 | document.addEventListener('DOMContentLoaded',function(){ 66 | loadAd() 67 | observer.observe( 68 | document.body, 69 | { 70 | childList:true, 71 | subtree:true 72 | } 73 | ) 74 | }) 75 | `, 76 | ], 77 | styles: [ 78 | `.__dumi-default-navbar-logo{ 79 | background-size: 140px!important; 80 | background-position: center left!important; 81 | background-repeat: no-repeat!important; 82 | padding-left: 150px!important;/*可根据title的宽度调整*/ 83 | font-size: 22px!important; 84 | color: #000!important; 85 | font-weight: lighter!important; 86 | } 87 | .__dumi-default-navbar{ 88 | padding: 0 28px !important; 89 | } 90 | .__dumi-default-layout-hero{ 91 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 92 | background-size: cover; 93 | background-repeat: no-repeat; 94 | padding: 120px 0 !important; 95 | } 96 | .__dumi-default-layout-hero h1{ 97 | color:#45124e !important; 98 | font-size:80px !important; 99 | padding-bottom: 30px !important; 100 | } 101 | .__dumi-default-dark-switch { 102 | display:none 103 | } 104 | nav a{ 105 | text-decoration: none !important; 106 | } 107 | #carbonads * { 108 | margin: initial; 109 | padding: initial; 110 | } 111 | #carbonads { 112 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 113 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 114 | sans-serif; 115 | } 116 | #carbonads { 117 | display: flex; 118 | max-width: 330px; 119 | background-color: hsl(0, 0%, 98%); 120 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 121 | z-index: 100; 122 | float:right; 123 | } 124 | #carbonads a { 125 | color: inherit; 126 | text-decoration: none; 127 | } 128 | #carbonads a:hover { 129 | color: inherit; 130 | } 131 | #carbonads span { 132 | position: relative; 133 | display: block; 134 | overflow: hidden; 135 | } 136 | #carbonads .carbon-wrap { 137 | display: flex; 138 | } 139 | #carbonads .carbon-img { 140 | display: block; 141 | margin: 0; 142 | line-height: 1; 143 | } 144 | #carbonads .carbon-img img { 145 | display: block; 146 | } 147 | #carbonads .carbon-text { 148 | font-size: 13px; 149 | padding: 10px; 150 | margin-bottom: 16px; 151 | line-height: 1.5; 152 | text-align: left; 153 | } 154 | #carbonads .carbon-poweredby { 155 | display: block; 156 | padding: 6px 8px; 157 | background: #f1f1f2; 158 | text-align: center; 159 | text-transform: uppercase; 160 | letter-spacing: 0.5px; 161 | font-weight: 600; 162 | font-size: 8px; 163 | line-height: 1; 164 | border-top-left-radius: 3px; 165 | position: absolute; 166 | bottom: 0; 167 | right: 0; 168 | } 169 | `, 170 | ], 171 | menus: { 172 | '/guide': [ 173 | { 174 | title: 'Introduction', 175 | path: '/guide', 176 | }, 177 | { title: 'Concept', path: '/guide/concept' }, 178 | { 179 | title: 'Best Practice', 180 | path: '/guide/best-practice', 181 | }, 182 | ], 183 | '/api': [ 184 | { 185 | title: '@formily/reactive', 186 | children: [ 187 | { 188 | title: 'observable', 189 | path: '/api/observable', 190 | }, 191 | { 192 | title: 'autorun', 193 | path: '/api/autorun', 194 | }, 195 | { 196 | title: 'reaction', 197 | path: '/api/reaction', 198 | }, 199 | 200 | { 201 | title: 'batch', 202 | path: '/api/batch', 203 | }, 204 | { 205 | title: 'action', 206 | path: '/api/action', 207 | }, 208 | { 209 | title: 'define', 210 | path: '/api/define', 211 | }, 212 | { 213 | title: 'model', 214 | path: '/api/model', 215 | }, 216 | { 217 | title: 'observe', 218 | path: '/api/observe', 219 | }, 220 | { 221 | title: 'markRaw', 222 | path: '/api/mark-raw', 223 | }, 224 | { 225 | title: 'markObservable', 226 | path: '/api/mark-observable', 227 | }, 228 | { 229 | title: 'raw', 230 | path: '/api/raw', 231 | }, 232 | { 233 | title: 'toJS', 234 | path: '/api/to-js', 235 | }, 236 | { 237 | title: 'untracked', 238 | path: '/api/untracked', 239 | }, 240 | { 241 | title: 'hasCollected', 242 | path: '/api/has-collected', 243 | }, 244 | { 245 | title: 'Tracker', 246 | path: '/api/tracker', 247 | }, 248 | { 249 | title: 'Type Chekcer', 250 | path: '/api/type-checker', 251 | }, 252 | ], 253 | }, 254 | { 255 | title: '@formily/reactive-react', 256 | children: [ 257 | { 258 | title: 'observer', 259 | path: '/api/react/observer', 260 | }, 261 | ], 262 | }, 263 | { 264 | title: '@formily/reactive-vue', 265 | children: [ 266 | { 267 | title: 'observer', 268 | path: '/api/vue/observer', 269 | }, 270 | ], 271 | }, 272 | ], 273 | '/zh-CN/guide': [ 274 | { 275 | title: '介绍', 276 | path: '/zh-CN/guide', 277 | }, 278 | { title: '核心概念', path: '/zh-CN/guide/concept' }, 279 | { 280 | title: '最佳实践', 281 | path: '/zh-CN/guide/best-practice', 282 | }, 283 | ], 284 | '/zh-CN/api': [ 285 | { 286 | title: '@formily/reactive', 287 | children: [ 288 | { 289 | title: 'observable', 290 | path: '/zh-CN/api/observable', 291 | }, 292 | { 293 | title: 'autorun', 294 | path: '/zh-CN/api/autorun', 295 | }, 296 | { 297 | title: 'reaction', 298 | path: '/zh-CN/api/reaction', 299 | }, 300 | 301 | { 302 | title: 'batch', 303 | path: '/zh-CN/api/batch', 304 | }, 305 | { 306 | title: 'action', 307 | path: '/zh-CN/api/action', 308 | }, 309 | { 310 | title: 'define', 311 | path: '/zh-CN/api/define', 312 | }, 313 | { 314 | title: 'model', 315 | path: '/zh-CN/api/model', 316 | }, 317 | { 318 | title: 'observe', 319 | path: '/zh-CN/api/observe', 320 | }, 321 | { 322 | title: 'markRaw', 323 | path: '/zh-CN/api/mark-raw', 324 | }, 325 | { 326 | title: 'markObservable', 327 | path: '/zh-CN/api/mark-observable', 328 | }, 329 | { 330 | title: 'raw', 331 | path: '/zh-CN/api/raw', 332 | }, 333 | { 334 | title: 'toJS', 335 | path: '/zh-CN/api/to-js', 336 | }, 337 | { 338 | title: 'untracked', 339 | path: '/zh-CN/api/untracked', 340 | }, 341 | { 342 | title: 'hasCollected', 343 | path: '/zh-CN/api/has-collected', 344 | }, 345 | { 346 | title: 'Tracker', 347 | path: '/zh-CN/api/tracker', 348 | }, 349 | { 350 | title: 'Type Chekcer', 351 | path: '/zh-CN/api/type-checker', 352 | }, 353 | ], 354 | }, 355 | { 356 | title: '@formily/reactive-react', 357 | children: [ 358 | { 359 | title: 'observer', 360 | path: '/zh-CN/api/react/observer', 361 | }, 362 | ], 363 | }, 364 | { 365 | title: '@formily/reactive-vue', 366 | children: [ 367 | { 368 | title: 'observer', 369 | path: '/zh-CN/api/vue/observer', 370 | }, 371 | ], 372 | }, 373 | ], 374 | }, 375 | } 376 | ``` -------------------------------------------------------------------------------- /.umirc.js: -------------------------------------------------------------------------------- ```javascript 1 | export default { 2 | mode: 'site', 3 | logo: '//img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg', 4 | title: 'Formily', 5 | hash: true, 6 | favicon: 7 | '//img.alicdn.com/imgextra/i3/O1CN01XtT3Tv1Wd1b5hNVKy_!!6000000002810-55-tps-360-360.svg', 8 | outputPath: './doc-site', 9 | locales: [ 10 | ['en-US', 'English'], 11 | ['zh-CN', '中文'], 12 | ], 13 | navs: { 14 | 'en-US': [ 15 | { 16 | title: 'Guide', 17 | path: '/guide', 18 | }, 19 | { 20 | title: 'Basic Core Library', 21 | children: [ 22 | { 23 | title: '@formily/reactive', 24 | path: 'https://reactive.formilyjs.org', 25 | }, 26 | { 27 | title: '@formily/core', 28 | path: 'https://core.formilyjs.org', 29 | }, 30 | { 31 | title: '@formily/react', 32 | path: 'https://react.formilyjs.org', 33 | }, 34 | { 35 | title: '@formily/vue', 36 | path: 'https://vue.formilyjs.org', 37 | }, 38 | ], 39 | }, 40 | { 41 | title: 'Component Ecology', 42 | children: [ 43 | { 44 | title: '@formily/antd', 45 | path: 'https://antd.formilyjs.org', 46 | }, 47 | { 48 | title: '@formily/antd-v5', 49 | path: 'https://antd5.formilyjs.org', 50 | }, 51 | { 52 | title: '@formily/antd-mobile', 53 | path: 'https://antd-mobile.formilyjs.org', 54 | }, 55 | { 56 | title: '@formily/next', 57 | path: 'https://fusion.formilyjs.org', 58 | }, 59 | { 60 | title: '@formily/element', 61 | path: 'https://element.formilyjs.org', 62 | }, 63 | { 64 | title: '@formily/element-plus', 65 | path: 'https://element-plus.formilyjs.org', 66 | }, 67 | { 68 | title: '@formily/antdv', 69 | path: 'https://antdv.formilyjs.org', 70 | }, 71 | { 72 | title: '@formily/antdv-x3', 73 | path: 'https://antdv-x3.formilyjs.org', 74 | }, 75 | { 76 | title: '@formily/vant', 77 | path: 'https://vant.formilyjs.org', 78 | }, 79 | { 80 | title: '@formily/semi', 81 | path: 'https://semi.formilyjs.org', 82 | }, 83 | { 84 | title: '@formily/tdesign-react', 85 | path: 'https://tdesign-react.formilyjs.org/', 86 | }, 87 | { 88 | title: 'aliyun teamix', 89 | path: 'https://formily.dg.aliyun-inc.com/', 90 | }, 91 | { 92 | title: 'antd-formily-boost', 93 | path: 'https://github.com/fishedee/antd-formily-boost', 94 | }, 95 | ], 96 | }, 97 | { 98 | title: 'Tools', 99 | children: [ 100 | { 101 | title: 'Formily Designer', 102 | path: 'https://designable-antd.formilyjs.org/', 103 | }, 104 | { 105 | title: 'Designable', 106 | path: 'https://github.com/alibaba/designable', 107 | }, 108 | { 109 | title: 'Chrome Extension', 110 | path: 'https://chrome.google.com/webstore/detail/formily-devtools/kkocalmbfnplecdmbadaapgapdioecfm?hl=zh-CN', 111 | }, 112 | ], 113 | }, 114 | { 115 | title: 'Community', 116 | children: [ 117 | { 118 | title: 'Forum', 119 | path: 'https://github.com/alibaba/formily/discussions', 120 | }, 121 | { title: 'Zhihu', path: 'https://www.zhihu.com/column/uform' }, 122 | ], 123 | }, 124 | { 125 | title: '[email protected]', 126 | path: 'https://v1.formilyjs.org', 127 | }, 128 | { 129 | title: 'GITHUB', 130 | path: 'https://github.com/alibaba/formily', 131 | }, 132 | ], 133 | 'zh-CN': [ 134 | { 135 | title: '指南', 136 | path: '/zh-CN/guide', 137 | }, 138 | { 139 | title: '基础核心库', 140 | children: [ 141 | { 142 | title: '@formily/reactive', 143 | path: 'https://reactive.formilyjs.org/zh-CN', 144 | }, 145 | { 146 | title: '@formily/core', 147 | path: 'https://core.formilyjs.org/zh-CN', 148 | }, 149 | { 150 | title: '@formily/react', 151 | path: 'https://react.formilyjs.org/zh-CN', 152 | }, 153 | { 154 | title: '@formily/vue', 155 | path: 'https://vue.formilyjs.org', 156 | }, 157 | ], 158 | }, 159 | { 160 | title: '组件生态', 161 | children: [ 162 | { 163 | title: '@formily/antd', 164 | path: 'https://antd.formilyjs.org/zh-CN', 165 | }, 166 | { 167 | title: '@formily/antd-v5', 168 | path: 'https://antd5.formilyjs.org/zh-CN', 169 | }, 170 | { 171 | title: '@formily/antd-mobile', 172 | path: 'https://antd-mobile.formilyjs.org/zh-CN', 173 | }, 174 | { 175 | title: '@formily/next', 176 | path: 'https://fusion.formilyjs.org/zh-CN', 177 | }, 178 | { 179 | title: '@formily/element', 180 | path: 'https://element.formilyjs.org', 181 | }, 182 | { 183 | title: '@formily/element-plus', 184 | path: 'https://element-plus.formilyjs.org', 185 | }, 186 | { 187 | title: '@formily/antdv', 188 | path: 'https://antdv.formilyjs.org', 189 | }, 190 | { 191 | title: '@formily/vant', 192 | path: 'https://vant.formilyjs.org', 193 | }, 194 | { 195 | title: '@formily/semi', 196 | path: 'https://semi.formilyjs.org', 197 | }, 198 | { 199 | title: '@formily/tdesign-react', 200 | path: 'https://tdesign-react.formilyjs.org', 201 | }, 202 | { 203 | title: 'aliyun teamix', 204 | path: 'https://formily.dg.aliyun-inc.com', 205 | }, 206 | { 207 | title: 'antd-formily-boost', 208 | path: 'https://github.com/fishedee/antd-formily-boost', 209 | }, 210 | ], 211 | }, 212 | { 213 | title: '工具', 214 | children: [ 215 | { 216 | title: 'Formily 设计器', 217 | path: 'https://designable-antd.formilyjs.org/', 218 | }, 219 | { 220 | title: '通用搭建引擎', 221 | path: 'https://github.com/alibaba/designable', 222 | }, 223 | { 224 | title: 'Chrome扩展', 225 | path: 'https://chrome.google.com/webstore/detail/formily-devtools/kkocalmbfnplecdmbadaapgapdioecfm?hl=zh-CN', 226 | }, 227 | ], 228 | }, 229 | { 230 | title: '社区', 231 | children: [ 232 | { 233 | title: '论坛', 234 | path: 'https://github.com/alibaba/formily/discussions', 235 | }, 236 | { title: '知乎专栏', path: 'https://www.zhihu.com/column/uform' }, 237 | ], 238 | }, 239 | { 240 | title: '1.x文档', 241 | path: 'https://v1.formilyjs.org', 242 | }, 243 | { 244 | title: 'GITHUB', 245 | path: 'https://github.com/alibaba/formily', 246 | }, 247 | ], 248 | }, 249 | headScripts: [ 250 | ` 251 | function loadAd(){ 252 | var header = document.querySelector('.__dumi-default-layout-content .markdown h1') 253 | if(header && !header.querySelector('#_carbonads_js')){ 254 | var script = document.createElement('script') 255 | script.src = '//cdn.carbonads.com/carbon.js?serve=CEAICK3M&placement=formilyjsorg' 256 | script.id = '_carbonads_js' 257 | script.classList.add('head-ad') 258 | header.appendChild(script) 259 | } 260 | } 261 | var request = null 262 | var observer = new MutationObserver(function(){ 263 | cancelIdleCallback(request) 264 | request = requestIdleCallback(loadAd) 265 | }) 266 | document.addEventListener('DOMContentLoaded',function(){ 267 | loadAd() 268 | observer.observe( 269 | document.body, 270 | { 271 | childList:true, 272 | subtree:true 273 | } 274 | ) 275 | }) 276 | `, 277 | ], 278 | links: [ 279 | { 280 | rel: 'stylesheet', 281 | href: 'https://esm.sh/[email protected]/dist/antd.css', 282 | }, 283 | ], 284 | styles: [ 285 | `.__dumi-default-navbar-logo{ 286 | height: 60px !important; 287 | width: 150px !important; 288 | padding-left:0 !important; 289 | color: transparent !important; 290 | } 291 | .__dumi-default-navbar{ 292 | padding: 0 28px !important; 293 | } 294 | .__dumi-default-layout-hero{ 295 | background-image: url(//img.alicdn.com/imgextra/i4/O1CN01ZcvS4e26XMsdsCkf9_!!6000000007671-2-tps-6001-4001.png); 296 | background-size: cover; 297 | background-repeat: no-repeat; 298 | padding: 120px 0 !important; 299 | } 300 | .__dumi-default-layout-hero h1{ 301 | color:#45124e !important; 302 | font-size:80px !important; 303 | padding-bottom: 30px !important; 304 | } 305 | .__dumi-default-dark-switch { 306 | display:none 307 | } 308 | nav a{ 309 | text-decoration: none !important; 310 | } 311 | #carbonads * { 312 | margin: initial; 313 | padding: initial; 314 | } 315 | #carbonads { 316 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 317 | Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, 318 | sans-serif; 319 | } 320 | #carbonads { 321 | display: flex; 322 | max-width: 330px; 323 | background-color: hsl(0, 0%, 98%); 324 | box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.1); 325 | z-index: 100; 326 | float:right; 327 | } 328 | #carbonads a { 329 | color: inherit; 330 | text-decoration: none; 331 | } 332 | #carbonads a:hover { 333 | color: inherit; 334 | } 335 | #carbonads span { 336 | position: relative; 337 | display: block; 338 | overflow: hidden; 339 | } 340 | #carbonads .carbon-wrap { 341 | display: flex; 342 | } 343 | #carbonads .carbon-img { 344 | display: block; 345 | margin: 0; 346 | line-height: 1; 347 | } 348 | #carbonads .carbon-img img { 349 | display: block; 350 | } 351 | #carbonads .carbon-text { 352 | font-size: 13px; 353 | padding: 10px; 354 | margin-bottom: 16px; 355 | line-height: 1.5; 356 | text-align: left; 357 | } 358 | #carbonads .carbon-poweredby { 359 | display: block; 360 | padding: 6px 8px; 361 | background: #f1f1f2; 362 | text-align: center; 363 | text-transform: uppercase; 364 | letter-spacing: 0.5px; 365 | font-weight: 600; 366 | font-size: 8px; 367 | line-height: 1; 368 | border-top-left-radius: 3px; 369 | position: absolute; 370 | bottom: 0; 371 | right: 0; 372 | } 373 | `, 374 | ], 375 | menus: { 376 | '/guide': [ 377 | { 378 | title: 'Introduction', 379 | path: '/guide', 380 | }, 381 | { 382 | title: 'How to learn Formily', 383 | path: '/guide/learn-formily', 384 | }, 385 | { 386 | title: 'Quick start', 387 | path: '/guide/quick-start', 388 | }, 389 | { 390 | title: 'V2 Upgrade Guide', 391 | path: '/guide/upgrade', 392 | }, 393 | { 394 | title: 'Contribution Guide', 395 | path: '/guide/contribution', 396 | }, 397 | { 398 | title: 'Form Builder Guide', 399 | path: '/guide/form-builder', 400 | }, 401 | { 402 | title: 'Issue Helper', 403 | path: '/guide/issue-helper', 404 | }, 405 | { 406 | title: 'Scenes', 407 | children: [ 408 | { 409 | title: 'Login&Signup', 410 | path: '/guide/scenes/login-register', 411 | }, 412 | { 413 | title: 'Query List', 414 | path: '/guide/scenes/query-list', 415 | }, 416 | { 417 | title: 'Edit&Details', 418 | path: '/guide/scenes/edit-detail', 419 | }, 420 | { 421 | title: 'Dialog&Drawer', 422 | path: '/guide/scenes/dialog-drawer', 423 | }, 424 | { 425 | title: 'Step Form', 426 | path: '/guide/scenes/step-form', 427 | }, 428 | { 429 | title: 'Tab Form', 430 | path: '/guide/scenes/tab-form', 431 | }, 432 | { 433 | title: 'More Scenes', 434 | path: '/guide/scenes/more', 435 | }, 436 | ], 437 | }, 438 | { 439 | title: 'Advanced Guide', 440 | children: [ 441 | { 442 | title: 'Form Validation', 443 | path: '/guide/advanced/validate', 444 | }, 445 | { 446 | title: 'Form Layout', 447 | path: '/guide/advanced/layout', 448 | }, 449 | { 450 | title: 'Asynchronous Data Sources', 451 | path: '/guide/advanced/async', 452 | }, 453 | { 454 | title: 'Form Controlled', 455 | path: '/guide/advanced/controlled', 456 | }, 457 | { 458 | title: 'Linkage Logic', 459 | path: '/guide/advanced/linkages', 460 | }, 461 | { 462 | title: 'Calculator', 463 | path: '/guide/advanced/calculator', 464 | }, 465 | { 466 | title: 'Custom Components', 467 | path: '/guide/advanced/custom', 468 | }, 469 | { 470 | title: 'Front-end and back-end data compatibility solution', 471 | path: '/guide/advanced/destructor', 472 | }, 473 | { 474 | title: 'Manage Business Logic', 475 | path: '/guide/advanced/business-logic', 476 | }, 477 | { 478 | title: 'Pack on demand', 479 | path: '/guide/advanced/build', 480 | }, 481 | ], 482 | }, 483 | ], 484 | 485 | '/zh-CN/guide': [ 486 | { 487 | title: '介绍', 488 | path: '/zh-CN/guide', 489 | }, 490 | { 491 | title: '如何学习Formily', 492 | path: '/zh-CN/guide/learn-formily', 493 | }, 494 | { 495 | title: '快速开始', 496 | path: '/zh-CN/guide/quick-start', 497 | }, 498 | { 499 | title: 'V2升级指南', 500 | path: '/zh-CN/guide/upgrade', 501 | }, 502 | { 503 | title: '贡献指南', 504 | path: '/zh-CN/guide/contribution', 505 | }, 506 | { 507 | title: '表单设计器开发指南', 508 | path: '/zh-CN/guide/form-builder', 509 | }, 510 | { 511 | title: '问题反馈', 512 | path: '/zh-CN/guide/issue-helper', 513 | }, 514 | { 515 | title: '场景案例', 516 | children: [ 517 | { 518 | title: '登录注册', 519 | path: '/zh-CN/guide/scenes/login-register', 520 | }, 521 | { 522 | title: '查询列表', 523 | path: '/zh-CN/guide/scenes/query-list', 524 | }, 525 | { 526 | title: '编辑详情', 527 | path: '/zh-CN/guide/scenes/edit-detail', 528 | }, 529 | { 530 | title: '弹窗与抽屉', 531 | path: '/zh-CN/guide/scenes/dialog-drawer', 532 | }, 533 | { 534 | title: '分步表单', 535 | path: '/zh-CN/guide/scenes/step-form', 536 | }, 537 | { 538 | title: '选项卡/手风琴表单', 539 | path: '/zh-CN/guide/scenes/tab-form', 540 | }, 541 | { 542 | title: '更多场景', 543 | path: '/zh-CN/guide/scenes/more', 544 | }, 545 | ], 546 | }, 547 | { 548 | title: '进阶指南', 549 | children: [ 550 | { 551 | title: '实现表单校验', 552 | path: '/zh-CN/guide/advanced/validate', 553 | }, 554 | { 555 | title: '实现表单布局', 556 | path: '/zh-CN/guide/advanced/layout', 557 | }, 558 | { 559 | title: '实现异步数据源', 560 | path: '/zh-CN/guide/advanced/async', 561 | }, 562 | { 563 | title: '实现表单受控', 564 | path: '/zh-CN/guide/advanced/controlled', 565 | }, 566 | { 567 | title: '实现联动逻辑', 568 | path: '/zh-CN/guide/advanced/linkages', 569 | }, 570 | { 571 | title: '实现联动计算器', 572 | path: '/zh-CN/guide/advanced/calculator', 573 | }, 574 | { 575 | title: '实现自定义组件', 576 | path: '/zh-CN/guide/advanced/custom', 577 | }, 578 | { 579 | title: '前后端数据差异兼容方案', 580 | path: '/zh-CN/guide/advanced/destructor', 581 | }, 582 | { 583 | title: '管理业务逻辑', 584 | path: '/zh-CN/guide/advanced/business-logic', 585 | }, 586 | { 587 | title: '按需打包', 588 | path: '/zh-CN/guide/advanced/build', 589 | }, 590 | ], 591 | }, 592 | ], 593 | }, 594 | } 595 | ``` -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/core 2 | ``` -------------------------------------------------------------------------------- /packages/grid/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/grid 2 | ``` -------------------------------------------------------------------------------- /packages/react/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/react 2 | ``` -------------------------------------------------------------------------------- /packages/benchmark/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/benchmark 2 | ``` -------------------------------------------------------------------------------- /packages/json-schema/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/json-schema 2 | ``` -------------------------------------------------------------------------------- /packages/reactive-vue/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/reactive-vue 2 | ``` -------------------------------------------------------------------------------- /packages/path/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/path 2 | 3 | > Path System 4 | ``` -------------------------------------------------------------------------------- /packages/reactive-test-cases-for-react18/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/reactive-test-cases-for-react18 2 | ``` -------------------------------------------------------------------------------- /packages/reactive/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/reactive 2 | 3 | > Web Reactive Library Like Mobx 4 | 5 | ## QuikStart 6 | ``` -------------------------------------------------------------------------------- /packages/antd/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/antd 2 | 3 | ### Install 4 | 5 | ```bash 6 | npm install --save @formily/antd 7 | ``` 8 | ``` -------------------------------------------------------------------------------- /packages/next/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/next 2 | 3 | ### Install 4 | 5 | ```bash 6 | npm install --save @formily/next 7 | ``` 8 | ``` -------------------------------------------------------------------------------- /packages/vue/README.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Usage 2 | 3 | ### Requirement 4 | 5 | vue^2.6.0 + @vue/composition-api^1.0.0-beta.1 6 | 7 | Or 8 | 9 | vue>=3.0.0-rc.0 10 | ``` -------------------------------------------------------------------------------- /packages/element/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/element 2 | 3 | ### Requirement 4 | 5 | vue^2.6.0 + @vue/composition-api^1.0.0-beta.1 6 | 7 | ### Install 8 | 9 | ```bash 10 | npm install --save @formily/element 11 | ``` 12 | ``` -------------------------------------------------------------------------------- /packages/reactive-react/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # @formily/reactive-react 2 | 3 | ## QuikStart 4 | 5 | ```tsx 6 | import React from 'react' 7 | import { observable } from '@formily/reactive' 8 | import { observer } from '@formily/reactive-react' 9 | 10 | const obs = observable({ 11 | count: 0, 12 | }) 13 | 14 | export default observer(() => { 15 | return ( 16 | <div> 17 | {obs.count} 18 | <button 19 | onClick={() => { 20 | obs.count++ 21 | }} 22 | > 23 | Click 24 | </button> 25 | </div> 26 | ) 27 | }) 28 | ``` 29 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown 1 | English | [简体中文](./README.zh-cn.md) 2 | 3 | <p align="center"> 4 | <img src="https://img.alicdn.com/tfs/TB1fHhZu4D1gK0jSZFyXXciOVXa-2500-1200.png"> 5 | <img src="https://img.shields.io/npm/dt/@formily/core"/> 6 | <img src="https://img.shields.io/npm/dm/@formily/core"/> 7 | <a href="https://www.npmjs.com/package/@formily/core"><img src="https://img.shields.io/npm/v/@formily/core.svg"></a> 8 | <a href="https://codecov.io/gh/alibaba/formily"> 9 | <img src="https://codecov.io/gh/alibaba/formily/branch/formily_next/graph/badge.svg?token=3V9RU8Wh9d"/> 10 | </a> 11 | <img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg"/> 12 | <a href="https://github.com/actions-cool/issues-helper"> 13 | <img src="https://img.shields.io/badge/using-issues--helper-blueviolet"/> 14 | </a> 15 | <a href="https://app.netlify.com/sites/formily/deploys"><img src="https://api.netlify.com/api/v1/badges/7145918b-9cb5-47f8-8a42-111969e232ef/deploy-status"/></a> 16 | </p> 17 | 18 | --- 19 | 20 | ## Background 21 | 22 | In React, the whole tree rendering performance problem of the form is very obvious in the controlled mode. Especially for the scene of data linkage, it is easy to cause the page to be stuck. To solve this problem, we have distributed the management of the state of each form field, which significantly improves the performance of the form operations. At the same time, we deeply integrate the JSON Schema protocol to help you solve the problem of back-end driven form rendering quickly. 23 | 24 | ## Features 25 | 26 | - 🖼 Designable, You can quickly develop forms at low cost through [Form Builder](https://designable-antd.formilyjs.org/). 27 | - 🚀 High performance, fields managed independently, rather rerender the whole tree. 28 | - 💡 Integrated Alibaba Fusion and Ant Design components are guaranteed to work out of the box. 29 | - 🎨 JSON Schema applied for BackEnd. JSchema applied for FrontEnd. Two paradigms can be converted to each other. 30 | - 🏅 Side effects are managed independently, making form data linkages easier than ever before. 31 | - 🌯 Override most complicated form layout use cases. 32 | 33 | ## Form Builder 34 | 35 |  36 | 37 | ## WebSite 38 | 39 | 2.0 40 | 41 | https://formilyjs.org 42 | 43 | 1.0 44 | 45 | https://v1.formilyjs.org 46 | 47 | ## Community 48 | 49 | - [formilyjs](https://github.com/formilyjs) 50 | - [designable](https://github.com/alibaba/designable) 51 | - [icejs](https://github.com/alibaba/ice) 52 | 53 | ## How to contribute? 54 | 55 | - [Contribute document](https://formilyjs.org/zh-CN/guide/contribution) 56 | 57 | ## Contributors 58 | 59 | This project exists thanks to all the people who contribute. 60 | <a href="https://github.com/alibaba/formily/graphs/contributors"><img src="https://contrib.rocks/image?repo=alibaba/formily" /></a> 61 | 62 | ## LICENSE 63 | 64 | Formily is open source software licensed as 65 | [MIT](https://github.com/alibaba/formily/blob/master/LICENSE.md). 66 | ``` -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /packages/antd/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /packages/core/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /packages/react/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /packages/shared/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /packages/validator/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -------------------------------------------------------------------------------- /devtools/chrome-extension/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/benchmark/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/grid/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/json-schema/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/path/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/reactive-react/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/reactive-test-cases-for-react18/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/reactive-vue/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ``` -------------------------------------------------------------------------------- /packages/reactive/LICENSE.md: -------------------------------------------------------------------------------- ```markdown 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-present, Alibaba Group Holding Limited. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | ```