rimecms 0.30.2 → 0.31.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.
Files changed (191) hide show
  1. package/README.md +2 -40
  2. package/dist/.rime-modules.d.ts +23 -0
  3. package/dist/.rime-modules.json +1 -0
  4. package/dist/adapter-sqlite/generate-schema/column.server.js +1 -4
  5. package/dist/adapter-sqlite/generate-schema/write.server.js +7 -9
  6. package/dist/core/areas/config/builder.server.d.ts +0 -1
  7. package/dist/core/collections/auth/hooks/before-upsert/augment-fields-password.server.d.ts +1 -1
  8. package/dist/core/collections/config/builder.server.d.ts +0 -1
  9. package/dist/core/collections/upload/hooks/convert-base64.server.d.ts +1 -1
  10. package/dist/core/collections/upload/hooks/extract-path.server.d.ts +1 -1
  11. package/dist/core/collections/upload/hooks/handle-path-creation.server.d.ts +1 -1
  12. package/dist/core/collections/upload/hooks/process-file-upload.server.d.ts +1 -1
  13. package/dist/core/config/auth/better-auth-hooks.server.js +6 -3
  14. package/dist/core/config/auth/better-auth.server.d.ts +3 -3
  15. package/dist/core/config/client/augment-plugins.d.ts +1 -5
  16. package/dist/core/config/client/augment-plugins.js +3 -3
  17. package/dist/core/config/client/build-config.d.ts +1 -5
  18. package/dist/core/config/config-context.server.d.ts +1 -1
  19. package/dist/core/config/server/augment-plugins.server.d.ts +2 -42
  20. package/dist/core/config/server/augment-plugins.server.js +11 -6
  21. package/dist/core/config/server/build-config.server.d.ts +9 -4007
  22. package/dist/core/config/types.d.ts +12 -11
  23. package/dist/core/dev/cache/index.server.js +1 -1
  24. package/dist/core/dev/cli/build/index.d.ts +1 -0
  25. package/dist/core/dev/cli/build/index.js +10 -5
  26. package/dist/core/dev/cli/build/templates.d.ts +1 -1
  27. package/dist/core/dev/cli/build/templates.js +10 -7
  28. package/dist/core/dev/cli/clear/index.server.js +2 -0
  29. package/dist/core/dev/cli/generate-manifest/index.server.d.ts +17 -0
  30. package/dist/core/dev/cli/generate-manifest/index.server.js +221 -0
  31. package/dist/core/dev/cli/index.js +43 -0
  32. package/dist/core/dev/cli/init/index.server.js +13 -6
  33. package/dist/core/dev/cli/init/templates.d.ts +1 -1
  34. package/dist/core/dev/cli/init/templates.js +13 -4
  35. package/dist/core/dev/cli/util/package-manager.server.js +29 -26
  36. package/dist/core/dev/constants.d.ts +21 -2
  37. package/dist/core/dev/constants.js +26 -0
  38. package/dist/core/dev/generate/routes/common.server.js +4 -7
  39. package/dist/core/dev/generate/routes/index.server.js +25 -4
  40. package/dist/core/dev/generate/runtime/index.server.d.ts +40 -0
  41. package/dist/core/dev/generate/runtime/index.server.js +85 -0
  42. package/dist/core/dev/generate/runtime/parse-exports.server.d.ts +7 -0
  43. package/dist/core/dev/generate/runtime/parse-exports.server.js +40 -0
  44. package/dist/core/dev/generate/sanitize/index.server.d.ts +0 -7
  45. package/dist/core/dev/generate/sanitize/index.server.js +57 -5
  46. package/dist/core/dev/generate/types/index.server.js +21 -20
  47. package/dist/core/dev/vite/index.server.js +227 -33
  48. package/dist/core/ensure.server.d.ts +4 -3
  49. package/dist/core/ensure.server.js +8 -8
  50. package/dist/core/fields/builders/boolean-builder.d.ts +1 -2
  51. package/dist/core/fields/builders/field-builder.d.ts +11 -6
  52. package/dist/core/fields/builders/field-builder.js +12 -5
  53. package/dist/core/fields/builders/form-field-builder.d.ts +11 -14
  54. package/dist/core/fields/builders/form-field-builder.js +17 -15
  55. package/dist/core/fields/util.js +1 -1
  56. package/dist/core/handlers/index.js +2 -2
  57. package/dist/core/operations/blocks/extract.server.js +1 -1
  58. package/dist/core/operations/hooks/before-read/process-document-fields.server.js +3 -3
  59. package/dist/core/operations/hooks/before-upsert/data-config-map.server.d.ts +1 -1
  60. package/dist/core/operations/hooks/before-upsert/handle-new-version.server.d.ts +1 -1
  61. package/dist/core/operations/hooks/before-upsert/original-config-map.server.d.ts +1 -1
  62. package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +1 -1
  63. package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +3 -3
  64. package/dist/core/operations/hooks/before-upsert/validate-fields.server.d.ts +1 -1
  65. package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +7 -7
  66. package/dist/core/operations/hooks/index.server.d.ts +0 -4
  67. package/dist/core/operations/hooks/index.server.js +0 -4
  68. package/dist/core/operations/shared/fallback-data-from-original.js +1 -1
  69. package/dist/core/operations/tree/extract.server.js +1 -1
  70. package/dist/core/plugins/api-init/index.d.ts +2 -0
  71. package/dist/core/plugins/api-init/index.js +1 -0
  72. package/dist/core/plugins/api-init/{index.server.d.ts → module.server.d.ts} +0 -1
  73. package/dist/core/plugins/api-init/{index.server.js → module.server.js} +2 -3
  74. package/dist/core/plugins/cache/index.d.ts +2 -5
  75. package/dist/core/plugins/cache/index.js +1 -21
  76. package/dist/core/plugins/cache/module.d.ts +4 -0
  77. package/dist/core/plugins/cache/module.js +22 -0
  78. package/dist/core/plugins/cache/{index.server.d.ts → module.server.d.ts} +1 -2
  79. package/dist/core/plugins/cache/{index.server.js → module.server.js} +0 -1
  80. package/dist/core/plugins/index.d.ts +1 -8
  81. package/dist/core/plugins/index.js +0 -3
  82. package/dist/core/plugins/mailer/index.d.ts +2 -0
  83. package/dist/core/plugins/mailer/index.js +1 -0
  84. package/dist/core/plugins/mailer/{index.server.d.ts → module.server.d.ts} +0 -1
  85. package/dist/core/plugins/mailer/{index.server.js → module.server.js} +0 -1
  86. package/dist/core/plugins/sse/index.d.ts +2 -0
  87. package/dist/core/plugins/sse/index.js +1 -0
  88. package/dist/core/plugins/sse/{index.server.d.ts → module.server.d.ts} +0 -1
  89. package/dist/core/plugins/sse/{index.server.js → module.server.js} +0 -1
  90. package/dist/core/rime.server.d.ts +16 -16
  91. package/dist/fields/blocks/index.d.ts +1 -1
  92. package/dist/fields/blocks/index.js +5 -2
  93. package/dist/fields/checkbox/index.d.ts +1 -1
  94. package/dist/fields/checkbox/index.js +3 -2
  95. package/dist/fields/combobox/index.d.ts +1 -1
  96. package/dist/fields/combobox/index.js +4 -2
  97. package/dist/fields/date/index.d.ts +2 -2
  98. package/dist/fields/date/index.js +7 -5
  99. package/dist/fields/email/index.d.ts +3 -3
  100. package/dist/fields/email/index.js +9 -8
  101. package/dist/fields/group/component/Group.svelte +1 -1
  102. package/dist/fields/group/index.d.ts +1 -1
  103. package/dist/fields/group/index.js +4 -2
  104. package/dist/fields/link/index.d.ts +1 -1
  105. package/dist/fields/link/index.js +63 -56
  106. package/dist/fields/link/module.server.d.ts +2 -0
  107. package/dist/fields/link/{runtime.server.js → module.server.js} +0 -8
  108. package/dist/fields/number/index.d.ts +1 -1
  109. package/dist/fields/number/index.js +3 -2
  110. package/dist/fields/radio/index.d.ts +1 -1
  111. package/dist/fields/radio/index.js +4 -2
  112. package/dist/fields/relation/index.d.ts +2 -6
  113. package/dist/fields/relation/index.js +64 -75
  114. package/dist/fields/relation/{runtime.d.ts → module.d.ts} +2 -2
  115. package/dist/fields/relation/module.js +4 -0
  116. package/dist/fields/relation/module.server.d.ts +5 -0
  117. package/dist/fields/relation/{runtime.server.js → module.server.js} +3 -6
  118. package/dist/fields/rich-text/index.d.ts +1 -1
  119. package/dist/fields/rich-text/index.js +3 -2
  120. package/dist/fields/select/index.d.ts +1 -1
  121. package/dist/fields/select/index.js +4 -1
  122. package/dist/fields/slug/index.d.ts +1 -1
  123. package/dist/fields/slug/index.js +3 -2
  124. package/dist/fields/tabs/index.d.ts +1 -1
  125. package/dist/fields/tabs/index.js +10 -2
  126. package/dist/fields/text/index.d.ts +1 -1
  127. package/dist/fields/text/index.js +3 -2
  128. package/dist/fields/textarea/index.d.ts +1 -1
  129. package/dist/fields/textarea/index.js +3 -2
  130. package/dist/fields/time/index.d.ts +1 -1
  131. package/dist/fields/time/index.js +3 -2
  132. package/dist/fields/toggle/index.d.ts +1 -1
  133. package/dist/fields/toggle/index.js +3 -3
  134. package/dist/fields/tree/index.d.ts +1 -1
  135. package/dist/fields/tree/index.js +4 -2
  136. package/dist/index.d.ts +3 -3
  137. package/dist/index.js +3 -3
  138. package/dist/panel/components/fields/RenderFields.svelte +1 -1
  139. package/dist/panel/context/collection.svelte.js +5 -3
  140. package/dist/panel/context/config.svelte.d.ts +2 -2
  141. package/dist/panel/context/documentForm.svelte.d.ts +2 -2
  142. package/dist/panel/context/documentForm.svelte.js +47 -28
  143. package/dist/panel/context/form.svelte.js +3 -3
  144. package/dist/panel/context/live.svelte.js +1 -1
  145. package/dist/panel/pages/auth/sign-in/SignIn.svelte +6 -1
  146. package/dist/server.d.ts +4 -4
  147. package/dist/server.js +4 -4
  148. package/dist/types.d.ts +1 -1
  149. package/dist/util/doc.js +1 -1
  150. package/package.json +2 -9
  151. package/dist/fields/blocks/index.server.d.ts +0 -3
  152. package/dist/fields/blocks/index.server.js +0 -5
  153. package/dist/fields/checkbox/index.server.d.ts +0 -3
  154. package/dist/fields/checkbox/index.server.js +0 -3
  155. package/dist/fields/combobox/index.server.d.ts +0 -3
  156. package/dist/fields/combobox/index.server.js +0 -4
  157. package/dist/fields/date/index.server.d.ts +0 -3
  158. package/dist/fields/date/index.server.js +0 -3
  159. package/dist/fields/email/index.server.d.ts +0 -4
  160. package/dist/fields/email/index.server.js +0 -3
  161. package/dist/fields/group/index.server.d.ts +0 -2
  162. package/dist/fields/group/index.server.js +0 -12
  163. package/dist/fields/index.server.d.ts +0 -14
  164. package/dist/fields/index.server.js +0 -65
  165. package/dist/fields/link/runtime.server.d.ts +0 -5
  166. package/dist/fields/number/index.server.d.ts +0 -3
  167. package/dist/fields/number/index.server.js +0 -3
  168. package/dist/fields/radio/index.server.d.ts +0 -3
  169. package/dist/fields/radio/index.server.js +0 -4
  170. package/dist/fields/relation/runtime.js +0 -4
  171. package/dist/fields/relation/runtime.server.d.ts +0 -8
  172. package/dist/fields/rich-text/index.server.d.ts +0 -3
  173. package/dist/fields/rich-text/index.server.js +0 -3
  174. package/dist/fields/select/index.server.d.ts +0 -3
  175. package/dist/fields/select/index.server.js +0 -4
  176. package/dist/fields/slug/index.server.d.ts +0 -3
  177. package/dist/fields/slug/index.server.js +0 -3
  178. package/dist/fields/tabs/index.server.d.ts +0 -3
  179. package/dist/fields/tabs/index.server.js +0 -18
  180. package/dist/fields/text/index.server.d.ts +0 -3
  181. package/dist/fields/text/index.server.js +0 -3
  182. package/dist/fields/textarea/index.server.d.ts +0 -3
  183. package/dist/fields/textarea/index.server.js +0 -3
  184. package/dist/fields/time/index.server.d.ts +0 -3
  185. package/dist/fields/time/index.server.js +0 -3
  186. package/dist/fields/toggle/index.server.d.ts +0 -3
  187. package/dist/fields/toggle/index.server.js +0 -3
  188. package/dist/fields/tree/index.server.d.ts +0 -3
  189. package/dist/fields/tree/index.server.js +0 -4
  190. /package/dist/fields/link/{runtime.d.ts → module.d.ts} +0 -0
  191. /package/dist/fields/link/{runtime.js → module.js} +0 -0
