rimecms 0.28.10 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/adapter-sqlite/area.server.js +8 -8
- package/dist/adapter-sqlite/generate-schema/column.server.d.ts +13 -0
- package/dist/adapter-sqlite/generate-schema/column.server.js +77 -0
- package/dist/adapter-sqlite/generate-schema/index.server.js +7 -12
- package/dist/adapter-sqlite/generate-schema/root.server.js +35 -39
- package/dist/adapter-sqlite/generate-schema/templates.server.d.ts +12 -0
- package/dist/adapter-sqlite/generate-schema/templates.server.js +19 -0
- package/dist/adapter-sqlite/generate-schema/{util.d.ts → util.server.d.ts} +2 -2
- package/dist/adapter-sqlite/generate-schema/{util.js → util.server.js} +2 -2
- package/dist/adapter-sqlite/generate-schema/write.server.js +1 -1
- package/dist/adapter-sqlite/relations.server.js +6 -1
- package/dist/adapter-sqlite/transform.server.js +1 -1
- package/dist/adapter-sqlite/util.server.d.ts +1 -6
- package/dist/adapter-sqlite/util.server.js +6 -0
- package/dist/adapter-sqlite/where.server.js +17 -16
- package/dist/adapter-sqlite/with.server.js +10 -10
- package/dist/core/areas/{api → rest}/get.server.d.ts +4 -2
- package/dist/core/areas/rest/get.server.js +45 -0
- package/dist/core/areas/rest/index.server.d.ts +6 -0
- package/dist/core/areas/rest/index.server.js +3 -0
- package/dist/core/areas/{api → rest}/update.server.d.ts +4 -2
- package/dist/core/areas/rest/update.server.js +43 -0
- package/dist/core/collections/auth/fields.d.ts +2 -182
- package/dist/core/collections/auth/hooks/before-upsert/augment-fields-password.server.d.ts +1 -1
- package/dist/core/collections/config/augment-auth.server.js +1 -1
- package/dist/core/collections/config/augment-nested.server.js +1 -1
- package/dist/core/collections/config/augment-panel.d.ts +1 -1
- package/dist/core/collections/config/augment-upload.js +2 -2
- package/dist/core/collections/config/augment-upload.server.js +4 -1
- package/dist/core/collections/operations/duplicate.js +31 -12
- package/dist/core/collections/operations/updateById.js +6 -5
- package/dist/core/collections/{api → rest}/create.server.d.ts +4 -2
- package/dist/core/collections/rest/create.server.js +37 -0
- package/dist/core/collections/{api → rest}/delete.server.d.ts +4 -2
- package/dist/core/collections/rest/delete.server.js +37 -0
- package/dist/core/collections/{api → rest}/deleteById.server.d.ts +4 -2
- package/dist/core/collections/rest/deleteById.server.js +21 -0
- package/dist/core/collections/{api → rest}/duplicate.server.d.ts +1 -1
- package/dist/core/collections/rest/duplicate.server.js +20 -0
- package/dist/core/collections/{api → rest}/get.server.d.ts +4 -2
- package/dist/core/collections/rest/get.server.js +50 -0
- package/dist/core/collections/{api → rest}/getById.server.d.ts +4 -2
- package/dist/core/collections/rest/getById.server.js +35 -0
- package/dist/core/collections/rest/index.server.d.ts +16 -0
- package/dist/core/collections/rest/index.server.js +16 -0
- package/dist/core/collections/{api → rest}/updateById.server.d.ts +4 -2
- package/dist/core/collections/rest/updateById.server.js +44 -0
- package/dist/core/collections/upload/disk/delete.server.d.ts +1 -1
- package/dist/core/collections/upload/disk/delete.server.js +48 -1
- package/dist/core/collections/upload/hooks/clean-up-files.server.js +2 -2
- package/dist/core/collections/upload/hooks/convert-base64.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/extract-path.server.d.ts +2 -2
- package/dist/core/collections/upload/hooks/extract-path.server.js +1 -1
- package/dist/core/collections/upload/hooks/handle-path-creation.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/process-file-upload.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/process-file-upload.server.js +3 -3
- package/dist/core/config/auth/better-auth.server.d.ts +2 -2
- package/dist/core/config/client/augment-directories.js +1 -1
- package/dist/core/config/config-context.server.d.ts +3 -3
- package/dist/core/config/server/augment-directories.server.js +1 -1
- package/dist/core/config/server/augment-panel-access.server.d.ts +1 -1
- package/dist/core/config/server/build-config.server.d.ts +11 -11
- package/dist/core/config/server/validate.server.js +51 -31
- package/dist/core/config/shared/find-thumbnail.js +13 -13
- package/dist/core/config/shared/find-title.js +13 -13
- package/dist/core/config/shared/upload-directories.js +1 -1
- package/dist/core/constant.d.ts +1 -1
- package/dist/core/constant.js +1 -1
- package/dist/core/constant.server.d.ts +1 -0
- package/dist/core/constant.server.js +2 -0
- package/dist/core/dev/cache/index.server.js +9 -9
- package/dist/core/dev/cli/build/index.d.ts +1 -0
- package/dist/core/dev/cli/build/index.js +37 -8
- package/dist/core/dev/cli/build/templates.d.ts +1 -0
- package/dist/core/dev/cli/build/templates.js +24 -0
- package/dist/core/dev/cli/clear/index.server.js +3 -2
- package/dist/core/dev/cli/generate/index.server.js +3 -2
- package/dist/core/dev/cli/index.js +20 -0
- package/dist/core/dev/cli/init/index.server.js +4 -4
- package/dist/core/dev/cli/init/templates.d.ts +1 -1
- package/dist/core/dev/cli/init/templates.js +2 -2
- package/dist/core/dev/cli/util/log.server.d.ts +1 -0
- package/dist/core/dev/cli/util/log.server.js +4 -0
- package/dist/core/dev/cli/util/package-manager.server.d.ts +9 -0
- package/dist/core/dev/cli/{init/package-manager-util.server.js → util/package-manager.server.js} +15 -0
- package/dist/core/dev/cli/util/package.server.d.ts +9 -0
- package/dist/core/dev/cli/{init/get-package-info.server.js → util/package.server.js} +10 -0
- package/dist/core/dev/generate/routes/common.server.d.ts +10 -1
- package/dist/core/dev/generate/routes/common.server.js +248 -29
- package/dist/core/dev/generate/routes/index.server.d.ts +7 -1
- package/dist/core/dev/generate/routes/index.server.js +16 -55
- package/dist/core/dev/generate/routes/util.server.d.ts +6 -16
- package/dist/core/dev/generate/routes/util.server.js +8 -21
- package/dist/core/dev/generate/types/index.server.js +22 -20
- package/dist/core/dev/vite/index.server.js +22 -6
- package/dist/core/errors/handler.server.d.ts +22 -1
- package/dist/core/errors/handler.server.js +25 -2
- package/dist/core/errors/index.d.ts +0 -1
- package/dist/core/errors/index.js +0 -1
- package/dist/core/fields/builders/boolean-builder.d.ts +3 -1
- package/dist/core/fields/builders/boolean-builder.js +3 -0
- package/dist/core/fields/builders/field-builder.d.ts +35 -2
- package/dist/core/fields/builders/field-builder.js +33 -2
- package/dist/core/fields/builders/form-field-builder.d.ts +71 -12
- package/dist/core/fields/builders/form-field-builder.js +96 -6
- package/dist/core/fields/builders/select-builder.d.ts +4 -1
- package/dist/core/fields/builders/select-builder.js +3 -0
- package/dist/core/fields/util.d.ts +9 -17
- package/dist/core/fields/util.js +49 -83
- package/dist/core/handlers/routes.server.d.ts +70 -1
- package/dist/core/handlers/routes.server.js +71 -4
- package/dist/core/naming.d.ts +34 -0
- package/dist/core/naming.js +39 -0
- package/dist/core/operations/blocks/diff.server.js +1 -1
- package/dist/core/operations/blocks/extract.server.js +1 -1
- package/dist/core/operations/configMap/buildTreeMap.d.ts +3 -2
- package/dist/core/operations/configMap/buildTreeMap.js +1 -1
- package/dist/core/operations/configMap/index.d.ts +2 -1
- package/dist/core/operations/configMap/index.js +13 -13
- package/dist/core/operations/configMap/types.d.ts +2 -2
- package/dist/core/operations/hooks/before-read/process-document-fields.server.js +14 -17
- package/dist/core/operations/hooks/before-upsert/data-config-map.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/data-config-map.server.js +1 -1
- package/dist/core/operations/hooks/before-upsert/handle-new-version.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/original-config-map.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/original-config-map.server.js +1 -1
- package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +3 -5
- package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +10 -15
- package/dist/core/operations/hooks/before-upsert/validate-fields.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +49 -31
- package/dist/core/operations/relations/extract.server.js +5 -5
- package/dist/core/operations/shared/fallback-data-from-original.js +2 -2
- package/dist/core/operations/tree/diff.server.js +1 -1
- package/dist/core/operations/tree/extract.server.js +1 -1
- package/dist/core/plugins/api-init/index.server.js +10 -5
- package/dist/core/plugins/cache/cache.server.js +4 -4
- package/dist/core/rime.server.d.ts +10 -10
- package/dist/core/rime.server.js +5 -1
- package/dist/fields/blocks/component/AddBlockButton.svelte +7 -7
- package/dist/fields/blocks/component/AddBlockButton.svelte.d.ts +2 -2
- package/dist/fields/blocks/component/Blocks.svelte +6 -7
- package/dist/fields/blocks/component/props.d.ts +2 -2
- package/dist/fields/blocks/index.d.ts +1 -1
- package/dist/fields/blocks/index.js +3 -3
- package/dist/fields/blocks/index.server.js +1 -1
- package/dist/fields/checkbox/component/Checkbox.svelte +2 -2
- package/dist/fields/checkbox/component/props.d.ts +2 -2
- package/dist/fields/checkbox/index.server.d.ts +1 -2
- package/dist/fields/checkbox/index.server.js +1 -10
- package/dist/fields/combobox/component/ComboBox.svelte +3 -3
- package/dist/fields/combobox/component/props.d.ts +2 -2
- package/dist/fields/combobox/index.server.d.ts +1 -2
- package/dist/fields/combobox/index.server.js +2 -11
- package/dist/fields/component/index.d.ts +1 -1
- package/dist/fields/date/component/Date.svelte +4 -4
- package/dist/fields/date/component/Date.svelte.d.ts +2 -2
- package/dist/fields/date/index.d.ts +3 -1
- package/dist/fields/date/index.js +3 -0
- package/dist/fields/date/index.server.d.ts +1 -2
- package/dist/fields/date/index.server.js +1 -10
- package/dist/fields/email/component/Email.svelte +5 -6
- package/dist/fields/email/component/props.d.ts +2 -3
- package/dist/fields/email/index.d.ts +3 -2
- package/dist/fields/email/index.js +5 -2
- package/dist/fields/email/index.server.d.ts +0 -3
- package/dist/fields/email/index.server.js +0 -9
- package/dist/fields/group/component/Group.svelte +9 -15
- package/dist/fields/group/component/Group.svelte.d.ts +2 -2
- package/dist/fields/group/index.d.ts +4 -2
- package/dist/fields/group/index.server.js +2 -2
- package/dist/fields/index.server.d.ts +1 -4
- package/dist/fields/index.server.js +17 -13
- package/dist/fields/link/component/Link.svelte +5 -5
- package/dist/fields/link/component/RessourceInput.svelte +1 -1
- package/dist/fields/link/component/props.d.ts +2 -2
- package/dist/fields/link/index.d.ts +5 -2
- package/dist/fields/link/index.js +10 -11
- package/dist/fields/link/runtime.d.ts +2 -0
- package/dist/fields/link/runtime.js +1 -0
- package/dist/fields/link/{index.server.d.ts → runtime.server.d.ts} +1 -2
- package/dist/fields/link/{index.server.js → runtime.server.js} +2 -11
- package/dist/fields/number/component/Number.svelte +6 -6
- package/dist/fields/number/component/props.d.ts +2 -2
- package/dist/fields/number/index.d.ts +4 -10
- package/dist/fields/number/index.js +3 -4
- package/dist/fields/number/index.server.d.ts +1 -2
- package/dist/fields/number/index.server.js +1 -10
- package/dist/fields/radio/component/Radio.svelte +6 -7
- package/dist/fields/radio/component/props.d.ts +2 -2
- package/dist/fields/radio/index.server.d.ts +1 -2
- package/dist/fields/radio/index.server.js +2 -11
- package/dist/fields/relation/client.d.ts +1 -1
- package/dist/fields/relation/client.js +1 -1
- package/dist/fields/relation/component/Cell.svelte +1 -1
- package/dist/fields/relation/component/Relation.svelte +19 -15
- package/dist/fields/relation/component/Relation.svelte.d.ts +2 -2
- package/dist/fields/relation/component/upload/Browse.svelte +1 -1
- package/dist/fields/relation/index.d.ts +8 -5
- package/dist/fields/relation/index.js +8 -47
- package/dist/fields/relation/runtime.d.ts +5 -0
- package/dist/fields/relation/runtime.js +4 -0
- package/dist/fields/relation/runtime.server.d.ts +8 -0
- package/dist/fields/relation/runtime.server.js +49 -0
- package/dist/fields/rich-text/component/RichText.svelte +5 -5
- package/dist/fields/rich-text/component/props.d.ts +2 -2
- package/dist/fields/rich-text/core/features/fields/extension.d.ts +2 -2
- package/dist/fields/rich-text/core/features/fields/fields.svelte +2 -2
- package/dist/fields/rich-text/core/features/link/component/link-selector.svelte +1 -1
- package/dist/fields/rich-text/core/features/resource/resource-extension.d.ts +1 -1
- package/dist/fields/rich-text/core/features/resource/resource.svelte +1 -1
- package/dist/fields/rich-text/core/features/upload/upload-extension.d.ts +1 -1
- package/dist/fields/rich-text/core/features/upload/upload.svelte +1 -1
- package/dist/fields/rich-text/index.d.ts +2 -0
- package/dist/fields/rich-text/index.js +7 -2
- package/dist/fields/rich-text/index.server.d.ts +1 -2
- package/dist/fields/rich-text/index.server.js +1 -10
- package/dist/fields/select/component/Select.svelte +16 -16
- package/dist/fields/select/component/props.d.ts +2 -2
- package/dist/fields/select/index.d.ts +2 -0
- package/dist/fields/select/index.js +3 -0
- package/dist/fields/select/index.server.d.ts +1 -2
- package/dist/fields/select/index.server.js +2 -17
- package/dist/fields/slug/component/Slug.svelte +14 -10
- package/dist/fields/slug/component/Slug.svelte.d.ts +2 -2
- package/dist/fields/slug/index.d.ts +5 -2
- package/dist/fields/slug/index.js +3 -0
- package/dist/fields/slug/index.server.d.ts +1 -2
- package/dist/fields/slug/index.server.js +1 -10
- package/dist/fields/tabs/component/Tabs.svelte +15 -15
- package/dist/fields/tabs/component/Tabs.svelte.d.ts +2 -2
- package/dist/fields/tabs/index.d.ts +4 -16
- package/dist/fields/tabs/index.js +1 -8
- package/dist/fields/tabs/index.server.js +3 -3
- package/dist/fields/text/component/Text.svelte +5 -5
- package/dist/fields/text/component/props.d.ts +2 -3
- package/dist/fields/text/index.d.ts +4 -10
- package/dist/fields/text/index.js +3 -4
- package/dist/fields/text/index.server.d.ts +1 -2
- package/dist/fields/text/index.server.js +1 -10
- package/dist/fields/textarea/component/TextArea.svelte +3 -3
- package/dist/fields/textarea/component/props.d.ts +2 -2
- package/dist/fields/textarea/index.d.ts +4 -1
- package/dist/fields/textarea/index.js +3 -0
- package/dist/fields/textarea/index.server.d.ts +1 -2
- package/dist/fields/textarea/index.server.js +1 -10
- package/dist/fields/time/component/Time.svelte +5 -5
- package/dist/fields/time/component/Time.svelte.d.ts +1 -1
- package/dist/fields/time/component/props.d.ts +2 -2
- package/dist/fields/time/index.d.ts +2 -0
- package/dist/fields/time/index.js +3 -0
- package/dist/fields/time/index.server.d.ts +1 -2
- package/dist/fields/time/index.server.js +1 -10
- package/dist/fields/toggle/component/Toggle.svelte +3 -3
- package/dist/fields/toggle/component/Toggle.svelte.d.ts +1 -1
- package/dist/fields/toggle/component/props.d.ts +2 -2
- package/dist/fields/toggle/index.d.ts +2 -1
- package/dist/fields/toggle/index.server.d.ts +1 -2
- package/dist/fields/toggle/index.server.js +1 -10
- package/dist/fields/tree/component/AddItemButton.svelte +1 -2
- package/dist/fields/tree/component/Tree.svelte +6 -6
- package/dist/fields/tree/component/TreeBlock.svelte +5 -12
- package/dist/fields/tree/component/props.d.ts +3 -3
- package/dist/fields/tree/index.d.ts +3 -1
- package/dist/fields/tree/index.js +2 -2
- package/dist/fields/types.d.ts +11 -5
- package/dist/index.d.ts +8 -3
- package/dist/index.js +7 -3
- package/dist/panel/components/fields/FieldsPreview.svelte +4 -5
- package/dist/panel/components/fields/Hint.svelte +5 -4
- package/dist/panel/components/fields/Hint.svelte.d.ts +3 -2
- package/dist/panel/components/fields/Label.svelte +6 -11
- package/dist/panel/components/fields/Label.svelte.d.ts +3 -2
- package/dist/panel/components/fields/LabelFor.svelte +4 -4
- package/dist/panel/components/fields/LabelFor.svelte.d.ts +2 -1
- package/dist/panel/components/fields/RenderFields.svelte +11 -16
- package/dist/panel/components/fields/{root.svelte.d.ts → fieldset.svelte.d.ts} +1 -1
- package/dist/panel/components/fields/{root.svelte.js → fieldset.svelte.js} +1 -1
- package/dist/panel/components/fields/index.d.ts +5 -5
- package/dist/panel/components/fields/index.js +2 -2
- package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
- package/dist/panel/components/sections/document/AuthFooter.svelte +2 -7
- package/dist/panel/components/sections/document/ButtonStatus.svelte +1 -1
- package/dist/panel/components/sections/document/CurrentlyEdited.svelte +1 -1
- package/dist/panel/components/sections/document/Settings.svelte +1 -1
- package/dist/panel/components/sections/live/LiveEditPanel.svelte +2 -2
- package/dist/panel/context/collection.svelte.js +10 -10
- package/dist/panel/context/documentForm.svelte.d.ts +8 -21
- package/dist/panel/context/documentForm.svelte.js +46 -54
- package/dist/panel/context/form.svelte.d.ts +6 -3
- package/dist/panel/context/form.svelte.js +22 -18
- package/dist/panel/context/live.svelte.js +1 -1
- package/dist/panel/index.d.ts +9 -1
- package/dist/panel/index.js +7 -1
- package/dist/panel/pages/area/actions.server.d.ts +2 -21
- package/dist/panel/pages/area/actions.server.js +28 -27
- package/dist/panel/pages/area/load.server.d.ts +2 -17
- package/dist/panel/pages/area/load.server.js +37 -46
- package/dist/panel/pages/auth/fields.d.ts +4 -4
- package/dist/panel/pages/auth/fields.js +6 -22
- package/dist/panel/pages/auth/reset-password/ResetPassword.svelte +3 -10
- package/dist/panel/pages/auth/sign-in/SignIn.svelte +7 -1
- package/dist/panel/pages/collection/load.server.d.ts +6 -6
- package/dist/panel/pages/collection/load.server.js +70 -72
- package/dist/panel/pages/collection-document/actions.server.d.ts +1 -1
- package/dist/panel/pages/collection-document/actions.server.js +78 -70
- package/dist/panel/pages/collection-document/load.server.d.ts +5 -20
- package/dist/panel/pages/collection-document/load.server.js +80 -82
- package/dist/server.d.ts +7 -0
- package/dist/server.js +7 -0
- package/dist/types.d.ts +1 -0
- package/dist/util/doc.js +15 -17
- package/dist/util/index.d.ts +9 -1
- package/dist/util/index.js +12 -1
- package/package.json +8 -50
- package/dist/core/api/index.d.ts +0 -7
- package/dist/core/api/index.js +0 -10
- package/dist/core/api/index.server.d.ts +0 -3
- package/dist/core/api/index.server.js +0 -3
- package/dist/core/areas/api/get.server.js +0 -36
- package/dist/core/areas/api/index.server.d.ts +0 -7
- package/dist/core/areas/api/index.server.js +0 -4
- package/dist/core/areas/api/update.server.js +0 -33
- package/dist/core/collections/api/create.server.js +0 -29
- package/dist/core/collections/api/delete.server.js +0 -32
- package/dist/core/collections/api/deleteById.server.js +0 -16
- package/dist/core/collections/api/duplicate.server.js +0 -18
- package/dist/core/collections/api/get.server.js +0 -45
- package/dist/core/collections/api/getById.server.js +0 -30
- package/dist/core/collections/api/index.server.d.ts +0 -17
- package/dist/core/collections/api/index.server.js +0 -9
- package/dist/core/collections/api/updateById.server.js +0 -38
- package/dist/core/dev/cli/init/get-package-info.server.d.ts +0 -1
- package/dist/core/dev/cli/init/package-manager-util.server.d.ts +0 -3
- package/dist/core/dev/generate/routes/area.server.d.ts +0 -7
- package/dist/core/dev/generate/routes/area.server.js +0 -69
- package/dist/core/dev/generate/routes/collection.server.d.ts +0 -14
- package/dist/core/dev/generate/routes/collection.server.js +0 -129
- package/dist/fields/relation/index.server.d.ts +0 -4
- package/dist/fields/relation/index.server.js +0 -13
- package/dist/live.d.ts +0 -4
- package/dist/live.js +0 -4
- package/dist/panel/index.server.d.ts +0 -4
- package/dist/panel/index.server.js +0 -4
- package/dist/panel/pages/auth/index.d.ts +0 -4
- package/dist/panel/pages/auth/index.js +0 -4
- package/dist/panel/pages/auth/index.server.d.ts +0 -18
- package/dist/panel/pages/auth/index.server.js +0 -12
- package/dist/panel/pages/index.actions.server.d.ts +0 -13
- package/dist/panel/pages/index.actions.server.js +0 -10
- package/dist/panel/pages/index.load.server.d.ts +0 -23
- package/dist/panel/pages/index.load.server.js +0 -16
- package/dist/panel/ui.d.ts +0 -4
- package/dist/panel/ui.js +0 -5
- /package/dist/core/dev/cli/{util.server.d.ts → util/prompt.server.d.ts} +0 -0
- /package/dist/core/dev/cli/{util.server.js → util/prompt.server.js} +0 -0
|
@@ -146,7 +146,7 @@ export async function generateTypesString(config) {
|
|
|
146
146
|
const treeBlocksTypes = [];
|
|
147
147
|
const registeredBlocks = [];
|
|
148
148
|
const registeredTreeBlocks = [];
|
|
149
|
-
let imports = new Set(['BaseDoc', 'Navigation', 'User']);
|
|
149
|
+
let imports = new Set(['BaseDoc', 'Navigation', 'RouteHandlers', 'User']);
|
|
150
150
|
const addImport = (string) => {
|
|
151
151
|
imports = new Set([...imports, string]);
|
|
152
152
|
};
|
|
@@ -171,50 +171,50 @@ export async function generateTypesString(config) {
|
|
|
171
171
|
for (const field of fields) {
|
|
172
172
|
if (field instanceof BlocksBuilder) {
|
|
173
173
|
{
|
|
174
|
-
for (const block of field.
|
|
175
|
-
if (!registeredBlocks.includes(block.
|
|
176
|
-
const templates = await buildFieldsTypes(block.
|
|
174
|
+
for (const block of field.get.blocks) {
|
|
175
|
+
if (!registeredBlocks.includes(block.name)) {
|
|
176
|
+
const templates = await buildFieldsTypes(block.get.fields
|
|
177
177
|
.filter((field) => field instanceof FormFieldBuilder)
|
|
178
178
|
.filter((field) => field.name !== 'type'));
|
|
179
|
-
blocksTypes.push(makeBlockType(block.
|
|
180
|
-
registeredBlocks.push(block.
|
|
181
|
-
buildblocksTypes(block.
|
|
179
|
+
blocksTypes.push(makeBlockType(block.name, templates.join('\n\t')));
|
|
180
|
+
registeredBlocks.push(block.name);
|
|
181
|
+
buildblocksTypes(block.get.fields);
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
186
|
else if (field instanceof TabsBuilder) {
|
|
187
|
-
for (const tab of field.
|
|
188
|
-
await buildblocksTypes(tab.
|
|
187
|
+
for (const tab of field.get.tabs) {
|
|
188
|
+
await buildblocksTypes(tab.get.fields);
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
else if (field instanceof GroupFieldBuilder) {
|
|
192
|
-
await buildblocksTypes(field.
|
|
192
|
+
await buildblocksTypes(field.get.fields);
|
|
193
193
|
}
|
|
194
194
|
else if (field instanceof TreeBuilder) {
|
|
195
|
-
await buildblocksTypes(field.
|
|
195
|
+
await buildblocksTypes(field.get.fields);
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
198
|
};
|
|
199
199
|
const buildTreeBlockTypes = async (fields) => {
|
|
200
200
|
for (const field of fields) {
|
|
201
201
|
if (field instanceof BlocksBuilder) {
|
|
202
|
-
for (const block of field.
|
|
203
|
-
await buildTreeBlockTypes(block.
|
|
202
|
+
for (const block of field.get.blocks) {
|
|
203
|
+
await buildTreeBlockTypes(block.get.fields);
|
|
204
204
|
}
|
|
205
205
|
}
|
|
206
206
|
else if (field instanceof TabsBuilder) {
|
|
207
|
-
for (const tab of field.
|
|
208
|
-
await buildTreeBlockTypes(tab.
|
|
207
|
+
for (const tab of field.get.tabs) {
|
|
208
|
+
await buildTreeBlockTypes(tab.get.fields);
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
else if (field instanceof GroupFieldBuilder) {
|
|
212
|
-
await buildTreeBlockTypes(field.
|
|
212
|
+
await buildTreeBlockTypes(field.get.fields);
|
|
213
213
|
}
|
|
214
214
|
else if (field instanceof TreeBuilder) {
|
|
215
215
|
const treeBlockTypeName = `Tree${toPascalCase(field.name)}`;
|
|
216
216
|
if (!registeredTreeBlocks.includes(treeBlockTypeName)) {
|
|
217
|
-
const treeFieldsTypes = await buildFieldsTypes(field.
|
|
217
|
+
const treeFieldsTypes = await buildFieldsTypes(field.get.fields.filter((field) => field instanceof FormFieldBuilder));
|
|
218
218
|
const treeBlockType = makeTreeBlockType(treeBlockTypeName, treeFieldsTypes.join('\n'));
|
|
219
219
|
treeBlocksTypes.push(treeBlockType);
|
|
220
220
|
registeredTreeBlocks.push(treeBlockTypeName);
|
|
@@ -227,7 +227,7 @@ export async function generateTypesString(config) {
|
|
|
227
227
|
if (isUploadConfig(collection) && collection.upload.imageSizes?.length) {
|
|
228
228
|
fields = collection.fields
|
|
229
229
|
.filter((f) => f instanceof FormFieldBuilder)
|
|
230
|
-
.filter((field) => !collection.upload.imageSizes.some((size) => size.name === field.
|
|
230
|
+
.filter((field) => !collection.upload.imageSizes.some((size) => size.name === field.name));
|
|
231
231
|
}
|
|
232
232
|
const fieldsTypesList = await buildFieldsTypes(fields);
|
|
233
233
|
if (collection.versions) {
|
|
@@ -297,8 +297,10 @@ export async function generateTypesString(config) {
|
|
|
297
297
|
>;
|
|
298
298
|
/** Flag enabled by the core plugin rime.cache when the API cache is ON */
|
|
299
299
|
cacheEnabled: boolean;
|
|
300
|
-
/** Available in panel, routes for sidebar */
|
|
301
|
-
|
|
300
|
+
/** Available in panel, nav routes for sidebar */
|
|
301
|
+
navigation: Navigation;
|
|
302
|
+
/** Dispatch facade backing the fixed /panel/[slug]/... and /api/[slug]/... routes */
|
|
303
|
+
routes: RouteHandlers;
|
|
302
304
|
/**
|
|
303
305
|
* Current locale if applicable
|
|
304
306
|
* set following this prioroty :
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import dotenv from 'dotenv';
|
|
2
2
|
import { existsSync, rmSync } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import { RIME_DEV_CACHE_DIR } from '../../constant.server.js';
|
|
4
5
|
import { ensureHasInit } from '../../ensure.server.js';
|
|
5
6
|
import { logger } from '../../logger/index.server.js';
|
|
6
7
|
import { INPUT_DIR, OUTPUT_DIR } from '../constants.js';
|
|
@@ -10,6 +11,13 @@ const dev = process.env.NODE_ENV === 'development';
|
|
|
10
11
|
export function rime() {
|
|
11
12
|
const VCoreId = '$rime/config';
|
|
12
13
|
const VSchemaId = '$rime/schema';
|
|
14
|
+
/** General-purpose server/browser split, usable anywhere in the app (not just rime's own
|
|
15
|
+
* field code — see relation/index.ts for the first user). `import { x } from '$rime/runtime'`
|
|
16
|
+
* resolves to a sibling `server.ts` (server builds) or `browser.ts` (browser builds) next
|
|
17
|
+
* to whichever file does the importing — the importer's path travels encoded in the
|
|
18
|
+
* resolved id since `load()` only receives the id, not the importer. */
|
|
19
|
+
const VRuntimeId = '$rime/runtime';
|
|
20
|
+
const VRuntimeMarker = `\0${VRuntimeId}::`;
|
|
13
21
|
const resolvedVModule = (name) => '\0' + name;
|
|
14
22
|
return {
|
|
15
23
|
name: 'virtual-rime',
|
|
@@ -19,10 +27,9 @@ export function rime() {
|
|
|
19
27
|
dev && ensureHasInit();
|
|
20
28
|
// Check if we need to rebuild
|
|
21
29
|
const shouldRebuild = process.argv.includes('--rebuild');
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
logger.info('--rebuild : .rime folder deleted');
|
|
30
|
+
if (shouldRebuild && existsSync(RIME_DEV_CACHE_DIR)) {
|
|
31
|
+
rmSync(RIME_DEV_CACHE_DIR, { recursive: true, force: true });
|
|
32
|
+
logger.info('--rebuild : node_modules/.rime folder deleted');
|
|
26
33
|
}
|
|
27
34
|
});
|
|
28
35
|
// Add a watcher for sanitizing config changes
|
|
@@ -86,19 +93,22 @@ export function rime() {
|
|
|
86
93
|
return [module];
|
|
87
94
|
}
|
|
88
95
|
},
|
|
89
|
-
resolveId(id) {
|
|
96
|
+
resolveId(id, importer) {
|
|
90
97
|
if (id === VCoreId) {
|
|
91
98
|
return resolvedVModule(id);
|
|
92
99
|
}
|
|
93
100
|
if (id === VSchemaId) {
|
|
94
101
|
return resolvedVModule(id);
|
|
95
102
|
}
|
|
103
|
+
if (id === VRuntimeId && importer) {
|
|
104
|
+
return `${VRuntimeMarker}${importer}`;
|
|
105
|
+
}
|
|
96
106
|
return null;
|
|
97
107
|
},
|
|
98
108
|
load(id) {
|
|
99
109
|
const isServer = this.environment?.config?.consumer === 'server';
|
|
100
110
|
if (id === resolvedVModule(VCoreId)) {
|
|
101
|
-
const corePath = isServer ? 'rimecms/config/server' : 'rimecms/config
|
|
111
|
+
const corePath = isServer ? 'rimecms/config/server' : 'rimecms/config';
|
|
102
112
|
return `export * from '${corePath}';`;
|
|
103
113
|
}
|
|
104
114
|
if (id === resolvedVModule(VSchemaId) && isServer) {
|
|
@@ -108,6 +118,12 @@ export function rime() {
|
|
|
108
118
|
return `export * from '${modulePath}'; export { default } from '${modulePath}';`;
|
|
109
119
|
}
|
|
110
120
|
}
|
|
121
|
+
if (id.startsWith(VRuntimeMarker)) {
|
|
122
|
+
const importer = id.slice(VRuntimeMarker.length);
|
|
123
|
+
const dir = path.dirname(importer);
|
|
124
|
+
const target = path.join(dir, isServer ? 'runtime.server.ts' : 'runtime.ts');
|
|
125
|
+
return `export * from '${target.replace(/\.ts$/, '.js')}';`;
|
|
126
|
+
}
|
|
111
127
|
return null;
|
|
112
128
|
}
|
|
113
129
|
};
|
|
@@ -2,13 +2,34 @@ export declare const ERROR_CONTEXT: {
|
|
|
2
2
|
readonly ACTION: "action";
|
|
3
3
|
readonly API: "api";
|
|
4
4
|
readonly LOAD: "load";
|
|
5
|
-
readonly HANDLER: "handler";
|
|
6
5
|
};
|
|
7
6
|
export type ErrorContext = (typeof ERROR_CONTEXT)[keyof typeof ERROR_CONTEXT];
|
|
8
7
|
type ErrorHandlerOptions = {
|
|
9
8
|
context: ErrorContext;
|
|
10
9
|
formData?: Record<string, any>;
|
|
11
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Only called at the route boundary: +server.ts handlers, load functions,
|
|
13
|
+
* form actions. Everywhere else, just `throw new RimeError(...)` (centralizes
|
|
14
|
+
* error codes/messages) — it bubbles up and gets caught here, where `context`
|
|
15
|
+
* tells this function which SvelteKit primitive to translate it into:
|
|
16
|
+
* `error()` (api/load), `redirect()`, or `fail()` (action form errors).
|
|
17
|
+
*
|
|
18
|
+
* Always call it as `return handleError(...)`. Most branches throw internally
|
|
19
|
+
* (`error`/`redirect`), so `return` never runs — but the `fail()` branch (form
|
|
20
|
+
* errors in actions) is a real return value, so `return` is required there.
|
|
21
|
+
*
|
|
22
|
+
* @example +server.ts endpoint
|
|
23
|
+
* if (!id) return handleError(new RimeError(RimeError.NOT_FOUND), { context: ERROR_CONTEXT.API });
|
|
24
|
+
*
|
|
25
|
+
* @example load function
|
|
26
|
+
* const [err, doc] = await trycatch(() => getDoc(id));
|
|
27
|
+
* if (err) return handleError(err, { context: ERROR_CONTEXT.LOAD });
|
|
28
|
+
*
|
|
29
|
+
* @example form action
|
|
30
|
+
* const [err] = await trycatch(() => save(data));
|
|
31
|
+
* if (err) return handleError(err, { context: ERROR_CONTEXT.ACTION, formData: data });
|
|
32
|
+
*/
|
|
12
33
|
export declare function handleError(err: Error, options: ErrorHandlerOptions): import("@sveltejs/kit").ActionFailure<{
|
|
13
34
|
form: Record<string, any>;
|
|
14
35
|
errors: import("../../types.js").FormErrors;
|
|
@@ -6,9 +6,30 @@ import { RimeError, RimeFormError } from './index.js';
|
|
|
6
6
|
export const ERROR_CONTEXT = {
|
|
7
7
|
ACTION: 'action',
|
|
8
8
|
API: 'api',
|
|
9
|
-
LOAD: 'load'
|
|
10
|
-
HANDLER: 'handler'
|
|
9
|
+
LOAD: 'load'
|
|
11
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Only called at the route boundary: +server.ts handlers, load functions,
|
|
13
|
+
* form actions. Everywhere else, just `throw new RimeError(...)` (centralizes
|
|
14
|
+
* error codes/messages) — it bubbles up and gets caught here, where `context`
|
|
15
|
+
* tells this function which SvelteKit primitive to translate it into:
|
|
16
|
+
* `error()` (api/load), `redirect()`, or `fail()` (action form errors).
|
|
17
|
+
*
|
|
18
|
+
* Always call it as `return handleError(...)`. Most branches throw internally
|
|
19
|
+
* (`error`/`redirect`), so `return` never runs — but the `fail()` branch (form
|
|
20
|
+
* errors in actions) is a real return value, so `return` is required there.
|
|
21
|
+
*
|
|
22
|
+
* @example +server.ts endpoint
|
|
23
|
+
* if (!id) return handleError(new RimeError(RimeError.NOT_FOUND), { context: ERROR_CONTEXT.API });
|
|
24
|
+
*
|
|
25
|
+
* @example load function
|
|
26
|
+
* const [err, doc] = await trycatch(() => getDoc(id));
|
|
27
|
+
* if (err) return handleError(err, { context: ERROR_CONTEXT.LOAD });
|
|
28
|
+
*
|
|
29
|
+
* @example form action
|
|
30
|
+
* const [err] = await trycatch(() => save(data));
|
|
31
|
+
* if (err) return handleError(err, { context: ERROR_CONTEXT.ACTION, formData: data });
|
|
32
|
+
*/
|
|
12
33
|
export function handleError(err, options) {
|
|
13
34
|
const { context, formData } = options;
|
|
14
35
|
/****************************************************/
|
|
@@ -17,6 +38,8 @@ export function handleError(err, options) {
|
|
|
17
38
|
if (err instanceof RimeFormError) {
|
|
18
39
|
switch (context) {
|
|
19
40
|
case ERROR_CONTEXT.ACTION:
|
|
41
|
+
// fail() returns an ActionFailure — lets SvelteKit re-render the form
|
|
42
|
+
// with `errors`/`form` instead of navigating to the error boundary.
|
|
20
43
|
return fail(400, {
|
|
21
44
|
form: formData || {},
|
|
22
45
|
errors: err.errors
|
|
@@ -20,7 +20,6 @@ declare class RimeError extends Error {
|
|
|
20
20
|
constructor(code: string, message?: string, ...args: any);
|
|
21
21
|
}
|
|
22
22
|
declare class RimeFormError extends RimeError {
|
|
23
|
-
static INVALID_DATA: string;
|
|
24
23
|
static INVALID_EMAIL: string;
|
|
25
24
|
static INVALID_FIELD: string;
|
|
26
25
|
static INVALID_PHONE: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DefaultValueFn, FieldValidationFunc, FormField } from '../../../fields/types.js';
|
|
2
|
+
import type { DataType } from './form-field-builder.js';
|
|
2
3
|
import { FormFieldBuilder } from './form-field-builder.js';
|
|
3
4
|
type BooleanField = FormField & {
|
|
4
5
|
type: any;
|
|
@@ -6,9 +7,10 @@ type BooleanField = FormField & {
|
|
|
6
7
|
defaultValue?: boolean | DefaultValueFn<boolean>;
|
|
7
8
|
validate?: FieldValidationFunc<BooleanField>;
|
|
8
9
|
};
|
|
9
|
-
export declare class BooleanFieldBuilder<T extends BooleanField> extends FormFieldBuilder<T> {
|
|
10
|
+
export declare class BooleanFieldBuilder<T extends BooleanField = BooleanField> extends FormFieldBuilder<T> {
|
|
10
11
|
constructor(name: string, type: string);
|
|
11
12
|
defaultValue(value: boolean | DefaultValueFn<boolean>): this;
|
|
13
|
+
get dataType(): DataType;
|
|
12
14
|
compile(): import("../../../util/types.js").WithoutBuilders<T> & {
|
|
13
15
|
component: import("svelte").Component<any>;
|
|
14
16
|
cell?: import("svelte").Component<{
|
|
@@ -8,6 +8,9 @@ export class BooleanFieldBuilder extends FormFieldBuilder {
|
|
|
8
8
|
this.field.defaultValue = value;
|
|
9
9
|
return this;
|
|
10
10
|
}
|
|
11
|
+
get dataType() {
|
|
12
|
+
return 'boolean';
|
|
13
|
+
}
|
|
11
14
|
compile() {
|
|
12
15
|
if (!this.field.validate) {
|
|
13
16
|
this.field.validate = (value) => typeof value === 'boolean' || 'Should be true/false';
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import type { WithoutBuilders } from '../../../util/types.js';
|
|
2
2
|
import type { Component } from 'svelte';
|
|
3
|
-
import type { Field } from '../../../fields/types.js';
|
|
3
|
+
import type { Field, FieldAccess } from '../../../fields/types.js';
|
|
4
|
+
/** Method-syntax (not `foo: () => ...` property syntax) so subtype checks
|
|
5
|
+
* like `FormFieldBuilder<SlugField> -> FormFieldBuilder<FormField>` — used
|
|
6
|
+
* all over the panel, where a concrete field builder flows into a
|
|
7
|
+
* generically-typed prop — stay bivariant on their params, exactly like the
|
|
8
|
+
* class methods this replaced. Property syntax would make TS check those
|
|
9
|
+
* params strictly/contravariantly and break that assignability. */
|
|
10
|
+
export type FieldRun = {
|
|
11
|
+
canRead(...args: Parameters<FieldAccess>): boolean;
|
|
12
|
+
canCreate(...args: Parameters<FieldAccess>): boolean;
|
|
13
|
+
canUpdate(...args: Parameters<FieldAccess>): boolean;
|
|
14
|
+
};
|
|
4
15
|
export declare class FieldBuilder<T extends Field = Field> {
|
|
5
16
|
field: T;
|
|
6
17
|
_metaUrl?: string;
|
|
7
18
|
constructor(type: string);
|
|
19
|
+
get name(): string;
|
|
8
20
|
className(str: string): this;
|
|
9
21
|
compile(): WithoutBuilders<T> & {
|
|
10
22
|
component: Component<any>;
|
|
@@ -14,7 +26,28 @@ export declare class FieldBuilder<T extends Field = Field> {
|
|
|
14
26
|
};
|
|
15
27
|
live(bool: boolean): this;
|
|
16
28
|
get type(): string;
|
|
17
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Raw field data, plus the couple of properties that a bare `this.field`
|
|
31
|
+
* read can't give you: `localized`/`root` default to `false` here since
|
|
32
|
+
* only FormFieldBuilder fields ever set them — container fields like Tabs
|
|
33
|
+
* answer `false` rather than making every caller check
|
|
34
|
+
* `instanceof FormFieldBuilder` first just to ask this one question.
|
|
35
|
+
* Everything else on `T` (Tabs' `tabs`, Blocks' `blocks`, ...) comes
|
|
36
|
+
* through unchanged via the spread — no per-subclass override needed.
|
|
37
|
+
*/
|
|
38
|
+
get get(): T & {
|
|
39
|
+
localized: boolean;
|
|
40
|
+
root: boolean;
|
|
41
|
+
};
|
|
42
|
+
/** Behavior the builder runs on your behalf (invoking a stored function) —
|
|
43
|
+
* see `.get` for plain data reads. Fields without an access concept
|
|
44
|
+
* (Tabs) default every check to allowed, matching how the field-less case
|
|
45
|
+
* already behaved. Params are unused here but must match FormFieldBuilder's
|
|
46
|
+
* override signature — TS checks generic-constraint satisfaction
|
|
47
|
+
* (`T extends FieldBuilder<any>`) strictly, not with the bivariant
|
|
48
|
+
* leniency normal overrides get, so a param-less base signature breaks
|
|
49
|
+
* assignability everywhere. */
|
|
50
|
+
get run(): FieldRun;
|
|
18
51
|
get component(): Component<any> | null;
|
|
19
52
|
get cell(): Component<{
|
|
20
53
|
value: any;
|
|
@@ -3,10 +3,14 @@ export class FieldBuilder {
|
|
|
3
3
|
_metaUrl;
|
|
4
4
|
constructor(type) {
|
|
5
5
|
this.field = {
|
|
6
|
+
name: '',
|
|
6
7
|
type,
|
|
7
8
|
live: true
|
|
8
9
|
};
|
|
9
10
|
}
|
|
11
|
+
get name() {
|
|
12
|
+
return this.field.name;
|
|
13
|
+
}
|
|
10
14
|
className(str) {
|
|
11
15
|
this.field.className = str;
|
|
12
16
|
return this;
|
|
@@ -25,8 +29,35 @@ export class FieldBuilder {
|
|
|
25
29
|
get type() {
|
|
26
30
|
return this.field.type;
|
|
27
31
|
}
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Raw field data, plus the couple of properties that a bare `this.field`
|
|
34
|
+
* read can't give you: `localized`/`root` default to `false` here since
|
|
35
|
+
* only FormFieldBuilder fields ever set them — container fields like Tabs
|
|
36
|
+
* answer `false` rather than making every caller check
|
|
37
|
+
* `instanceof FormFieldBuilder` first just to ask this one question.
|
|
38
|
+
* Everything else on `T` (Tabs' `tabs`, Blocks' `blocks`, ...) comes
|
|
39
|
+
* through unchanged via the spread — no per-subclass override needed.
|
|
40
|
+
*/
|
|
41
|
+
get get() {
|
|
42
|
+
return { ...this.field, localized: false, root: false };
|
|
43
|
+
}
|
|
44
|
+
/** Behavior the builder runs on your behalf (invoking a stored function) —
|
|
45
|
+
* see `.get` for plain data reads. Fields without an access concept
|
|
46
|
+
* (Tabs) default every check to allowed, matching how the field-less case
|
|
47
|
+
* already behaved. Params are unused here but must match FormFieldBuilder's
|
|
48
|
+
* override signature — TS checks generic-constraint satisfaction
|
|
49
|
+
* (`T extends FieldBuilder<any>`) strictly, not with the bivariant
|
|
50
|
+
* leniency normal overrides get, so a param-less base signature breaks
|
|
51
|
+
* assignability everywhere. */
|
|
52
|
+
get run() {
|
|
53
|
+
return {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
55
|
+
canRead: (..._args) => true,
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
+
canCreate: (..._args) => true,
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
59
|
+
canUpdate: (..._args) => true
|
|
60
|
+
};
|
|
30
61
|
}
|
|
31
62
|
get component() {
|
|
32
63
|
return null;
|
|
@@ -1,16 +1,54 @@
|
|
|
1
1
|
import type { FieldPanelTableConfig } from '../../../types.js';
|
|
2
2
|
import type { Dic } from '../../../util/types.js';
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
5
|
-
type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
import type { RequestEvent } from '@sveltejs/kit';
|
|
4
|
+
import type { FieldAccess, FieldHook, FieldHookClient, FieldHookContext, FieldHookShared, FieldValidationFunc, FieldWidth, FormField } from '../../../fields/types.js';
|
|
5
|
+
import { FieldBuilder, type FieldRun } from './field-builder.js';
|
|
6
|
+
/** Adapter-agnostic storage primitive — column syntax only, not default-value semantics. */
|
|
7
|
+
export type DataType = 'text' | 'boolean' | 'number' | 'timestamp' | 'json';
|
|
8
|
+
/** Method-syntax, same reasoning as `FieldRun` — keeps `run`'s params
|
|
9
|
+
* bivariant across concrete field types so e.g. `SlugFieldBuilder` still
|
|
10
|
+
* satisfies a prop typed `FormFieldBuilder<FormField>`. */
|
|
11
|
+
export type FormFieldRun<T extends FormField> = FieldRun & {
|
|
12
|
+
isEmpty(value: unknown): boolean;
|
|
13
|
+
validate(value: unknown, context: Parameters<FieldValidationFunc<T>>[1]): true | string;
|
|
14
|
+
condition(doc: Dic, siblings: Dic): boolean;
|
|
15
|
+
onChange(value: unknown, context: Parameters<FieldHookClient>[1]): void;
|
|
16
|
+
beforeRead(value: unknown, context: Omit<FieldHookContext<T>, 'config'>): Promise<any>;
|
|
17
|
+
beforeSave(value: unknown, context: FieldHookContext<T>): Promise<any>;
|
|
18
|
+
beforeValidate(value: unknown, context: Parameters<FieldHookShared>[1]): Promise<any>;
|
|
19
|
+
/** Resolves `field.defaultValue` — calling it if it's a `DefaultValueFn`,
|
|
20
|
+
* returning it as-is otherwise. Every field type stores `defaultValue` as
|
|
21
|
+
* plain data (never a fluent-setter name collision on `.field` itself),
|
|
22
|
+
* but several concrete builders (Select, Link, Slug, Relation) *do* expose
|
|
23
|
+
* a `.defaultValue(...)` fluent setter — bare `config.defaultValue` on
|
|
24
|
+
* those would silently return that setter, not the stored value. */
|
|
25
|
+
defaultValue(context?: {
|
|
26
|
+
event?: RequestEvent;
|
|
27
|
+
}): unknown;
|
|
28
|
+
};
|
|
29
|
+
export type ReferentialAction = 'cascade' | 'set null' | 'restrict' | 'no action';
|
|
30
|
+
export type FieldReferenceOptions = {
|
|
31
|
+
onDelete?: ReferentialAction;
|
|
32
|
+
onUpdate?: ReferentialAction;
|
|
33
|
+
/** Referenced table is this field's own table (self-FK); adapters need this
|
|
34
|
+
* to emit a `(): any =>` accessor and avoid a TS circular-declaration error. */
|
|
35
|
+
selfReferencing?: boolean;
|
|
36
|
+
};
|
|
37
|
+
export type FieldReference = FieldReferenceOptions & {
|
|
38
|
+
table: string;
|
|
39
|
+
};
|
|
40
|
+
export declare class FormFieldBuilder<T extends FormField = FormField> extends FieldBuilder<T> {
|
|
41
|
+
/** Every concrete leaf field builder is expected to implement a
|
|
42
|
+
* `get dataType(): DataType` accessor (see e.g. `$lib/fields/text/index.ts`).
|
|
43
|
+
* Not declared here — TS doesn't allow `declare` on accessors in this
|
|
44
|
+
* project's config, and a plain base field would conflict with subclasses
|
|
45
|
+
* that need a computed getter (e.g. `select`, whose dataType depends on
|
|
46
|
+
* `many`). Container builders (Group/Tabs/Blocks/Tree) never get asked,
|
|
47
|
+
* since the adapter's tree-walker special-cases them before reaching the
|
|
48
|
+
* generic column-rendering branch; `column.server.ts` reads `.dataType`
|
|
49
|
+
* via a narrow cast for the same reason it already casts `unique`. */
|
|
50
|
+
_references: FieldReference | null;
|
|
12
51
|
constructor(name: string, type: string);
|
|
13
|
-
get name(): string;
|
|
14
52
|
label(label: string): this;
|
|
15
53
|
hidden(): this;
|
|
16
54
|
localized(): this;
|
|
@@ -19,17 +57,38 @@ export declare class FormFieldBuilder<T extends FormField> extends FieldBuilder<
|
|
|
19
57
|
table(params?: FieldPanelTableConfig | number): this;
|
|
20
58
|
width(value: FieldWidth): this;
|
|
21
59
|
required(bool?: boolean): this;
|
|
60
|
+
/**
|
|
61
|
+
* Force the field to be on the root table — usefull for fields that
|
|
62
|
+
* should not be versioned (ex: _parent for nested structures should
|
|
63
|
+
* always be on the root table to prevent different versions from having
|
|
64
|
+
* different parents).
|
|
65
|
+
*/
|
|
66
|
+
_root(): this;
|
|
67
|
+
/** `label`/`localized`/`root`/`required` are the only properties that need
|
|
68
|
+
* anything beyond a plain `this.field` read (a fallback default, or a
|
|
69
|
+
* boolean coercion) — everything else a concrete field type adds
|
|
70
|
+
* (Group's `fields`, Relation's `relationTo`, Select's `options`, ...)
|
|
71
|
+
* comes through unchanged via the spread, no per-subclass override needed. */
|
|
72
|
+
get get(): T & {
|
|
73
|
+
localized: boolean;
|
|
74
|
+
root: boolean;
|
|
75
|
+
label: string;
|
|
76
|
+
required: boolean;
|
|
77
|
+
};
|
|
22
78
|
access(access: {
|
|
23
79
|
create?: FieldAccess;
|
|
24
80
|
read?: FieldAccess;
|
|
25
81
|
update?: FieldAccess;
|
|
26
82
|
}): this;
|
|
27
83
|
onChange(hook: FieldHookClient): this;
|
|
84
|
+
/** Behavior the builder runs on your behalf — invoking a stored function or
|
|
85
|
+
* hook list, not a data read (see `.get` for that). */
|
|
86
|
+
get run(): FormFieldRun<T>;
|
|
28
87
|
hint(hint: string): this;
|
|
29
88
|
clone(): typeof this;
|
|
30
|
-
$
|
|
89
|
+
/** Server-side schema concern, same family as $beforeRead/$beforeSave. */
|
|
90
|
+
$references(table: string, options?: FieldReferenceOptions): this;
|
|
31
91
|
$beforeRead(hook: FieldHook<T>): this;
|
|
32
92
|
$beforeSave(hook: FieldHook<T>): this;
|
|
33
93
|
beforeValidate(hook: FieldHookShared): this;
|
|
34
94
|
}
|
|
35
|
-
export {};
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
import { capitalize } from '../../../util/string.js';
|
|
1
2
|
import cloneDeep from 'clone-deep';
|
|
2
3
|
import { FieldBuilder } from './field-builder.js';
|
|
3
4
|
export class FormFieldBuilder extends FieldBuilder {
|
|
4
|
-
|
|
5
|
+
/** Every concrete leaf field builder is expected to implement a
|
|
6
|
+
* `get dataType(): DataType` accessor (see e.g. `$lib/fields/text/index.ts`).
|
|
7
|
+
* Not declared here — TS doesn't allow `declare` on accessors in this
|
|
8
|
+
* project's config, and a plain base field would conflict with subclasses
|
|
9
|
+
* that need a computed getter (e.g. `select`, whose dataType depends on
|
|
10
|
+
* `many`). Container builders (Group/Tabs/Blocks/Tree) never get asked,
|
|
11
|
+
* since the adapter's tree-walker special-cases them before reaching the
|
|
12
|
+
* generic column-rendering branch; `column.server.ts` reads `.dataType`
|
|
13
|
+
* via a narrow cast for the same reason it already casts `unique`. */
|
|
14
|
+
_references = null;
|
|
5
15
|
constructor(name, type) {
|
|
6
16
|
super(type);
|
|
7
17
|
this.field.name = name;
|
|
@@ -15,9 +25,6 @@ export class FormFieldBuilder extends FieldBuilder {
|
|
|
15
25
|
};
|
|
16
26
|
return this;
|
|
17
27
|
}
|
|
18
|
-
get name() {
|
|
19
|
-
return this.field.name;
|
|
20
|
-
}
|
|
21
28
|
label(label) {
|
|
22
29
|
this.field.label = label;
|
|
23
30
|
return this;
|
|
@@ -58,6 +65,30 @@ export class FormFieldBuilder extends FieldBuilder {
|
|
|
58
65
|
this.field.required = typeof bool === 'undefined' ? true : bool;
|
|
59
66
|
return this;
|
|
60
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Force the field to be on the root table — usefull for fields that
|
|
70
|
+
* should not be versioned (ex: _parent for nested structures should
|
|
71
|
+
* always be on the root table to prevent different versions from having
|
|
72
|
+
* different parents).
|
|
73
|
+
*/
|
|
74
|
+
_root() {
|
|
75
|
+
this.field._root = true;
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
/** `label`/`localized`/`root`/`required` are the only properties that need
|
|
79
|
+
* anything beyond a plain `this.field` read (a fallback default, or a
|
|
80
|
+
* boolean coercion) — everything else a concrete field type adds
|
|
81
|
+
* (Group's `fields`, Relation's `relationTo`, Select's `options`, ...)
|
|
82
|
+
* comes through unchanged via the spread, no per-subclass override needed. */
|
|
83
|
+
get get() {
|
|
84
|
+
return {
|
|
85
|
+
...this.field,
|
|
86
|
+
localized: !!this.field.localized,
|
|
87
|
+
root: !!this.field._root,
|
|
88
|
+
label: this.field.label || capitalize(this.field.name),
|
|
89
|
+
required: !!this.field.required
|
|
90
|
+
};
|
|
91
|
+
}
|
|
61
92
|
access(access) {
|
|
62
93
|
this.field.access = { ...this.field.access, ...access };
|
|
63
94
|
return this;
|
|
@@ -67,6 +98,64 @@ export class FormFieldBuilder extends FieldBuilder {
|
|
|
67
98
|
this.field.hooks.onChange.push(hook);
|
|
68
99
|
return this;
|
|
69
100
|
}
|
|
101
|
+
/** Behavior the builder runs on your behalf — invoking a stored function or
|
|
102
|
+
* hook list, not a data read (see `.get` for that). */
|
|
103
|
+
get run() {
|
|
104
|
+
return {
|
|
105
|
+
isEmpty: (value) => this.field.isEmpty(value),
|
|
106
|
+
validate: (value, context) => {
|
|
107
|
+
if (this.field.validate) {
|
|
108
|
+
return this.field.validate(value, { ...context, config: this.field });
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
},
|
|
112
|
+
condition: (doc, siblings) => {
|
|
113
|
+
if (this.field.condition) {
|
|
114
|
+
try {
|
|
115
|
+
return this.field.condition(doc, siblings);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error(err.message);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
canRead: (...args) => !!this.field.access?.read?.(...args),
|
|
125
|
+
canCreate: (...args) => !!this.field.access?.create?.(...args),
|
|
126
|
+
canUpdate: (...args) => !!this.field.access?.update?.(...args),
|
|
127
|
+
onChange: (value, context) => {
|
|
128
|
+
for (const hook of this.field.hooks?.onChange ?? []) {
|
|
129
|
+
hook(value, context);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
beforeRead: async (value, context) => {
|
|
133
|
+
let result = value;
|
|
134
|
+
for (const hook of this.field.hooks?.beforeRead ?? []) {
|
|
135
|
+
result = await hook(result, { ...context, config: this.field });
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
},
|
|
139
|
+
beforeSave: async (value, context) => {
|
|
140
|
+
let result = value;
|
|
141
|
+
for (const hook of this.field.hooks?.beforeSave ?? []) {
|
|
142
|
+
result = await hook(result, { ...context, config: this.field });
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
},
|
|
146
|
+
beforeValidate: async (value, context) => {
|
|
147
|
+
let result = value;
|
|
148
|
+
for (const hook of this.field.hooks?.beforeValidate ?? []) {
|
|
149
|
+
result = await hook(result, { ...context, config: this.field });
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
},
|
|
153
|
+
defaultValue: (context = {}) => {
|
|
154
|
+
const value = this.field.defaultValue;
|
|
155
|
+
return typeof value === 'function' ? value(context) : value;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
70
159
|
hint(hint) {
|
|
71
160
|
this.field.hint = hint;
|
|
72
161
|
return this;
|
|
@@ -83,8 +172,9 @@ export class FormFieldBuilder extends FieldBuilder {
|
|
|
83
172
|
clone.field = cloneDeep(this.field);
|
|
84
173
|
return clone;
|
|
85
174
|
}
|
|
86
|
-
$
|
|
87
|
-
|
|
175
|
+
/** Server-side schema concern, same family as $beforeRead/$beforeSave. */
|
|
176
|
+
$references(table, options) {
|
|
177
|
+
this._references = { table, ...options };
|
|
88
178
|
return this;
|
|
89
179
|
}
|
|
90
180
|
$beforeRead(hook) {
|