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.
- package/README.md +2 -40
- package/dist/.rime-modules.d.ts +23 -0
- package/dist/.rime-modules.json +1 -0
- package/dist/adapter-sqlite/generate-schema/column.server.js +1 -4
- package/dist/adapter-sqlite/generate-schema/write.server.js +7 -9
- package/dist/core/areas/config/builder.server.d.ts +0 -1
- package/dist/core/collections/auth/hooks/before-upsert/augment-fields-password.server.d.ts +1 -1
- package/dist/core/collections/config/builder.server.d.ts +0 -1
- package/dist/core/collections/upload/hooks/convert-base64.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/extract-path.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/handle-path-creation.server.d.ts +1 -1
- package/dist/core/collections/upload/hooks/process-file-upload.server.d.ts +1 -1
- package/dist/core/config/auth/better-auth-hooks.server.js +6 -3
- package/dist/core/config/auth/better-auth.server.d.ts +3 -3
- package/dist/core/config/client/augment-plugins.d.ts +1 -5
- package/dist/core/config/client/augment-plugins.js +3 -3
- package/dist/core/config/client/build-config.d.ts +1 -5
- package/dist/core/config/config-context.server.d.ts +1 -1
- package/dist/core/config/server/augment-plugins.server.d.ts +2 -42
- package/dist/core/config/server/augment-plugins.server.js +11 -6
- package/dist/core/config/server/build-config.server.d.ts +9 -4007
- package/dist/core/config/types.d.ts +12 -11
- package/dist/core/dev/cache/index.server.js +1 -1
- package/dist/core/dev/cli/build/index.d.ts +1 -0
- package/dist/core/dev/cli/build/index.js +10 -5
- package/dist/core/dev/cli/build/templates.d.ts +1 -1
- package/dist/core/dev/cli/build/templates.js +10 -7
- package/dist/core/dev/cli/clear/index.server.js +2 -0
- package/dist/core/dev/cli/generate-manifest/index.server.d.ts +17 -0
- package/dist/core/dev/cli/generate-manifest/index.server.js +221 -0
- package/dist/core/dev/cli/index.js +43 -0
- package/dist/core/dev/cli/init/index.server.js +13 -6
- package/dist/core/dev/cli/init/templates.d.ts +1 -1
- package/dist/core/dev/cli/init/templates.js +13 -4
- package/dist/core/dev/cli/util/package-manager.server.js +29 -26
- package/dist/core/dev/constants.d.ts +21 -2
- package/dist/core/dev/constants.js +26 -0
- package/dist/core/dev/generate/routes/common.server.js +4 -7
- package/dist/core/dev/generate/routes/index.server.js +25 -4
- package/dist/core/dev/generate/runtime/index.server.d.ts +40 -0
- package/dist/core/dev/generate/runtime/index.server.js +85 -0
- package/dist/core/dev/generate/runtime/parse-exports.server.d.ts +7 -0
- package/dist/core/dev/generate/runtime/parse-exports.server.js +40 -0
- package/dist/core/dev/generate/sanitize/index.server.d.ts +0 -7
- package/dist/core/dev/generate/sanitize/index.server.js +57 -5
- package/dist/core/dev/generate/types/index.server.js +21 -20
- package/dist/core/dev/vite/index.server.js +227 -33
- package/dist/core/ensure.server.d.ts +4 -3
- package/dist/core/ensure.server.js +8 -8
- package/dist/core/fields/builders/boolean-builder.d.ts +1 -2
- package/dist/core/fields/builders/field-builder.d.ts +11 -6
- package/dist/core/fields/builders/field-builder.js +12 -5
- package/dist/core/fields/builders/form-field-builder.d.ts +11 -14
- package/dist/core/fields/builders/form-field-builder.js +17 -15
- package/dist/core/fields/util.js +1 -1
- package/dist/core/handlers/index.js +2 -2
- package/dist/core/operations/blocks/extract.server.js +1 -1
- package/dist/core/operations/hooks/before-read/process-document-fields.server.js +3 -3
- package/dist/core/operations/hooks/before-upsert/data-config-map.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/handle-new-version.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/original-config-map.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +3 -3
- package/dist/core/operations/hooks/before-upsert/validate-fields.server.d.ts +1 -1
- package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +7 -7
- package/dist/core/operations/hooks/index.server.d.ts +0 -4
- package/dist/core/operations/hooks/index.server.js +0 -4
- package/dist/core/operations/shared/fallback-data-from-original.js +1 -1
- package/dist/core/operations/tree/extract.server.js +1 -1
- package/dist/core/plugins/api-init/index.d.ts +2 -0
- package/dist/core/plugins/api-init/index.js +1 -0
- package/dist/core/plugins/api-init/{index.server.d.ts → module.server.d.ts} +0 -1
- package/dist/core/plugins/api-init/{index.server.js → module.server.js} +2 -3
- package/dist/core/plugins/cache/index.d.ts +2 -5
- package/dist/core/plugins/cache/index.js +1 -21
- package/dist/core/plugins/cache/module.d.ts +4 -0
- package/dist/core/plugins/cache/module.js +22 -0
- package/dist/core/plugins/cache/{index.server.d.ts → module.server.d.ts} +1 -2
- package/dist/core/plugins/cache/{index.server.js → module.server.js} +0 -1
- package/dist/core/plugins/index.d.ts +1 -8
- package/dist/core/plugins/index.js +0 -3
- package/dist/core/plugins/mailer/index.d.ts +2 -0
- package/dist/core/plugins/mailer/index.js +1 -0
- package/dist/core/plugins/mailer/{index.server.d.ts → module.server.d.ts} +0 -1
- package/dist/core/plugins/mailer/{index.server.js → module.server.js} +0 -1
- package/dist/core/plugins/sse/index.d.ts +2 -0
- package/dist/core/plugins/sse/index.js +1 -0
- package/dist/core/plugins/sse/{index.server.d.ts → module.server.d.ts} +0 -1
- package/dist/core/plugins/sse/{index.server.js → module.server.js} +0 -1
- package/dist/core/rime.server.d.ts +16 -16
- package/dist/fields/blocks/index.d.ts +1 -1
- package/dist/fields/blocks/index.js +5 -2
- package/dist/fields/checkbox/index.d.ts +1 -1
- package/dist/fields/checkbox/index.js +3 -2
- package/dist/fields/combobox/index.d.ts +1 -1
- package/dist/fields/combobox/index.js +4 -2
- package/dist/fields/date/index.d.ts +2 -2
- package/dist/fields/date/index.js +7 -5
- package/dist/fields/email/index.d.ts +3 -3
- package/dist/fields/email/index.js +9 -8
- package/dist/fields/group/component/Group.svelte +1 -1
- package/dist/fields/group/index.d.ts +1 -1
- package/dist/fields/group/index.js +4 -2
- package/dist/fields/link/index.d.ts +1 -1
- package/dist/fields/link/index.js +63 -56
- package/dist/fields/link/module.server.d.ts +2 -0
- package/dist/fields/link/{runtime.server.js → module.server.js} +0 -8
- package/dist/fields/number/index.d.ts +1 -1
- package/dist/fields/number/index.js +3 -2
- package/dist/fields/radio/index.d.ts +1 -1
- package/dist/fields/radio/index.js +4 -2
- package/dist/fields/relation/index.d.ts +2 -6
- package/dist/fields/relation/index.js +64 -75
- package/dist/fields/relation/{runtime.d.ts → module.d.ts} +2 -2
- package/dist/fields/relation/module.js +4 -0
- package/dist/fields/relation/module.server.d.ts +5 -0
- package/dist/fields/relation/{runtime.server.js → module.server.js} +3 -6
- package/dist/fields/rich-text/index.d.ts +1 -1
- package/dist/fields/rich-text/index.js +3 -2
- package/dist/fields/select/index.d.ts +1 -1
- package/dist/fields/select/index.js +4 -1
- package/dist/fields/slug/index.d.ts +1 -1
- package/dist/fields/slug/index.js +3 -2
- package/dist/fields/tabs/index.d.ts +1 -1
- package/dist/fields/tabs/index.js +10 -2
- package/dist/fields/text/index.d.ts +1 -1
- package/dist/fields/text/index.js +3 -2
- package/dist/fields/textarea/index.d.ts +1 -1
- package/dist/fields/textarea/index.js +3 -2
- package/dist/fields/time/index.d.ts +1 -1
- package/dist/fields/time/index.js +3 -2
- package/dist/fields/toggle/index.d.ts +1 -1
- package/dist/fields/toggle/index.js +3 -3
- package/dist/fields/tree/index.d.ts +1 -1
- package/dist/fields/tree/index.js +4 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/panel/components/fields/RenderFields.svelte +1 -1
- package/dist/panel/context/collection.svelte.js +5 -3
- package/dist/panel/context/config.svelte.d.ts +2 -2
- package/dist/panel/context/documentForm.svelte.d.ts +2 -2
- package/dist/panel/context/documentForm.svelte.js +47 -28
- package/dist/panel/context/form.svelte.js +3 -3
- package/dist/panel/context/live.svelte.js +1 -1
- package/dist/panel/pages/auth/sign-in/SignIn.svelte +6 -1
- package/dist/server.d.ts +4 -4
- package/dist/server.js +4 -4
- package/dist/types.d.ts +1 -1
- package/dist/util/doc.js +1 -1
- package/package.json +2 -9
- package/dist/fields/blocks/index.server.d.ts +0 -3
- package/dist/fields/blocks/index.server.js +0 -5
- package/dist/fields/checkbox/index.server.d.ts +0 -3
- package/dist/fields/checkbox/index.server.js +0 -3
- package/dist/fields/combobox/index.server.d.ts +0 -3
- package/dist/fields/combobox/index.server.js +0 -4
- package/dist/fields/date/index.server.d.ts +0 -3
- package/dist/fields/date/index.server.js +0 -3
- package/dist/fields/email/index.server.d.ts +0 -4
- package/dist/fields/email/index.server.js +0 -3
- package/dist/fields/group/index.server.d.ts +0 -2
- package/dist/fields/group/index.server.js +0 -12
- package/dist/fields/index.server.d.ts +0 -14
- package/dist/fields/index.server.js +0 -65
- package/dist/fields/link/runtime.server.d.ts +0 -5
- package/dist/fields/number/index.server.d.ts +0 -3
- package/dist/fields/number/index.server.js +0 -3
- package/dist/fields/radio/index.server.d.ts +0 -3
- package/dist/fields/radio/index.server.js +0 -4
- package/dist/fields/relation/runtime.js +0 -4
- package/dist/fields/relation/runtime.server.d.ts +0 -8
- package/dist/fields/rich-text/index.server.d.ts +0 -3
- package/dist/fields/rich-text/index.server.js +0 -3
- package/dist/fields/select/index.server.d.ts +0 -3
- package/dist/fields/select/index.server.js +0 -4
- package/dist/fields/slug/index.server.d.ts +0 -3
- package/dist/fields/slug/index.server.js +0 -3
- package/dist/fields/tabs/index.server.d.ts +0 -3
- package/dist/fields/tabs/index.server.js +0 -18
- package/dist/fields/text/index.server.d.ts +0 -3
- package/dist/fields/text/index.server.js +0 -3
- package/dist/fields/textarea/index.server.d.ts +0 -3
- package/dist/fields/textarea/index.server.js +0 -3
- package/dist/fields/time/index.server.d.ts +0 -3
- package/dist/fields/time/index.server.js +0 -3
- package/dist/fields/toggle/index.server.d.ts +0 -3
- package/dist/fields/toggle/index.server.js +0 -3
- package/dist/fields/tree/index.server.d.ts +0 -3
- package/dist/fields/tree/index.server.js +0 -4
- /package/dist/fields/link/{runtime.d.ts → module.d.ts} +0 -0
- /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 {
|
|
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
|
|
7
|
-
export {
|
|
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 {
|
|
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
|
|
7
|
-
export {
|
|
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.
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
}) =>
|
|
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
|
-
}) =>
|
|
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:
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
412
|
+
value = await config.use.beforeValidate(value, { config, data: doc });
|
|
413
413
|
const valid = validate(value);
|
|
414
|
-
if (operation === 'update' && !config.
|
|
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.
|
|
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.
|
|
440
|
+
return !!config.use.accessCreate?.(user.attributes);
|
|
441
441
|
}
|
|
442
442
|
else {
|
|
443
|
-
return !!config.
|
|
443
|
+
return !!config.use.accessUpdate?.(user.attributes);
|
|
444
444
|
}
|
|
445
445
|
},
|
|
446
446
|
get visible() {
|
|
447
|
-
if (!config.
|
|
447
|
+
if (!config.use.accessRead(user.attributes)) {
|
|
448
448
|
return false;
|
|
449
449
|
}
|
|
450
|
-
return config.
|
|
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.
|
|
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
|
|
546
|
-
if (
|
|
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
|
|
553
|
-
const
|
|
554
|
-
|
|
555
|
-
|
|
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 (
|
|
558
|
-
|
|
559
|
-
action += `&versionId=${doc.versionId}`;
|
|
560
|
-
}
|
|
574
|
+
else if (DOC_HAS_VERSION) {
|
|
575
|
+
actionUrl += `&${VERSION_ID}=${doc.versionId}`;
|
|
561
576
|
}
|
|
562
|
-
return
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
4
|
-
import { cache } from './core/plugins/cache/index.
|
|
5
|
-
import { mailer } from './core/plugins/mailer/index.
|
|
6
|
-
import { sse } from './core/plugins/sse/index.
|
|
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 };
|