rimecms 0.29.0 → 0.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/index.server.d.ts +1 -2
- package/dist/adapter-sqlite/index.server.js +0 -2
- package/dist/adapter-sqlite/relations.server.js +6 -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 +9 -9
- package/dist/core/collections/auth/fields.d.ts +2 -182
- 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-upload.js +2 -2
- package/dist/core/collections/config/augment-upload.server.js +4 -1
- package/dist/core/collections/operations/duplicate.js +30 -11
- package/dist/core/collections/operations/updateById.js +6 -5
- package/dist/core/collections/rest/duplicate.server.js +7 -3
- 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/extract-path.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/extract-path.server.js +1 -1
- package/dist/core/collections/upload/hooks/process-file-upload.server.js +3 -3
- package/dist/core/config/server/validate.server.js +50 -30
- package/dist/core/config/shared/find-thumbnail.js +12 -12
- package/dist/core/config/shared/find-title.js +13 -13
- package/dist/core/config/shared/upload-directories.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.js +2 -2
- package/dist/core/dev/cli/clear/index.server.js +2 -1
- package/dist/core/dev/cli/generate/index.server.js +3 -2
- package/dist/core/dev/cli/init/index.server.js +1 -1
- package/dist/core/dev/generate/routes/index.server.js +2 -2
- package/dist/core/dev/generate/types/index.server.js +17 -17
- package/dist/core/dev/vite/index.server.js +21 -5
- 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 +8 -16
- package/dist/core/fields/util.js +49 -83
- package/dist/core/handlers/routes.server.js +16 -3
- 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.js +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 +2 -4
- package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +10 -15
- 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/cache/cache.server.js +3 -3
- 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 +4 -1
- 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/props.d.ts +2 -2
- package/dist/fields/link/index.d.ts +4 -1
- package/dist/fields/link/index.js +9 -10
- 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/component/Relation.svelte +18 -14
- package/dist/fields/relation/component/Relation.svelte.d.ts +2 -2
- package/dist/fields/relation/index.d.ts +7 -4
- 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/fields.svelte +2 -2
- package/dist/fields/rich-text/index.d.ts +2 -0
- package/dist/fields/rich-text/index.js +3 -0
- 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/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/document/AuthFooter.svelte +2 -7
- package/dist/panel/components/sections/live/LiveEditPanel.svelte +2 -2
- package/dist/panel/context/collection.svelte.js +9 -9
- package/dist/panel/context/documentForm.svelte.d.ts +8 -21
- package/dist/panel/context/documentForm.svelte.js +45 -52
- package/dist/panel/context/form.svelte.d.ts +4 -3
- package/dist/panel/context/form.svelte.js +14 -16
- 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/util/doc.js +15 -17
- package/package.json +3 -2
- package/dist/fields/relation/index.server.d.ts +0 -4
- package/dist/fields/relation/index.server.js +0 -13
|
@@ -1,190 +1,10 @@
|
|
|
1
|
-
declare const emailField:
|
|
2
|
-
_metaUrl: string;
|
|
3
|
-
layout(layout: "compact" | "default"): /*elided*/ any;
|
|
4
|
-
readonly component: import("svelte").Component<import("../../../fields/email/component/props").EmailFieldProps, {}, "">;
|
|
5
|
-
unique(bool?: boolean): /*elided*/ any;
|
|
6
|
-
defaultValue(value: string | import("../../../types").DefaultValueFn<string>): /*elided*/ any;
|
|
7
|
-
isTitle(): /*elided*/ any;
|
|
8
|
-
_generateSchema: null | ((args: {
|
|
9
|
-
camel: string;
|
|
10
|
-
snake: string;
|
|
11
|
-
suffix: string;
|
|
12
|
-
}) => string);
|
|
13
|
-
readonly name: string;
|
|
14
|
-
label(label: string): /*elided*/ any;
|
|
15
|
-
hidden(): /*elided*/ any;
|
|
16
|
-
localized(): /*elided*/ any;
|
|
17
|
-
validate(validateFunction: import("../../../types").FieldValidationFunc<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
18
|
-
condition(conditionFunction: (doc: import("../../../util/types").Dic, siblings: import("../../../util/types").Dic) => boolean): /*elided*/ any;
|
|
19
|
-
table(params?: import("../../../types").FieldPanelTableConfig | number): /*elided*/ any;
|
|
20
|
-
width(value: import("../../../types").FieldWidth): /*elided*/ any;
|
|
21
|
-
required(bool?: boolean): /*elided*/ any;
|
|
22
|
-
access(access: {
|
|
23
|
-
create?: import("../../../types").FieldAccess;
|
|
24
|
-
read?: import("../../../types").FieldAccess;
|
|
25
|
-
update?: import("../../../types").FieldAccess;
|
|
26
|
-
}): /*elided*/ any;
|
|
27
|
-
onChange(hook: import("../../../types").FieldHookClient): /*elided*/ any;
|
|
28
|
-
hint(hint: string): /*elided*/ any;
|
|
29
|
-
clone(): /*elided*/ any;
|
|
30
|
-
$generateSchema(fn: (args: {
|
|
31
|
-
camel: string;
|
|
32
|
-
snake: string;
|
|
33
|
-
suffix: string;
|
|
34
|
-
}) => string): /*elided*/ any;
|
|
35
|
-
$beforeRead(hook: import("../../../types").FieldHook<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
36
|
-
$beforeSave(hook: import("../../../types").FieldHook<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
37
|
-
beforeValidate(hook: import("../../../types").FieldHookShared): /*elided*/ any;
|
|
38
|
-
field: import("../../../fields/email/index.js").EmailField;
|
|
39
|
-
className(str: string): /*elided*/ any;
|
|
40
|
-
compile(): {
|
|
41
|
-
type: "email";
|
|
42
|
-
live?: boolean | undefined;
|
|
43
|
-
condition?: ((doc: any, siblings: any) => boolean) | undefined;
|
|
44
|
-
width?: import("../../../types").FieldWidth | undefined;
|
|
45
|
-
className?: string | undefined;
|
|
46
|
-
component: import("svelte").Component<any>;
|
|
47
|
-
cell: import("svelte").Component<any> | undefined;
|
|
48
|
-
access: {
|
|
49
|
-
create: import("../../../types").FieldAccess;
|
|
50
|
-
read: import("../../../types").FieldAccess;
|
|
51
|
-
update: import("../../../types").FieldAccess;
|
|
52
|
-
};
|
|
53
|
-
name: string;
|
|
54
|
-
hidden?: boolean | undefined;
|
|
55
|
-
validate?: import("../../../types").FieldValidationFunc<any> | undefined;
|
|
56
|
-
required?: boolean | undefined;
|
|
57
|
-
localized?: boolean | undefined;
|
|
58
|
-
label?: string | undefined;
|
|
59
|
-
hint?: string | undefined;
|
|
60
|
-
table?: {
|
|
61
|
-
cell?: import("svelte").Component<{
|
|
62
|
-
value: any;
|
|
63
|
-
}> | undefined;
|
|
64
|
-
sort?: boolean | undefined;
|
|
65
|
-
position: number;
|
|
66
|
-
} | undefined;
|
|
67
|
-
hooks?: {
|
|
68
|
-
beforeRead?: import("../../../types").FieldHook<any>[] | undefined;
|
|
69
|
-
beforeSave?: import("../../../types").FieldHook<any>[] | undefined;
|
|
70
|
-
beforeValidate?: import("../../../types").FieldHookShared<any>[] | undefined;
|
|
71
|
-
onChange?: import("../../../types").FieldHookClient[] | undefined;
|
|
72
|
-
} | undefined;
|
|
73
|
-
defaultValue?: string | import("../../../types").DefaultValueFn<string> | undefined;
|
|
74
|
-
isEmpty: (value: unknown) => boolean;
|
|
75
|
-
placeholder?: string | undefined;
|
|
76
|
-
layout?: "compact" | "default" | undefined;
|
|
77
|
-
unique?: boolean | undefined;
|
|
78
|
-
isTitle?: true | undefined;
|
|
79
|
-
} & {
|
|
80
|
-
component: import("svelte").Component<any>;
|
|
81
|
-
cell?: import("svelte").Component<{
|
|
82
|
-
value: any;
|
|
83
|
-
}> | null;
|
|
84
|
-
};
|
|
85
|
-
live(bool: boolean): /*elided*/ any;
|
|
86
|
-
readonly type: string;
|
|
87
|
-
readonly raw: import("../../../fields/email/index.js").EmailField;
|
|
88
|
-
readonly cell: import("svelte").Component<{
|
|
89
|
-
value: any;
|
|
90
|
-
}> | null;
|
|
91
|
-
};
|
|
1
|
+
declare const emailField: import("../../../fields/email/index.js").EmailFieldBuilder;
|
|
92
2
|
declare const name: import("../../../fields/text/index.js").TextFieldBuilder;
|
|
93
3
|
declare const roles: import("../../../fields/select/index.js").SelectFieldBuilder;
|
|
94
4
|
declare const password: import("../../../fields/text/index.js").TextFieldBuilder;
|
|
95
5
|
declare const confirmPassword: import("../../../fields/text/index.js").TextFieldBuilder;
|
|
96
6
|
export declare const usersFields: {
|
|
97
|
-
email:
|
|
98
|
-
_metaUrl: string;
|
|
99
|
-
layout(layout: "compact" | "default"): /*elided*/ any;
|
|
100
|
-
readonly component: import("svelte").Component<import("../../../fields/email/component/props").EmailFieldProps, {}, "">;
|
|
101
|
-
unique(bool?: boolean): /*elided*/ any;
|
|
102
|
-
defaultValue(value: string | import("../../../types").DefaultValueFn<string>): /*elided*/ any;
|
|
103
|
-
isTitle(): /*elided*/ any;
|
|
104
|
-
_generateSchema: null | ((args: {
|
|
105
|
-
camel: string;
|
|
106
|
-
snake: string;
|
|
107
|
-
suffix: string;
|
|
108
|
-
}) => string);
|
|
109
|
-
readonly name: string;
|
|
110
|
-
label(label: string): /*elided*/ any;
|
|
111
|
-
hidden(): /*elided*/ any;
|
|
112
|
-
localized(): /*elided*/ any;
|
|
113
|
-
validate(validateFunction: import("../../../types").FieldValidationFunc<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
114
|
-
condition(conditionFunction: (doc: import("../../../util/types").Dic, siblings: import("../../../util/types").Dic) => boolean): /*elided*/ any;
|
|
115
|
-
table(params?: import("../../../types").FieldPanelTableConfig | number): /*elided*/ any;
|
|
116
|
-
width(value: import("../../../types").FieldWidth): /*elided*/ any;
|
|
117
|
-
required(bool?: boolean): /*elided*/ any;
|
|
118
|
-
access(access: {
|
|
119
|
-
create?: import("../../../types").FieldAccess;
|
|
120
|
-
read?: import("../../../types").FieldAccess;
|
|
121
|
-
update?: import("../../../types").FieldAccess;
|
|
122
|
-
}): /*elided*/ any;
|
|
123
|
-
onChange(hook: import("../../../types").FieldHookClient): /*elided*/ any;
|
|
124
|
-
hint(hint: string): /*elided*/ any;
|
|
125
|
-
clone(): /*elided*/ any;
|
|
126
|
-
$generateSchema(fn: (args: {
|
|
127
|
-
camel: string;
|
|
128
|
-
snake: string;
|
|
129
|
-
suffix: string;
|
|
130
|
-
}) => string): /*elided*/ any;
|
|
131
|
-
$beforeRead(hook: import("../../../types").FieldHook<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
132
|
-
$beforeSave(hook: import("../../../types").FieldHook<import("../../../fields/email/index.js").EmailField>): /*elided*/ any;
|
|
133
|
-
beforeValidate(hook: import("../../../types").FieldHookShared): /*elided*/ any;
|
|
134
|
-
field: import("../../../fields/email/index.js").EmailField;
|
|
135
|
-
className(str: string): /*elided*/ any;
|
|
136
|
-
compile(): {
|
|
137
|
-
type: "email";
|
|
138
|
-
live?: boolean | undefined;
|
|
139
|
-
condition?: ((doc: any, siblings: any) => boolean) | undefined;
|
|
140
|
-
width?: import("../../../types").FieldWidth | undefined;
|
|
141
|
-
className?: string | undefined;
|
|
142
|
-
component: import("svelte").Component<any>;
|
|
143
|
-
cell: import("svelte").Component<any> | undefined;
|
|
144
|
-
access: {
|
|
145
|
-
create: import("../../../types").FieldAccess;
|
|
146
|
-
read: import("../../../types").FieldAccess;
|
|
147
|
-
update: import("../../../types").FieldAccess;
|
|
148
|
-
};
|
|
149
|
-
name: string;
|
|
150
|
-
hidden?: boolean | undefined;
|
|
151
|
-
validate?: import("../../../types").FieldValidationFunc<any> | undefined;
|
|
152
|
-
required?: boolean | undefined;
|
|
153
|
-
localized?: boolean | undefined;
|
|
154
|
-
label?: string | undefined;
|
|
155
|
-
hint?: string | undefined;
|
|
156
|
-
table?: {
|
|
157
|
-
cell?: import("svelte").Component<{
|
|
158
|
-
value: any;
|
|
159
|
-
}> | undefined;
|
|
160
|
-
sort?: boolean | undefined;
|
|
161
|
-
position: number;
|
|
162
|
-
} | undefined;
|
|
163
|
-
hooks?: {
|
|
164
|
-
beforeRead?: import("../../../types").FieldHook<any>[] | undefined;
|
|
165
|
-
beforeSave?: import("../../../types").FieldHook<any>[] | undefined;
|
|
166
|
-
beforeValidate?: import("../../../types").FieldHookShared<any>[] | undefined;
|
|
167
|
-
onChange?: import("../../../types").FieldHookClient[] | undefined;
|
|
168
|
-
} | undefined;
|
|
169
|
-
defaultValue?: string | import("../../../types").DefaultValueFn<string> | undefined;
|
|
170
|
-
isEmpty: (value: unknown) => boolean;
|
|
171
|
-
placeholder?: string | undefined;
|
|
172
|
-
layout?: "compact" | "default" | undefined;
|
|
173
|
-
unique?: boolean | undefined;
|
|
174
|
-
isTitle?: true | undefined;
|
|
175
|
-
} & {
|
|
176
|
-
component: import("svelte").Component<any>;
|
|
177
|
-
cell?: import("svelte").Component<{
|
|
178
|
-
value: any;
|
|
179
|
-
}> | null;
|
|
180
|
-
};
|
|
181
|
-
live(bool: boolean): /*elided*/ any;
|
|
182
|
-
readonly type: string;
|
|
183
|
-
readonly raw: import("../../../fields/email/index.js").EmailField;
|
|
184
|
-
readonly cell: import("svelte").Component<{
|
|
185
|
-
value: any;
|
|
186
|
-
}> | null;
|
|
187
|
-
};
|
|
7
|
+
email: import("../../../fields/email/index.js").EmailFieldBuilder;
|
|
188
8
|
name: import("../../../fields/text/index.js").TextFieldBuilder;
|
|
189
9
|
roles: import("../../../fields/select/index.js").SelectFieldBuilder;
|
|
190
10
|
password: import("../../../fields/text/index.js").TextFieldBuilder;
|
|
@@ -11,7 +11,7 @@ export const augmentAuthServer = (config) => {
|
|
|
11
11
|
function addSchemaStaffReferenceForAPIKeys() {
|
|
12
12
|
(collection.fields || []).forEach((field) => {
|
|
13
13
|
if (field instanceof FormFieldBuilder && field.name === 'ownerId') {
|
|
14
|
-
field
|
|
14
|
+
field.$references('staff', { onDelete: 'cascade' });
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
return collection;
|
|
@@ -8,7 +8,7 @@ export const augmentNestedServer = (config) => {
|
|
|
8
8
|
const fields = [...(config.fields || [])];
|
|
9
9
|
if (config.nested) {
|
|
10
10
|
const _parentField = text('_parent')
|
|
11
|
-
.$
|
|
11
|
+
.$references(config.slug, { onDelete: 'set null', selfReferencing: true })
|
|
12
12
|
.hidden()
|
|
13
13
|
._root();
|
|
14
14
|
fields.push(_parentField);
|
|
@@ -46,10 +46,10 @@ export const augmentUpload = (config) => {
|
|
|
46
46
|
// Add validation if accept is defined
|
|
47
47
|
if ('accept' in upload && Array.isArray(upload.accept)) {
|
|
48
48
|
const allowedMimeTypes = upload.accept;
|
|
49
|
-
mimeType.
|
|
49
|
+
mimeType.validate((value) => {
|
|
50
50
|
return ((typeof value === 'string' && allowedMimeTypes.includes(value)) ||
|
|
51
51
|
`File should be the type of ${allowedMimeTypes.toString()}`);
|
|
52
|
-
};
|
|
52
|
+
});
|
|
53
53
|
}
|
|
54
54
|
const _pathField = text('_path')._root().hidden().validate(validatePath);
|
|
55
55
|
// Add hidden fields
|
|
@@ -9,7 +9,10 @@ export const augmentUploadServer = (config) => {
|
|
|
9
9
|
const collection = augmentUpload(config);
|
|
10
10
|
(collection.fields || []).forEach((field) => {
|
|
11
11
|
if (field instanceof FormFieldBuilder && field.name === '_path') {
|
|
12
|
-
field
|
|
12
|
+
field.$references(withDirectoriesSuffix(config.slug), {
|
|
13
|
+
onDelete: 'cascade',
|
|
14
|
+
onUpdate: 'cascade'
|
|
15
|
+
});
|
|
13
16
|
}
|
|
14
17
|
});
|
|
15
18
|
return collection;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { VERSIONS_STATUS } from '../../constant.js';
|
|
2
2
|
import { buildConfigMap } from '../../operations/configMap/index.js';
|
|
3
|
-
import {
|
|
4
|
-
import { isJSONContent } from '../../../fields/rich-text/index.js';
|
|
5
|
-
import {
|
|
6
|
-
import { isTreeFieldRaw } from '../../../fields/tree/index.js';
|
|
3
|
+
import { BlocksBuilder } from '../../../fields/blocks/index.js';
|
|
4
|
+
import { isJSONContent, richTextJSONToText } from '../../../fields/rich-text/index.js';
|
|
5
|
+
import { TreeBuilder } from '../../../fields/tree/index.js';
|
|
7
6
|
import { getValueAtPath, isObjectLiteral, matchStructure, omitId, setValueAtPath } from '../../../util/object.js';
|
|
8
7
|
// If block is localized should not keep its id so it created a new one
|
|
9
8
|
// If block is not localized than it should keep its id so block is updated
|
|
@@ -15,6 +14,13 @@ export const duplicate = async (args) => {
|
|
|
15
14
|
* on the given document
|
|
16
15
|
*/
|
|
17
16
|
function setCopyTitle(doc) {
|
|
17
|
+
// For upload collections with no real title field, asTitle falls back to
|
|
18
|
+
// 'filename' (see augmentTitle) — that's a display fallback, not a
|
|
19
|
+
// mutable title. filename must keep matching the actual file on disk
|
|
20
|
+
// (saveFile dedupes by content), so leave it alone rather than
|
|
21
|
+
// corrupting the reference with a suffix no file on disk has.
|
|
22
|
+
if (config.upload && config.asTitle === 'filename')
|
|
23
|
+
return doc;
|
|
18
24
|
const getTitle = () => {
|
|
19
25
|
const title = getValueAtPath(config.asTitle, doc);
|
|
20
26
|
return isJSONContent(title)
|
|
@@ -46,8 +52,11 @@ export const duplicate = async (args) => {
|
|
|
46
52
|
// Set locale to the default one
|
|
47
53
|
if (defaultLocale)
|
|
48
54
|
rime.setLocale(defaultLocale);
|
|
49
|
-
// Fetch document to copy
|
|
50
|
-
|
|
55
|
+
// Fetch document to copy — draft: true, since the source document may
|
|
56
|
+
// never have been published (buildPublishedOrLatestVersionParams treats a
|
|
57
|
+
// missing draft flag as "published only" for versioned-with-draft
|
|
58
|
+
// collections, which would 404 on a draft-only source).
|
|
59
|
+
const document = await collection.findById({ id, locale: defaultLocale, draft: true });
|
|
51
60
|
// Prepare data
|
|
52
61
|
const data = prepareDuplicate(document, defaultLocale, false);
|
|
53
62
|
// Create document
|
|
@@ -61,11 +70,11 @@ export const duplicate = async (args) => {
|
|
|
61
70
|
rime.setLocale(locale);
|
|
62
71
|
// Get localized document
|
|
63
72
|
let source = await collection.findById({ id, locale, draft: true });
|
|
64
|
-
const configMap = buildConfigMap(source, config.fields
|
|
73
|
+
const configMap = buildConfigMap(source, config.fields);
|
|
65
74
|
// Id mapping
|
|
66
75
|
for (const [key, field] of Object.entries(configMap)) {
|
|
67
76
|
// Process only tree and blocks
|
|
68
|
-
if (!
|
|
77
|
+
if (!(field instanceof BlocksBuilder) && !(field instanceof TreeBuilder))
|
|
69
78
|
continue;
|
|
70
79
|
const handleField = {
|
|
71
80
|
// For localized blocks just remove the id so a new one will be created
|
|
@@ -93,12 +102,22 @@ export const duplicate = async (args) => {
|
|
|
93
102
|
});
|
|
94
103
|
}
|
|
95
104
|
};
|
|
96
|
-
handleField[field.localized ? 'localized' : 'unlocalized']();
|
|
105
|
+
handleField[field.get.localized ? 'localized' : 'unlocalized']();
|
|
97
106
|
}
|
|
98
107
|
// Prepare data
|
|
99
108
|
const data = prepareDuplicate(source, locale, true);
|
|
100
|
-
// Update document for this locale
|
|
101
|
-
|
|
109
|
+
// Update document for this locale — target newDocument's own version
|
|
110
|
+
// directly (versionId, not draft: true). draft: true with no versionId
|
|
111
|
+
// resolves to NEW_DRAFT_FROM_PUBLISHED, which still fetches the
|
|
112
|
+
// *published* original to branch from; newDocument was just created as
|
|
113
|
+
// a draft copy with no published version yet, so that 404s the same way
|
|
114
|
+
// an unqualified update would.
|
|
115
|
+
await collection.updateById({
|
|
116
|
+
id: newDocument.id,
|
|
117
|
+
data,
|
|
118
|
+
locale,
|
|
119
|
+
versionId: newDocument.versionId
|
|
120
|
+
});
|
|
102
121
|
}
|
|
103
122
|
// Reset event locale
|
|
104
123
|
rime.setLocale(currentLocale);
|
|
@@ -45,16 +45,17 @@ export const updateById = async (args) => {
|
|
|
45
45
|
data = result.data;
|
|
46
46
|
}
|
|
47
47
|
const makeMessage = (name) => `missing ${name} @uppdateById`;
|
|
48
|
+
const makeError = (name) => new RimeError(RimeError.OPERATION_ERROR, makeMessage(name));
|
|
48
49
|
if (!context.configMap)
|
|
49
|
-
throw
|
|
50
|
+
throw makeError('configMap');
|
|
50
51
|
if (!context.originalConfigMap)
|
|
51
|
-
throw
|
|
52
|
+
throw makeError('originalConfigMap');
|
|
52
53
|
if (!context.originalDoc)
|
|
53
|
-
throw
|
|
54
|
+
throw makeError('originalDoc');
|
|
54
55
|
if (!context.versionOperation)
|
|
55
|
-
throw
|
|
56
|
+
throw makeError('versionOperation');
|
|
56
57
|
if (!context.params.versionId)
|
|
57
|
-
throw
|
|
58
|
+
throw makeError('versionId');
|
|
58
59
|
const incomingPaths = Object.keys(context.configMap);
|
|
59
60
|
const { id: updatedId } = await rime.adapter.collection.update({
|
|
60
61
|
id,
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import { handleError } from '../../errors/handler.server.js';
|
|
1
|
+
import { ERROR_CONTEXT, handleError } from '../../errors/handler.server.js';
|
|
2
2
|
import { RimeError } from '../../errors/index.js';
|
|
3
|
+
import { trycatch } from '../../../util/function.js';
|
|
3
4
|
import { error, json } from '@sveltejs/kit';
|
|
4
5
|
export async function restDuplicate(event) {
|
|
5
6
|
//
|
|
6
7
|
const { rime } = event.locals;
|
|
7
8
|
const slug = event.params.slug;
|
|
8
9
|
if (!rime.config.isCollection(slug)) {
|
|
9
|
-
return handleError(new RimeError(RimeError.NOT_FOUND), { context:
|
|
10
|
+
return handleError(new RimeError(RimeError.NOT_FOUND), { context: ERROR_CONTEXT.API });
|
|
10
11
|
}
|
|
11
12
|
const collection = rime.collection(slug);
|
|
12
13
|
if (!event.params.id)
|
|
13
14
|
throw error(404);
|
|
14
|
-
const newId = await collection.duplicate({ id: event.params.id });
|
|
15
|
+
const [duplicateError, newId] = await trycatch(() => collection.duplicate({ id: event.params.id }));
|
|
16
|
+
if (duplicateError) {
|
|
17
|
+
return handleError(duplicateError, { context: ERROR_CONTEXT.API });
|
|
18
|
+
}
|
|
15
19
|
return json({ id: newId });
|
|
16
20
|
}
|
|
@@ -2,7 +2,7 @@ import type { BuiltCollection, Config } from '../../../config/types.js';
|
|
|
2
2
|
import type { RimeContext } from '../../../rime.server.js';
|
|
3
3
|
import type { GenericDoc } from '../../../types/doc.js';
|
|
4
4
|
import type { WithUpload } from '../util/config.js';
|
|
5
|
-
export declare const
|
|
5
|
+
export declare const cleanUpDocumentFile: <C extends Config>(args: {
|
|
6
6
|
config: WithUpload<BuiltCollection>;
|
|
7
7
|
rime: RimeContext<C>;
|
|
8
8
|
id: string;
|
|
@@ -1,11 +1,58 @@
|
|
|
1
1
|
import { logger } from '../../../logger/index.server.js';
|
|
2
|
+
import { hasVersionsSuffix, withVersionsSuffix } from '../../../naming.js';
|
|
2
3
|
import { existsSync, unlink, unlinkSync } from 'fs';
|
|
3
4
|
import path from 'path';
|
|
4
|
-
|
|
5
|
+
/**
|
|
6
|
+
* A given filename on disk can be shared by several document rows across
|
|
7
|
+
* unrelated upload collections — saveFile dedupes any byte-identical upload
|
|
8
|
+
* to a single file (see isSameFile). For a versioned collection the root
|
|
9
|
+
* table is just an id/hierarchy envelope — all actual content, including
|
|
10
|
+
* the published state, lives in its `_versions` table — so versioned
|
|
11
|
+
* collections are checked via that sibling, which holds the full history
|
|
12
|
+
* rather than just the one row a base-collection query would join in.
|
|
13
|
+
* `selfId` must already be in whichever id-space `selfSlug` resolves to
|
|
14
|
+
* (a `_versions` row's own id, not the envelope's `id` — see versionId in
|
|
15
|
+
* mergeRawDocumentWithVersion). Every configured locale is checked since a
|
|
16
|
+
* localized collection's query can otherwise miss rows in non-default
|
|
17
|
+
* locales, even though `filename` itself is never a localized field.
|
|
18
|
+
*/
|
|
19
|
+
const isFilenameStillReferenced = async (args) => {
|
|
20
|
+
const { rime, filename, selfSlug, selfId } = args;
|
|
21
|
+
const targetSlugs = Object.values(rime.config.collections)
|
|
22
|
+
.filter((c) => c?.upload && !hasVersionsSuffix(c.slug))
|
|
23
|
+
.map((c) => (c.versions ? withVersionsSuffix(c.slug) : c.slug));
|
|
24
|
+
const locales = rime.config.getLocalesCodes();
|
|
25
|
+
const localesToQuery = locales.length ? locales : [undefined];
|
|
26
|
+
for (const slug of targetSlugs) {
|
|
27
|
+
for (const locale of localesToQuery) {
|
|
28
|
+
const docs = await rime.collection(slug).find({
|
|
29
|
+
query: `where[filename][equals]=${filename}`,
|
|
30
|
+
draft: true,
|
|
31
|
+
locale,
|
|
32
|
+
limit: slug === selfSlug ? 2 : 1
|
|
33
|
+
});
|
|
34
|
+
const referenced = docs.some((doc) => slug !== selfSlug || doc.id !== selfId);
|
|
35
|
+
if (referenced)
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
};
|
|
41
|
+
export const cleanUpDocumentFile = async (args) => {
|
|
5
42
|
//
|
|
6
43
|
const { config, rime, id } = args;
|
|
7
44
|
const doc = await rime.collection(config.slug).findById({ id, draft: true });
|
|
8
45
|
try {
|
|
46
|
+
if (!doc.filename)
|
|
47
|
+
return doc;
|
|
48
|
+
const stillReferenced = await isFilenameStillReferenced({
|
|
49
|
+
rime,
|
|
50
|
+
filename: doc.filename,
|
|
51
|
+
selfSlug: config.versions ? withVersionsSuffix(config.slug) : config.slug,
|
|
52
|
+
selfId: doc.versionId ?? doc.id
|
|
53
|
+
});
|
|
54
|
+
if (stillReferenced)
|
|
55
|
+
return doc;
|
|
9
56
|
const filePath = path.resolve(process.cwd(), `static/medias/${doc.filename}`);
|
|
10
57
|
// Delete original
|
|
11
58
|
unlinkSync(filePath);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cleanUpDocumentFile } from '../disk/delete.server.js';
|
|
2
2
|
import { Hooks } from '../../../operations/hooks/index.server.js';
|
|
3
3
|
/**
|
|
4
4
|
* Hook executed before deleting a document to clean up associated files from storage.
|
|
@@ -12,6 +12,6 @@ import { Hooks } from '../../../operations/hooks/index.server.js';
|
|
|
12
12
|
export const cleanUpFiles = Hooks.beforeDelete(async (args) => {
|
|
13
13
|
const config = args.config;
|
|
14
14
|
const id = args.context.params.id || '';
|
|
15
|
-
await
|
|
15
|
+
await cleanUpDocumentFile({ config, rime: args.event.locals.rime, id });
|
|
16
16
|
return args;
|
|
17
17
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hook executed before save/update operations on {uploadSlug}_directories collections
|
|
3
|
-
* the function
|
|
3
|
+
* the function normalize and validate path ({slug}_directories.id).
|
|
4
4
|
* Then extract parent, name from the given path.
|
|
5
5
|
*/
|
|
6
6
|
export declare const exctractPath: import("../../../operations/hooks/index.server.js").Hook<"directory", "update" | "create", "before">;
|
|
@@ -4,7 +4,7 @@ import { trycatchSync } from '../../../../util/function.js';
|
|
|
4
4
|
import { getSegments } from '../util/path.js';
|
|
5
5
|
/**
|
|
6
6
|
* Hook executed before save/update operations on {uploadSlug}_directories collections
|
|
7
|
-
* the function
|
|
7
|
+
* the function normalize and validate path ({slug}_directories.id).
|
|
8
8
|
* Then extract parent, name from the given path.
|
|
9
9
|
*/
|
|
10
10
|
export const exctractPath = Hooks.beforeUpsert(async (args) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cleanUpDocumentFile } from '../disk/delete.server.js';
|
|
2
2
|
import { saveFile } from '../disk/save.server.js';
|
|
3
3
|
import { Hooks } from '../../../operations/hooks/index.server.js';
|
|
4
4
|
import { omit } from '../../../../util/object.js';
|
|
@@ -33,7 +33,7 @@ export const processFileUpload = Hooks.beforeUpsert(async (args) => {
|
|
|
33
33
|
const sizesConfig = hasSizeConfig ? config.upload.imageSizes : [];
|
|
34
34
|
if (data.file) {
|
|
35
35
|
if (operation === 'update' && args.context.originalDoc) {
|
|
36
|
-
await
|
|
36
|
+
await cleanUpDocumentFile({ config, rime, id: args.context.originalDoc.id });
|
|
37
37
|
}
|
|
38
38
|
const { filename, imageSizes } = await saveFile(data.file, sizesConfig);
|
|
39
39
|
data = {
|
|
@@ -46,7 +46,7 @@ export const processFileUpload = Hooks.beforeUpsert(async (args) => {
|
|
|
46
46
|
if (data.file === null) {
|
|
47
47
|
// delete files
|
|
48
48
|
if (operation === 'update' && args.context.originalDoc) {
|
|
49
|
-
await
|
|
49
|
+
await cleanUpDocumentFile({ config, rime, id: args.context.originalDoc.id });
|
|
50
50
|
}
|
|
51
51
|
// update data for DB update
|
|
52
52
|
for (const size of sizesConfig) {
|