@@ -16,8 +16,6 @@ const isEmpty = (value) => {
16
16
  return true;
17
17
  };
18
18
  export class RichTextFieldBuilder extends FormFieldBuilder {
19
- //
20
- _metaUrl = import.meta.url;
21
19
  constructor(name) {
22
20
  super(name, 'richText');
23
21
  this.field.isEmpty = isEmpty;
@@ -104,6 +102,9 @@ export class RichTextFieldBuilder extends FormFieldBuilder {
104
102
  get dataType() {
105
103
  return 'json';
106
104
  }
105
+ generateType() {
106
+ return `${this.name}${this.get.required ? '' : '?'}: import('@tiptap/core').JSONContent`;
107
+ }
107
108
  }
108
109
  export const richText = (name) => new RichTextFieldBuilder(name);
109
110
  /**
@@ -2,9 +2,9 @@ import type { DataType } from '../../core/fields/builders/form-field-builder.js'
2
2
  import type { DefaultValueFn, Field, FormField, Option } from '../types.js';
3
3
  import { PickManyFieldBuilder } from '../../core/fields/builders/select-builder.js';
4
4
  export declare class SelectFieldBuilder extends PickManyFieldBuilder<SelectField> {
5
- _metaUrl: string;
6
5
  get component(): import("svelte").Component<import("./component/props.js").SelectFieldProps, {}, "">;
7
6
  get dataType(): DataType;
7
+ protected generateType(): string;
8
8
  }
9
9
  export declare const select: (name: string) => SelectFieldBuilder;
10
10
  /**
@@ -1,13 +1,16 @@
1
1
  import { PickManyFieldBuilder } from '../../core/fields/builders/select-builder.js';
2
2
  import Select from './component/Select.svelte';
3
3
  export class SelectFieldBuilder extends PickManyFieldBuilder {
4
- _metaUrl = import.meta.url;
5
4
  get component() {
6
5
  return Select;
7
6
  }
8
7
  get dataType() {
9
8
  return this.field.many ? 'json' : 'text';
10
9
  }
10
+ generateType() {
11
+ const optionsJoinedType = this.get.options.map((o) => `'${o.value}'`).join(' | ');
12
+ return `${this.name}${this.get.required ? '' : '?'}: (${optionsJoinedType})${this.get.many ? '[]' : ''}`;
13
+ }
11
14
  }
12
15
  export const select = (name) => new SelectFieldBuilder(name, 'select');
13
16
  /**
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  export declare const slug: (name: string) => SlugFieldBuilder;
5
5
  export declare class SlugFieldBuilder extends FormFieldBuilder<SlugField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): import("svelte").Component<{
9
8
  path: string;
@@ -67,6 +66,7 @@ export declare class SlugFieldBuilder extends FormFieldBuilder<SlugField> {
67
66
  value: any;
68
67
  }> | null;
69
68
  };
69
+ protected generateType(): string;
70
70
  }
71
71
  /****************************************************/
72
72
  export type SlugField = FormField & {
@@ -5,8 +5,6 @@ import Cell from './component/Cell.svelte';
5
5
  import Slug from './component/Slug.svelte';
6
6
  export const slug = (name) => new SlugFieldBuilder(name);
7
7
  export class SlugFieldBuilder extends FormFieldBuilder {
8
- //
9
- _metaUrl = import.meta.url;
10
8
  constructor(name) {
11
9
  super(name, 'slug');
12
10
  this.field.validate = validate.slug;
@@ -54,4 +52,7 @@ export class SlugFieldBuilder extends FormFieldBuilder {
54
52
  }
55
53
  return super.compile();
56
54
  }
55
+ generateType() {
56
+ return `${this.name}${this.get.required ? '' : '?'}: string`;
57
+ }
57
58
  }
@@ -4,7 +4,6 @@ import type { WithoutBuilders } from '../../util/types.js';
4
4
  export declare const tabs: (...tabs: TabBuilder[]) => TabsBuilder;
5
5
  export declare const tab: (name: string) => TabBuilder;
6
6
  export declare class TabsBuilder extends FieldBuilder<TabsField> {
7
- _metaUrl: string;
8
7
  constructor(...tabs: TabBuilder[]);
9
8
  get component(): import("svelte").Component<{
10
9
  config: TabsBuilder;
@@ -38,6 +37,7 @@ export declare class TabsBuilder extends FieldBuilder<TabsField> {
38
37
  update: import("../types.js").FieldAccess;
39
38
  };
40
39
  };
40
+ protected generateType(): string;
41
41
  }
42
42
  export declare class TabBuilder {
43
43
  #private;
@@ -4,8 +4,6 @@ import Tabs from './component/Tabs.svelte';
4
4
  export const tabs = (...tabs) => new TabsBuilder(...tabs);
5
5
  export const tab = (name) => new TabBuilder(name);
6
6
  export class TabsBuilder extends FieldBuilder {
7
- //
8
- _metaUrl = import.meta.url;
9
7
  constructor(...tabs) {
10
8
  super('tabs');
11
9
  this.field.tabs = tabs;
@@ -21,6 +19,16 @@ export class TabsBuilder extends FieldBuilder {
21
19
  cell: this.cell || undefined
22
20
  };
23
21
  }
22
+ generateType() {
23
+ const types = [];
24
+ for (const tab of this.field.tabs) {
25
+ const fieldsTypes = tab.get.fields.map((field) => field.use.generateType()).filter(Boolean);
26
+ if (fieldsTypes.length) {
27
+ types.push(`${tab.name}: {${fieldsTypes.join(',\n\t\t')}}`);
28
+ }
29
+ }
30
+ return types.length ? types.join(',\n\t').replaceAll(',,', ',') : '';
31
+ }
24
32
  }
25
33
  export class TabBuilder {
26
34
  #tab;
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  /****************************************************/
5
5
  export declare class TextFieldBuilder extends FormFieldBuilder<TextField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  unique(bool?: boolean): this;
9
8
  get component(): import("svelte").Component<import("./component/props").TextFieldProps, {}, "">;
@@ -59,6 +58,7 @@ export declare class TextFieldBuilder extends FormFieldBuilder<TextField> {
59
58
  value: any;
60
59
  }> | null;
61
60
  };
61
+ protected generateType(): string;
62
62
  }
63
63
  export declare const text: (name: string) => TextFieldBuilder;
64
64
  /****************************************************/
@@ -3,8 +3,6 @@ import { capitalize, sanitize } from '../../util/string.js';
3
3
  import Text from './component/Text.svelte';
4
4
  /****************************************************/
5
5
  export class TextFieldBuilder extends FormFieldBuilder {
6
- //
7
- _metaUrl = import.meta.url;
8
6
  constructor(name) {
9
7
  super(name, 'text');
10
8
  this.field.hooks = {
@@ -51,5 +49,8 @@ export class TextFieldBuilder extends FormFieldBuilder {
51
49
  }
52
50
  return super.compile();
53
51
  }
52
+ generateType() {
53
+ return `${this.name}${this.get.required ? '' : '?'}: string`;
54
+ }
54
55
  }
55
56
  export const text = (name) => new TextFieldBuilder(name);
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  export declare const textarea: (name: string) => TextAreaFieldBuilder;
5
5
  export declare class TextAreaFieldBuilder extends FormFieldBuilder<TextAreaField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): import("svelte").Component<import("./component/props").TextAreaFieldProps, {}, "">;
9
8
  get cell(): null;
@@ -55,6 +54,7 @@ export declare class TextAreaFieldBuilder extends FormFieldBuilder<TextAreaField
55
54
  value: any;
56
55
  }> | null;
57
56
  };
57
+ protected generateType(): string;
58
58
  }
