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.
Files changed (215) hide show
  1. package/dist/adapter-sqlite/area.server.js +8 -8
  2. package/dist/adapter-sqlite/generate-schema/column.server.d.ts +13 -0
  3. package/dist/adapter-sqlite/generate-schema/column.server.js +77 -0
  4. package/dist/adapter-sqlite/generate-schema/index.server.js +7 -12
  5. package/dist/adapter-sqlite/generate-schema/root.server.js +35 -39
  6. package/dist/adapter-sqlite/generate-schema/templates.server.d.ts +12 -0
  7. package/dist/adapter-sqlite/generate-schema/templates.server.js +19 -0
  8. package/dist/adapter-sqlite/index.server.d.ts +1 -2
  9. package/dist/adapter-sqlite/index.server.js +0 -2
  10. package/dist/adapter-sqlite/relations.server.js +6 -1
  11. package/dist/adapter-sqlite/util.server.d.ts +1 -6
  12. package/dist/adapter-sqlite/util.server.js +6 -0
  13. package/dist/adapter-sqlite/where.server.js +17 -16
  14. package/dist/adapter-sqlite/with.server.js +9 -9
  15. package/dist/core/collections/auth/fields.d.ts +2 -182
  16. package/dist/core/collections/config/augment-auth.server.js +1 -1
  17. package/dist/core/collections/config/augment-nested.server.js +1 -1
  18. package/dist/core/collections/config/augment-upload.js +2 -2
  19. package/dist/core/collections/config/augment-upload.server.js +4 -1
  20. package/dist/core/collections/operations/duplicate.js +30 -11
  21. package/dist/core/collections/operations/updateById.js +6 -5
  22. package/dist/core/collections/rest/duplicate.server.js +7 -3
  23. package/dist/core/collections/upload/disk/delete.server.d.ts +1 -1
  24. package/dist/core/collections/upload/disk/delete.server.js +48 -1
  25. package/dist/core/collections/upload/hooks/clean-up-files.server.js +2 -2
  26. package/dist/core/collections/upload/hooks/extract-path.server.d.ts +1 -1
  27. package/dist/core/collections/upload/hooks/extract-path.server.js +1 -1
  28. package/dist/core/collections/upload/hooks/process-file-upload.server.js +3 -3
  29. package/dist/core/config/server/validate.server.js +50 -30
  30. package/dist/core/config/shared/find-thumbnail.js +12 -12
  31. package/dist/core/config/shared/find-title.js +13 -13
  32. package/dist/core/config/shared/upload-directories.js +1 -1
  33. package/dist/core/constant.server.d.ts +1 -0
  34. package/dist/core/constant.server.js +2 -0
  35. package/dist/core/dev/cache/index.server.js +9 -9
  36. package/dist/core/dev/cli/build/index.js +2 -2
  37. package/dist/core/dev/cli/clear/index.server.js +2 -1
  38. package/dist/core/dev/cli/generate/index.server.js +3 -2
  39. package/dist/core/dev/cli/init/index.server.js +1 -1
  40. package/dist/core/dev/generate/routes/index.server.js +2 -2
  41. package/dist/core/dev/generate/types/index.server.js +17 -17
  42. package/dist/core/dev/vite/index.server.js +21 -5
  43. package/dist/core/fields/builders/boolean-builder.d.ts +3 -1
  44. package/dist/core/fields/builders/boolean-builder.js +3 -0
  45. package/dist/core/fields/builders/field-builder.d.ts +35 -2
  46. package/dist/core/fields/builders/field-builder.js +33 -2
  47. package/dist/core/fields/builders/form-field-builder.d.ts +71 -12
  48. package/dist/core/fields/builders/form-field-builder.js +96 -6
  49. package/dist/core/fields/builders/select-builder.d.ts +4 -1
  50. package/dist/core/fields/builders/select-builder.js +3 -0
  51. package/dist/core/fields/util.d.ts +8 -16
  52. package/dist/core/fields/util.js +49 -83
  53. package/dist/core/handlers/routes.server.js +16 -3
  54. package/dist/core/naming.d.ts +34 -0
  55. package/dist/core/naming.js +39 -0
  56. package/dist/core/operations/blocks/diff.server.js +1 -1
  57. package/dist/core/operations/blocks/extract.server.js +1 -1
  58. package/dist/core/operations/configMap/buildTreeMap.d.ts +3 -2
  59. package/dist/core/operations/configMap/buildTreeMap.js +1 -1
  60. package/dist/core/operations/configMap/index.d.ts +2 -1
  61. package/dist/core/operations/configMap/index.js +13 -13
  62. package/dist/core/operations/configMap/types.d.ts +2 -2
  63. package/dist/core/operations/hooks/before-read/process-document-fields.server.js +14 -17
  64. package/dist/core/operations/hooks/before-upsert/data-config-map.server.js +1 -1
  65. package/dist/core/operations/hooks/before-upsert/original-config-map.server.js +1 -1
  66. package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +2 -4
  67. package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +10 -15
  68. package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +49 -31
  69. package/dist/core/operations/relations/extract.server.js +5 -5
  70. package/dist/core/operations/shared/fallback-data-from-original.js +2 -2
  71. package/dist/core/operations/tree/diff.server.js +1 -1
  72. package/dist/core/operations/tree/extract.server.js +1 -1
  73. package/dist/core/plugins/cache/cache.server.js +3 -3
  74. package/dist/fields/blocks/component/AddBlockButton.svelte +7 -7
  75. package/dist/fields/blocks/component/AddBlockButton.svelte.d.ts +2 -2
  76. package/dist/fields/blocks/component/Blocks.svelte +6 -7
  77. package/dist/fields/blocks/component/props.d.ts +2 -2
  78. package/dist/fields/blocks/index.d.ts +1 -1
  79. package/dist/fields/blocks/index.js +3 -3
  80. package/dist/fields/blocks/index.server.js +1 -1
  81. package/dist/fields/checkbox/component/Checkbox.svelte +2 -2
  82. package/dist/fields/checkbox/component/props.d.ts +2 -2
  83. package/dist/fields/checkbox/index.server.d.ts +1 -2
  84. package/dist/fields/checkbox/index.server.js +1 -10
  85. package/dist/fields/combobox/component/ComboBox.svelte +3 -3
  86. package/dist/fields/combobox/component/props.d.ts +2 -2
  87. package/dist/fields/combobox/index.server.d.ts +1 -2
  88. package/dist/fields/combobox/index.server.js +2 -11
  89. package/dist/fields/component/index.d.ts +1 -1
  90. package/dist/fields/date/component/Date.svelte +4 -4
  91. package/dist/fields/date/component/Date.svelte.d.ts +2 -2
  92. package/dist/fields/date/index.d.ts +3 -1
  93. package/dist/fields/date/index.js +3 -0
  94. package/dist/fields/date/index.server.d.ts +1 -2
  95. package/dist/fields/date/index.server.js +1 -10
  96. package/dist/fields/email/component/Email.svelte +5 -6
  97. package/dist/fields/email/component/props.d.ts +2 -3
  98. package/dist/fields/email/index.d.ts +3 -2
  99. package/dist/fields/email/index.js +4 -1
  100. package/dist/fields/email/index.server.d.ts +0 -3
  101. package/dist/fields/email/index.server.js +0 -9
  102. package/dist/fields/group/component/Group.svelte +9 -15
  103. package/dist/fields/group/component/Group.svelte.d.ts +2 -2
  104. package/dist/fields/group/index.d.ts +4 -2
  105. package/dist/fields/group/index.server.js +2 -2
  106. package/dist/fields/index.server.d.ts +1 -4
  107. package/dist/fields/index.server.js +17 -13
  108. package/dist/fields/link/component/Link.svelte +5 -5
  109. package/dist/fields/link/component/props.d.ts +2 -2
  110. package/dist/fields/link/index.d.ts +4 -1
  111. package/dist/fields/link/index.js +9 -10
  112. package/dist/fields/link/runtime.d.ts +2 -0
  113. package/dist/fields/link/runtime.js +1 -0
  114. package/dist/fields/link/{index.server.d.ts → runtime.server.d.ts} +1 -2
  115. package/dist/fields/link/{index.server.js → runtime.server.js} +2 -11
  116. package/dist/fields/number/component/Number.svelte +6 -6
  117. package/dist/fields/number/component/props.d.ts +2 -2
  118. package/dist/fields/number/index.d.ts +4 -10
  119. package/dist/fields/number/index.js +3 -4
  120. package/dist/fields/number/index.server.d.ts +1 -2
  121. package/dist/fields/number/index.server.js +1 -10
  122. package/dist/fields/radio/component/Radio.svelte +6 -7
  123. package/dist/fields/radio/component/props.d.ts +2 -2
  124. package/dist/fields/radio/index.server.d.ts +1 -2
  125. package/dist/fields/radio/index.server.js +2 -11
  126. package/dist/fields/relation/component/Relation.svelte +18 -14
  127. package/dist/fields/relation/component/Relation.svelte.d.ts +2 -2
  128. package/dist/fields/relation/index.d.ts +7 -4
  129. package/dist/fields/relation/index.js +8 -47
  130. package/dist/fields/relation/runtime.d.ts +5 -0
  131. package/dist/fields/relation/runtime.js +4 -0
  132. package/dist/fields/relation/runtime.server.d.ts +8 -0
  133. package/dist/fields/relation/runtime.server.js +49 -0
  134. package/dist/fields/rich-text/component/RichText.svelte +5 -5
  135. package/dist/fields/rich-text/component/props.d.ts +2 -2
  136. package/dist/fields/rich-text/core/features/fields/fields.svelte +2 -2
  137. package/dist/fields/rich-text/index.d.ts +2 -0
  138. package/dist/fields/rich-text/index.js +3 -0
  139. package/dist/fields/rich-text/index.server.d.ts +1 -2
  140. package/dist/fields/rich-text/index.server.js +1 -10
  141. package/dist/fields/select/component/Select.svelte +16 -16
  142. package/dist/fields/select/component/props.d.ts +2 -2
  143. package/dist/fields/select/index.d.ts +2 -0
  144. package/dist/fields/select/index.js +3 -0
  145. package/dist/fields/select/index.server.d.ts +1 -2
  146. package/dist/fields/select/index.server.js +2 -17
  147. package/dist/fields/slug/component/Slug.svelte +14 -10
  148. package/dist/fields/slug/component/Slug.svelte.d.ts +2 -2
  149. package/dist/fields/slug/index.d.ts +5 -2
  150. package/dist/fields/slug/index.js +3 -0
  151. package/dist/fields/slug/index.server.d.ts +1 -2
  152. package/dist/fields/slug/index.server.js +1 -10
  153. package/dist/fields/tabs/component/Tabs.svelte +15 -15
  154. package/dist/fields/tabs/component/Tabs.svelte.d.ts +2 -2
  155. package/dist/fields/tabs/index.d.ts +4 -16
  156. package/dist/fields/tabs/index.js +1 -8
  157. package/dist/fields/tabs/index.server.js +3 -3
  158. package/dist/fields/text/component/Text.svelte +5 -5
  159. package/dist/fields/text/component/props.d.ts +2 -3
  160. package/dist/fields/text/index.d.ts +4 -10
  161. package/dist/fields/text/index.js +3 -4
  162. package/dist/fields/text/index.server.d.ts +1 -2
  163. package/dist/fields/text/index.server.js +1 -10
  164. package/dist/fields/textarea/component/TextArea.svelte +3 -3
  165. package/dist/fields/textarea/component/props.d.ts +2 -2
  166. package/dist/fields/textarea/index.d.ts +4 -1
  167. package/dist/fields/textarea/index.js +3 -0
  168. package/dist/fields/textarea/index.server.d.ts +1 -2
  169. package/dist/fields/textarea/index.server.js +1 -10
  170. package/dist/fields/time/component/Time.svelte +5 -5
  171. package/dist/fields/time/component/Time.svelte.d.ts +1 -1
  172. package/dist/fields/time/component/props.d.ts +2 -2
  173. package/dist/fields/time/index.d.ts +2 -0
  174. package/dist/fields/time/index.js +3 -0
  175. package/dist/fields/time/index.server.d.ts +1 -2
  176. package/dist/fields/time/index.server.js +1 -10
  177. package/dist/fields/toggle/component/Toggle.svelte +3 -3
  178. package/dist/fields/toggle/component/Toggle.svelte.d.ts +1 -1
  179. package/dist/fields/toggle/component/props.d.ts +2 -2
  180. package/dist/fields/toggle/index.d.ts +2 -1
  181. package/dist/fields/toggle/index.server.d.ts +1 -2
  182. package/dist/fields/toggle/index.server.js +1 -10
  183. package/dist/fields/tree/component/AddItemButton.svelte +1 -2
  184. package/dist/fields/tree/component/Tree.svelte +6 -6
  185. package/dist/fields/tree/component/TreeBlock.svelte +5 -12
  186. package/dist/fields/tree/component/props.d.ts +3 -3
  187. package/dist/fields/tree/index.d.ts +3 -1
  188. package/dist/fields/tree/index.js +2 -2
  189. package/dist/fields/types.d.ts +11 -5
  190. package/dist/panel/components/fields/FieldsPreview.svelte +4 -5
  191. package/dist/panel/components/fields/Hint.svelte +5 -4
  192. package/dist/panel/components/fields/Hint.svelte.d.ts +3 -2
  193. package/dist/panel/components/fields/Label.svelte +6 -11
  194. package/dist/panel/components/fields/Label.svelte.d.ts +3 -2
  195. package/dist/panel/components/fields/LabelFor.svelte +4 -4
  196. package/dist/panel/components/fields/LabelFor.svelte.d.ts +2 -1
  197. package/dist/panel/components/fields/RenderFields.svelte +11 -16
  198. package/dist/panel/components/fields/{root.svelte.d.ts → fieldset.svelte.d.ts} +1 -1
  199. package/dist/panel/components/fields/{root.svelte.js → fieldset.svelte.js} +1 -1
  200. package/dist/panel/components/fields/index.d.ts +5 -5
  201. package/dist/panel/components/fields/index.js +2 -2
  202. package/dist/panel/components/sections/document/AuthFooter.svelte +2 -7
  203. package/dist/panel/components/sections/live/LiveEditPanel.svelte +2 -2
  204. package/dist/panel/context/collection.svelte.js +9 -9
  205. package/dist/panel/context/documentForm.svelte.d.ts +8 -21
  206. package/dist/panel/context/documentForm.svelte.js +45 -52
  207. package/dist/panel/context/form.svelte.d.ts +4 -3
  208. package/dist/panel/context/form.svelte.js +14 -16
  209. package/dist/panel/pages/auth/fields.d.ts +4 -4
  210. package/dist/panel/pages/auth/fields.js +6 -22
  211. package/dist/panel/pages/auth/reset-password/ResetPassword.svelte +3 -10
  212. package/dist/util/doc.js +15 -17
  213. package/package.json +3 -2
  214. package/dist/fields/relation/index.server.d.ts +0 -4
  215. 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 = field.$generateSchema(() => `ownerId: text('onwer_id').references(() => staff.id, {onDelete: 'cascade'})`);
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
- .$generateSchema(() => `_parent: text('_parent').references((): any => ${config.slug}.id, {onDelete: 'set null'})`)
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.raw.validate = (value) => {
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 = field.$generateSchema(() => `_path: text('_path').references(() => ${withDirectoriesSuffix(config.slug)}.id, {onDelete: 'cascade', onUpdate: 'cascade'})`);
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 { isBlocksFieldRaw } from '../../../fields/blocks/index.js';
4
- import { isJSONContent } from '../../../fields/rich-text/index.js';
5
- import { richTextJSONToText } from '../../../fields/rich-text/index.js';
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
- const document = await collection.findById({ id, locale: defaultLocale });
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.map((f) => f.compile()));
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 (!isBlocksFieldRaw(field) && !isTreeFieldRaw(field))
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
- await collection.updateById({ id: newDocument.id, data, locale });
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 new RimeError(RimeError.OPERATION_ERROR, makeMessage('configMap'));
50
+ throw makeError('configMap');
50
51
  if (!context.originalConfigMap)