59
59
  /****************************************************/
60
60
  export type TextAreaField = FormField & {
@@ -3,8 +3,6 @@ import { capitalize, sanitize } from '../../util/string.js';
3
3
  import TextArea from './component/TextArea.svelte';
4
4
  export const textarea = (name) => new TextAreaFieldBuilder(name);
5
5
  export class TextAreaFieldBuilder extends FormFieldBuilder {
6
- //
7
- _metaUrl = import.meta.url;
8
6
  constructor(name) {
9
7
  super(name, 'textarea');
10
8
  this.field.hooks = {
@@ -43,4 +41,7 @@ export class TextAreaFieldBuilder extends FormFieldBuilder {
43
41
  }
44
42
  return super.compile();
45
43
  }
44
+ generateType() {
45
+ return `${this.name}${this.get.required ? '' : '?'}: string`;
46
+ }
46
47
  }
@@ -3,11 +3,11 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  export declare const time: (name: string) => TimeFieldBuilder;
5
5
  export declare class TimeFieldBuilder extends FormFieldBuilder<TimeField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): import("svelte").Component<import("./component/props").TimeFieldProps, {}, "">;
9
8
  defaultValue(value: string | DefaultValueFn<string>): this;
10
9
  get dataType(): DataType;
10
+ protected generateType(): string;
11
11
  }
12
12
  /****************************************************/
13
13
  export type TimeField = FormField & {
@@ -2,8 +2,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
2
2
  import TimeComponent from './component/Time.svelte';
3
3
  export const time = (name) => new TimeFieldBuilder(name);
4
4
  export class TimeFieldBuilder extends FormFieldBuilder {
5
- //
6
- _metaUrl = import.meta.url;
7
5
  constructor(name) {
8
6
  super(name, 'time');
9
7
  this.field.defaultValue = '08:00';
@@ -24,4 +22,7 @@ export class TimeFieldBuilder extends FormFieldBuilder {
24
22
  get dataType() {
25
23
  return 'text';
26
24
  }
25
+ generateType() {
26
+ return `${this.name}${!this.get.required ? '?' : ''}: string`;
27
+ }
27
28
  }
@@ -1,7 +1,6 @@
1
1
  import { BooleanFieldBuilder } from '../../core/fields/builders/boolean-builder.js';
2
2
  import type { DefaultValueFn, FormField } from '../types.js';
3
3
  export declare class ToggleFieldBuilder extends BooleanFieldBuilder<ToggleField> {
4
- _metaUrl: string;
5
4
  constructor(name: string);
6
5
  get component(): import("svelte").Component<import("./component/props").ToggleProps, {}, "">;
7
6
  get cell(): import("svelte").Component<{
@@ -50,6 +49,7 @@ export declare class ToggleFieldBuilder extends BooleanFieldBuilder<ToggleField>
50
49
  value: any;
51
50
  }> | null;
52
51
  };
52
+ protected generateType(): string;
53
53
  }
54
54
  export declare const toggle: (name: string) => ToggleFieldBuilder;
55
55
  /****************************************************/
@@ -2,12 +2,9 @@ import { BooleanFieldBuilder } from '../../core/fields/builders/boolean-builder.
2
2
  import Cell from './component/Cell.svelte';
3
3
  import Toggle from './component/Toggle.svelte';
4
4
  export class ToggleFieldBuilder extends BooleanFieldBuilder {
5
- //
6
- _metaUrl = import.meta.url;
7
5
  constructor(name) {
8
6
  super(name, 'toggle');
9
7
  this.field.isEmpty = (value) => typeof value !== 'boolean';
10
- this.field.defaultValue = false;
11
8
  }
12
9
  get component() {
13
10
  return Toggle;
@@ -27,5 +24,8 @@ export class ToggleFieldBuilder extends BooleanFieldBuilder {
27
24
  }
28
25
  return super.compile();
29
26
  }
27
+ generateType() {
28
+ return `${this.name}${this.get.required ? '' : '?'}: boolean`;
29
+ }
30
30
  }
31
31
  export const toggle = (name) => new ToggleFieldBuilder(name);
@@ -4,7 +4,6 @@ import type { Field, FormField } from '../types.js';
4
4
  import type { Dic } from '../../util/types.js';
5
5
  export declare const tree: (name: string) => TreeBuilder;
6
6
  export declare class TreeBuilder extends FormFieldBuilder<TreeField> {
7
- _metaUrl: string;
8
7
  constructor(name: string);
9
8
  get component(): import("svelte").Component<import("./component/props.js").TreeProps, {}, "">;
10
9
  get cell(): import("svelte").Component<{
@@ -71,6 +70,7 @@ export declare class TreeBuilder extends FormFieldBuilder<TreeField> {
71
70
  renderTitle?: TreeFieldBlockRenderTitle;
72
71
  addItemLabel: string;
73
72
  };
73
+ protected generateType(): string;
74
74
  }
75
75
  /**
76
76
  * Checks if a field is a tree field.
@@ -1,13 +1,12 @@
1
1
  import { FieldBuilder } from '../../core/fields/builders/field-builder.js';
2
2
  import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.js';
3
+ import { toPascalCase } from '../../util/string.js';
3
4
  import { number } from '../number/index.js';
4
5
  import { text } from '../text/index.js';
5
6
  import Cell from './component/Cell.svelte';
6
7
  import Tree from './component/Tree.svelte';
7
8
  export const tree = (name) => new TreeBuilder(name);
8
9
  export class TreeBuilder extends FormFieldBuilder {
9
- //
10
- _metaUrl = import.meta.url;
11
10
  constructor(name) {
12
11
  super(name, 'tree');
13
12
  this.field.defaultValue = [];
@@ -75,6 +74,9 @@ export class TreeBuilder extends FormFieldBuilder {
75
74
  fields: this.field.fields.map((f) => f.compile())
76
75
  };
77
76
  }
77
+ generateType() {
78
+ return `${this.name}: Array<Tree${toPascalCase(this.name)}>,`;
79
+ }
78
80
  }
79
81
  /**
80
82
  * Checks if a field is a tree field.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import i18n, { t__ } from './core/i18n/index.js';
2
- import { cacheClient } from './core/plugins/cache/index.js';
2
+ import { cache } from './core/plugins/cache/index.js';
3
3
  import LiveConsumer from './panel/components/sections/live/Consumer.svelte';
4
4
  import LiveEdit from './panel/components/sections/live/LiveEdit.svelte';
5
5
  import LiveProvider from './panel/components/sections/live/Provider.svelte';
6
- export { definePlugin, definePluginClient } from './core/plugins/index.js';
7
- export { cacheClient, i18n, LiveConsumer, LiveEdit, LiveProvider, t__ };
6
+ export { definePlugin } from './core/plugins/index.js';
7
+ export { cache, i18n, LiveConsumer, LiveEdit, LiveProvider, t__ };
8
8
  export type { Dictionaries, PanelLanguage } from './core/i18n/index.js';
9
9
  declare module 'rimecms' {
10
10
  interface RegisterCollection {
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import i18n, { t__ } from './core/i18n/index.js';
2
- import { cacheClient } from './core/plugins/cache/index.js';
2
+ import { cache } from './core/plugins/cache/index.js';
3
3
  import LiveConsumer from './panel/components/sections/live/Consumer.svelte';
4
4
  import LiveEdit from './panel/components/sections/live/LiveEdit.svelte';
5
5
  import LiveProvider from './panel/components/sections/live/Provider.svelte';
6
- export { definePlugin, definePluginClient } from './core/plugins/index.js';
7
- export { cacheClient, i18n, LiveConsumer, LiveEdit, LiveProvider, t__ };
6
+ export { definePlugin } from './core/plugins/index.js';
7
+ export { cache, i18n, LiveConsumer, LiveEdit, LiveProvider, t__ };
@@ -20,7 +20,7 @@
20
20
  const user = getUserContext();
21
21
 
22
22
  const authorizedFields = $derived(
23
- fields.filter((field) => field.run.canRead(user.attributes, { id: form.values.id }))
23
+ fields.filter((field) => field.use.accessRead(user.attributes, { id: form.values.id }))
24
24
  );
25
25
 
26
26
  const path = $derived(initialPath === '' ? '' : `${initialPath}.`);
@@ -38,9 +38,11 @@ function createCollectionStore(args) {
38
38
  const hasVersions = $derived(!!config.versions);
39
39
  const hasDraft = $derived(config.versions && config.versions.draft);
40
40
  onMount(() => {
41
+ const storedDisplay = localStorage.getItem(`collection.${config.slug}.display`);
41
42
  displayMode =
42
- localStorage.getItem(`collection.${config.slug}.display`) ||
43
- DISPLAY_MODE.LIST;
43
+ storedDisplay && (storedDisplay !== DISPLAY_MODE.NESTED || config.nested)
44
+ ? storedDisplay
45
+ : DISPLAY_MODE.LIST;
44
46
  const localSortBy = localStorage.getItem(`collection.${config.slug}.sortBy`);
45
47
  sortingBy = localSortBy || 'updatedAt';
46
48
  const localSortOrder = localStorage.getItem(`collection.${config.slug}.sortOrder`);
@@ -246,7 +248,7 @@ function createCollectionStore(args) {
246
248
  return displayMode === DISPLAY_MODE.GRID;
247
249
  }
248
250
  function isNested() {
249
- return displayMode === DISPLAY_MODE.NESTED;
251
+ return displayMode === DISPLAY_MODE.NESTED && !!config.nested;
250
252
  }
251
253
  function toggleSelectOf(docId) {
252
254
  if (selected.includes(docId)) {
@@ -8,7 +8,7 @@ export declare function setConfigContext(initial: BuiltConfigClient): {
8
8
  getDocumentConfig: (args: {
9
9
  prototype: Prototype;
10
10
  slug: PrototypeSlug;
11
- }) => BuiltAreaClient | BuiltCollectionClient;
11
+ }) => import("../../core/config/types.js").BuiltCollection | import("../../core/config/types.js").BuiltArea;
12
12
  };
13
13
  export declare function getConfigContext(): {
14
14
  readonly raw: BuiltConfigClient;
@@ -17,5 +17,5 @@ export declare function getConfigContext(): {
17
17
  getDocumentConfig: (args: {
18
18
  prototype: Prototype;
19
19
  slug: PrototypeSlug;
20
- }) => BuiltAreaClient | BuiltCollectionClient;
20
+ }) => import("../../core/config/types.js").BuiltCollection | import("../../core/config/types.js").BuiltArea;
21
21
  };
@@ -60,7 +60,7 @@ export declare function setDocumentFormContext<T extends WithOptional<GenericDoc
60
60
  delete(key: string): void;
61
61
  deleteAllThatStartWith(path: string): void;
62
62
  };
63
- readonly config: BuiltCollectionClient;
63
+ readonly config: import("../../types.js").BuiltCollection;
64
64
  readonly title: string | import("../../core/config/types.js").CollectionLabel;
65
65
  readonly isLive: boolean;
66
66
  reset(): void;
@@ -123,7 +123,7 @@ export declare function getDocumentFormContext<T extends WithOptional<GenericDoc
123
123
  delete(key: string): void;
124
124
  deleteAllThatStartWith(path: string): void;
125
125
  };
126
- readonly config: BuiltCollectionClient;
126
+ readonly config: import("../../types.js").BuiltCollection;
127
127
  readonly title: string | import("../../core/config/types.js").CollectionLabel;
128
128
  readonly isLive: boolean;
129
129
  reset(): void;
@@ -356,11 +356,11 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
356
356
  path = path ? normalizeFieldPath(path) : config.name;
357
357
  const parts = $derived(path.split('.'));
358
358
  const validate = (value) => {
359
- if (config.get.required && config.run.isEmpty(value)) {
359
+ if (config.get.required && config.use.isEmpty(value)) {
360
360
  errors.set(path, 'required::required_field');
361
361
  return 'required';
362
362
  }
363
- const validated = config.run.validate(value, {
363
+ const validated = config.use.validate(value, {
364
364
  data: doc,
365
365
  locale: locale.code,
366
366
  id: doc.id ?? undefined,
@@ -409,14 +409,14 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
409
409
  }
410
410
  };
411
411
  const setFieldValue = async (value) => {
412
- value = await config.run.beforeValidate(value, { config, data: doc });
412
+ value = await config.use.beforeValidate(value, { config, data: doc });
413
413
  const valid = validate(value);
414
- if (operation === 'update' && !config.run.canUpdate(user.attributes)) {
414
+ if (operation === 'update' && !config.use.accessUpdate(user.attributes)) {
415
415
  return;
416
416
  }
417
417
  if (valid) {
418
418
  setValue(path, value);
419
- config.run.onChange?.(value, {
419
+ config.use.onChange?.(value, {
420
420
  siblings: getSiblings(),
421
421
  useField,
422
422
  useBlocks,
@@ -437,26 +437,32 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
437
437
  if (readOnly)
438
438
  return false;
439
439
  if (operation === 'create') {
440
- return !!config.run.canCreate?.(user.attributes);
440
+ return !!config.use.accessCreate?.(user.attributes);
441
441
  }
442
442
  else {
443
- return !!config.run.canUpdate?.(user.attributes);
443
+ return !!config.use.accessUpdate?.(user.attributes);
444
444
  }
445
445
  },
446
446
  get visible() {
447
- if (!config.run.canRead(user.attributes)) {
447
+ if (!config.use.accessRead(user.attributes)) {
448
448
  return false;
449
449
  }
450
- return config.run.condition(doc, getSiblings());
450
+ return config.use.isVisible(doc, getSiblings());
451
451
  },
452
452
  get error() {
453
453
  return errors.value[path] || false;
454
454
  },
455
455
  get isEmpty() {
456
- return config.run.isEmpty(getValueAtPath(path, doc));
456
+ return config.use.isEmpty(getValueAtPath(path, doc));
457
457
  }
458
458
  };
459
459
  }
460
+ /**
461
+ * Prepare the form data for submission.
462
+ * This function collects the changed fields from the document,
463
+ * applies any beforeSubmit hooks, and constructs a FormData object
464
+ * to be sent in the request body.
465
+ */
460
466
  const prepareData = async () => {
461
467
  let data = {};
462
468
  for (const key of Object.keys(changes)) {
@@ -481,6 +487,9 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
481
487
  }
482
488
  return formData;
483
489
  };
490
+ /**
491
+ * Submit the form data to the server.
492
+ */
484
493
  const submit = async (action) => {
485
494
  if (processing)
486
495
  return;
@@ -537,29 +546,35 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
537
546
  }
538
547
  processing = false;
539
548
  };
549
+ /**
550
+ * Enhance the form element to handle submission.
551
+ * This function attaches a submit event listener to the form element,
552
+ * which prevents the default submission behavior, sets the status field
553
+ * if applicable, and calls the submit function with the appropriate action URL.
554
+ */
540
555
  const enhance = (node) => {
541
556
  // Assign form element
542
557
  formElement = node;
543
558
  // Set status field if submitter has a data-status attribute
544
559
  const setStatus = (submitter) => {
545
- const status = !!submitter?.dataset.status;
546
- if (status && documentConfig.versions && documentConfig.versions.draft) {
560
+ const SUBMITER_HAS_DATA_STATUS = !!submitter?.dataset.status;
561
+ if (SUBMITER_HAS_DATA_STATUS && documentConfig.versions && documentConfig.versions.draft) {
547
562
  setValue('status', submitter?.dataset.status);
548
563
  }
549
564
  };
550
565
  // Build full action URL with query params based on submitter attributes (draft, versionId)
551
566
  const enhanceAction = (submitter) => {
552
- let action = buildPanelActionUrl();
553
- const draft = !!submitter?.dataset.draft;
554
- if (draft) {
555
- action += `&draft=true`;
567
+ let actionUrl = buildPanelActionUrl();
568
+ const SUBMITER_HAS_DATA_DRAFT = !!submitter?.dataset.draft;
569
+ const DOC_HAS_VERSION = documentConfig.versions && !!doc.versionId;
570
+ const { DRAFT, VERSION_ID } = PARAMS;
571
+ if (SUBMITER_HAS_DATA_DRAFT) {
572
+ actionUrl += `&${DRAFT}=true`;
556
573
  }
557
- if (documentConfig.versions) {
558
- if (!draft) {
559
- action += `&versionId=${doc.versionId}`;
560
- }
574
+ else if (DOC_HAS_VERSION) {
575
+ actionUrl += `&${VERSION_ID}=${doc.versionId}`;
561
576
  }
562
- return action;
577
+ return actionUrl;
563
578
  };
564
579
  const listener = async (event) => {
565
580
  event.preventDefault();
@@ -573,6 +588,11 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
573
588
  }
574
589
  };
575
590
  };
591
+ /**
592
+ * Build the action URL for the form submission based on the current operation (create or update),
593
+ * the document type (collection or area), and any nested form levels.
594
+ * This function constructs the appropriate URL to which the form data will be submitted.
595
+ */
576
596
  const buildPanelActionUrl = () => {
577
597
  // Start with the base URI for the panel
578
598
  let panelUri = `/panel/${config.kebab}`;
@@ -581,19 +601,18 @@ function createDocumentFormState({ initial, config, readOnly, key, onNestedDocum
581
601
  panelUri += `/${initial.id}`;
582
602
  }
583
603
  // Determine the appropriate action based on whether we're creating or updating
584
- let actionSuffix;
585
- if (operation === 'create') {
586
- actionSuffix = '/create?/create';
587
- }
588
- else {
589
- actionSuffix = '?/update';
590
- }
604
+ const actionSuffix = operation === 'create' ? '/create?/create' : '?/update';
591
605
  // Add a redirect parameter if we're in a nested form ex: relation creation
592
606
  // to prevent redirect after creation
593
607
  const redirectParam = nestedLevel > 0 ? `&${PARAMS.REDIRECT}=false` : '';
594
608
  // Combine all parts to form the final action URL
595
609
  return `${panelUri}${actionSuffix}${redirectParam}`;
596
610
  };
611
+ /**
612
+ * Import data from the default locale for the current document.
613
+ * This function fetches the document data from the default locale and updates the current document state.
614
+ * It processes localized fields to ensure they are correctly set for the current locale.
615
+ */
597
616
  const importDataFromDefaultLocale = async () => {
598
617
  const BASE_API_URL = `${apiUrl(documentConfig.kebab)}`;
599
618
  let fetchURL = BASE_API_URL;
@@ -43,7 +43,7 @@ function createFormStore(initial, key) {
43
43
  const validate = (value) => {
44
44
  let isEmpty;
45
45
  try {
46
- isEmpty = config.run.isEmpty(value);
46
+ isEmpty = config.use.isEmpty(value);
47
47
  }
48
48
  catch (err) {
49
49
  console.error(err.message);
@@ -53,7 +53,7 @@ function createFormStore(initial, key) {
53
53
  errors.value[path] = 'required::required_field';
54
54
  return false;
55
55
  }
56
- const validated = config.run.validate(value, {
56
+ const validated = config.use.validate(value, {
57
57
  data: form,
58
58
  id: undefined,
59
59
  operation: undefined,
@@ -85,7 +85,7 @@ function createFormStore(initial, key) {
85
85
  }
86
86
  },
87
87
  get visible() {
88
- return config.run.condition(form, {});
88
+ return config.use.isVisible(form, {});
89
89
  },
90
90
  get error() {
91
91
  return errors.value[path] || false;
@@ -155,7 +155,7 @@ function createStore(href) {
155
155
  get documentUpdateURI() {
156
156
  const doc = page.data.doc;
157
157
  if (!doc)
158
- throw new Error('live.doc has not been set before accessing documentAPIUpdateURL');
158
+ throw new Error('live.doc has not been set before accessing documentAPIUpdateURL, be sure to provide a "doc" property in the page data, or provide an update property to the LiveEdit component.');
159
159
  let uri = `/${doc._type}`;
160
160
  if (doc._prototype === 'collection')
161
161
  uri += `/${doc.id}`;
@@ -36,7 +36,12 @@
36
36
  {#if context.status !== 429}
37
37
  <form method="POST" action="/panel/sign-in" use:enhance={context.enhance}>
38
38
  <Email config={emailField} form={context} />
39
- <Text type="password" icon={KeyRound} config={passwordField} form={context} />
39
+ <Text
40
+ type="password"
41
+ icon={KeyRound}
42
+ config={passwordField.clone().layout('compact')}
43
+ form={context}
44
+ />
40
45
  <Button size="xl" disabled={!context.canSubmit} type="submit">
41
46
  {t__('common.signin')}
42
47
  {#if context.pending}
package/dist/server.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import handlers from './core/handlers/index.js';
2
2
  import { registerTranslation } from './core/i18n/register.server.js';
3
- import { apiInit } from './core/plugins/api-init/index.server.js';
4
- import { cache } from './core/plugins/cache/index.server.js';
5
- import { mailer } from './core/plugins/mailer/index.server.js';
6
- import { sse } from './core/plugins/sse/index.server.js';
3
+ import { apiInit } from './core/plugins/api-init/index.js';
4
+ import { cache } from './core/plugins/cache/index.js';
5
+ import { mailer } from './core/plugins/mailer/index.js';
6
+ import { sse } from './core/plugins/sse/index.js';
7
7
  export { apiInit, cache, handlers, mailer, registerTranslation, sse };