51
- throw new RimeError(RimeError.OPERATION_ERROR, makeMessage('originalConfigMap'));
52
+ throw makeError('originalConfigMap');
52
53
  if (!context.originalDoc)
53
- throw new RimeError(RimeError.OPERATION_ERROR, makeMessage('originalDoc'));
54
+ throw makeError('originalDoc');
54
55
  if (!context.versionOperation)
55
- throw new RimeError(RimeError.OPERATION_ERROR, makeMessage('versionOperation'));
56
+ throw makeError('versionOperation');
56
57
  if (!context.params.versionId)
57
- throw new RimeError(RimeError.OPERATION_ERROR, makeMessage('versionId'));
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: 'api' });
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 cleanupStoredFiles: <C extends Config>(args: {
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
- export const cleanupStoredFiles = async (args) => {
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 { cleanupStoredFiles } from '../disk/delete.server.js';
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 cleanupStoredFiles({ config, rime: args.event.locals.rime, id });
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 nomalize and validate path ({slug}_directories.id).
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 nomalize and validate path ({slug}_directories.id).
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 { cleanupStoredFiles } from '../disk/delete.server.js';
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 cleanupStoredFiles({ config, rime, id: args.context.originalDoc.id });
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 cleanupStoredFiles({ config, rime, id: args.context.originalDoc.id });
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) {