rimecms 0.30.2 → 0.30.3

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 (123) hide show
  1. package/README.md +1 -1
  2. package/dist/adapter-sqlite/generate-schema/column.server.js +1 -4
  3. package/dist/adapter-sqlite/generate-schema/write.server.js +1 -3
  4. package/dist/core/config/auth/better-auth-hooks.server.js +6 -3
  5. package/dist/core/dev/cli/build/index.d.ts +1 -0
  6. package/dist/core/dev/cli/build/index.js +10 -5
  7. package/dist/core/dev/cli/build/templates.d.ts +1 -1
  8. package/dist/core/dev/cli/build/templates.js +10 -7
  9. package/dist/core/dev/cli/index.js +1 -0
  10. package/dist/core/dev/cli/init/index.server.js +3 -3
  11. package/dist/core/dev/cli/init/templates.js +8 -1
  12. package/dist/core/dev/cli/util/package-manager.server.js +27 -26
  13. package/dist/core/dev/constants.d.ts +11 -2
  14. package/dist/core/dev/constants.js +11 -0
  15. package/dist/core/dev/generate/runtime/index.server.d.ts +24 -0
  16. package/dist/core/dev/generate/runtime/index.server.js +93 -0
  17. package/dist/core/dev/generate/types/index.server.js +42 -18
  18. package/dist/core/dev/vite/index.server.js +39 -23
  19. package/dist/core/fields/builders/boolean-builder.d.ts +1 -2
  20. package/dist/core/fields/builders/field-builder.d.ts +11 -6
  21. package/dist/core/fields/builders/field-builder.js +12 -5
  22. package/dist/core/fields/builders/form-field-builder.d.ts +11 -14
  23. package/dist/core/fields/builders/form-field-builder.js +17 -15
  24. package/dist/core/fields/util.js +1 -1
  25. package/dist/core/operations/blocks/extract.server.js +1 -1
  26. package/dist/core/operations/hooks/before-read/process-document-fields.server.js +3 -3
  27. package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +3 -3
  28. package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +7 -7
  29. package/dist/core/operations/shared/fallback-data-from-original.js +1 -1
  30. package/dist/core/operations/tree/extract.server.js +1 -1
  31. package/dist/core/plugins/api-init/index.server.js +2 -2
  32. package/dist/fields/blocks/index.d.ts +1 -1
  33. package/dist/fields/blocks/index.js +5 -2
  34. package/dist/fields/checkbox/index.d.ts +1 -1
  35. package/dist/fields/checkbox/index.js +3 -2
  36. package/dist/fields/combobox/index.d.ts +1 -1
  37. package/dist/fields/combobox/index.js +4 -2
  38. package/dist/fields/date/index.d.ts +2 -2
  39. package/dist/fields/date/index.js +7 -5
  40. package/dist/fields/email/index.d.ts +3 -3
  41. package/dist/fields/email/index.js +9 -8
  42. package/dist/fields/group/component/Group.svelte +1 -1
  43. package/dist/fields/group/index.d.ts +1 -1
  44. package/dist/fields/group/index.js +4 -2
  45. package/dist/fields/link/index.d.ts +1 -1
  46. package/dist/fields/link/index.js +9 -5
  47. package/dist/fields/link/module.server.d.ts +2 -0
  48. package/dist/fields/link/{runtime.server.js → module.server.js} +0 -8
  49. package/dist/fields/number/index.d.ts +1 -1
  50. package/dist/fields/number/index.js +3 -2
  51. package/dist/fields/radio/index.d.ts +1 -1
  52. package/dist/fields/radio/index.js +4 -2
  53. package/dist/fields/relation/index.d.ts +2 -6
  54. package/dist/fields/relation/index.js +5 -9
  55. package/dist/fields/relation/{runtime.d.ts → module.d.ts} +2 -2
  56. package/dist/fields/relation/module.js +4 -0
  57. package/dist/fields/relation/module.server.d.ts +5 -0
  58. package/dist/fields/relation/{runtime.server.js → module.server.js} +3 -6
  59. package/dist/fields/rich-text/index.d.ts +1 -1
  60. package/dist/fields/rich-text/index.js +3 -2
  61. package/dist/fields/select/index.d.ts +1 -1
  62. package/dist/fields/select/index.js +4 -1
  63. package/dist/fields/slug/index.d.ts +1 -1
  64. package/dist/fields/slug/index.js +3 -2
  65. package/dist/fields/tabs/index.d.ts +1 -1
  66. package/dist/fields/tabs/index.js +10 -2
  67. package/dist/fields/text/index.d.ts +1 -1
  68. package/dist/fields/text/index.js +3 -2
  69. package/dist/fields/textarea/index.d.ts +1 -1
  70. package/dist/fields/textarea/index.js +3 -2
  71. package/dist/fields/time/index.d.ts +1 -1
  72. package/dist/fields/time/index.js +3 -2
  73. package/dist/fields/toggle/index.d.ts +1 -1
  74. package/dist/fields/toggle/index.js +3 -3
  75. package/dist/fields/tree/index.d.ts +1 -1
  76. package/dist/fields/tree/index.js +4 -2
  77. package/dist/panel/components/fields/RenderFields.svelte +1 -1
  78. package/dist/panel/context/collection.svelte.js +5 -3
  79. package/dist/panel/context/documentForm.svelte.js +47 -28
  80. package/dist/panel/context/form.svelte.js +3 -3
  81. package/dist/util/doc.js +1 -1
  82. package/package.json +1 -8
  83. package/dist/fields/blocks/index.server.d.ts +0 -3
  84. package/dist/fields/blocks/index.server.js +0 -5
  85. package/dist/fields/checkbox/index.server.d.ts +0 -3
  86. package/dist/fields/checkbox/index.server.js +0 -3
  87. package/dist/fields/combobox/index.server.d.ts +0 -3
  88. package/dist/fields/combobox/index.server.js +0 -4
  89. package/dist/fields/date/index.server.d.ts +0 -3
  90. package/dist/fields/date/index.server.js +0 -3
  91. package/dist/fields/email/index.server.d.ts +0 -4
  92. package/dist/fields/email/index.server.js +0 -3
  93. package/dist/fields/group/index.server.d.ts +0 -2
  94. package/dist/fields/group/index.server.js +0 -12
  95. package/dist/fields/index.server.d.ts +0 -14
  96. package/dist/fields/index.server.js +0 -65
  97. package/dist/fields/link/runtime.server.d.ts +0 -5
  98. package/dist/fields/number/index.server.d.ts +0 -3
  99. package/dist/fields/number/index.server.js +0 -3
  100. package/dist/fields/radio/index.server.d.ts +0 -3
  101. package/dist/fields/radio/index.server.js +0 -4
  102. package/dist/fields/relation/runtime.js +0 -4
  103. package/dist/fields/relation/runtime.server.d.ts +0 -8
  104. package/dist/fields/rich-text/index.server.d.ts +0 -3
  105. package/dist/fields/rich-text/index.server.js +0 -3
  106. package/dist/fields/select/index.server.d.ts +0 -3
  107. package/dist/fields/select/index.server.js +0 -4
  108. package/dist/fields/slug/index.server.d.ts +0 -3
  109. package/dist/fields/slug/index.server.js +0 -3
  110. package/dist/fields/tabs/index.server.d.ts +0 -3
  111. package/dist/fields/tabs/index.server.js +0 -18
  112. package/dist/fields/text/index.server.d.ts +0 -3
  113. package/dist/fields/text/index.server.js +0 -3
  114. package/dist/fields/textarea/index.server.d.ts +0 -3
  115. package/dist/fields/textarea/index.server.js +0 -3
  116. package/dist/fields/time/index.server.d.ts +0 -3
  117. package/dist/fields/time/index.server.js +0 -3
  118. package/dist/fields/toggle/index.server.d.ts +0 -3
  119. package/dist/fields/toggle/index.server.js +0 -3
  120. package/dist/fields/tree/index.server.d.ts +0 -3
  121. package/dist/fields/tree/index.server.js +0 -4
  122. /package/dist/fields/link/{runtime.d.ts → module.d.ts} +0 -0
  123. /package/dist/fields/link/{runtime.js → module.js} +0 -0
@@ -6,14 +6,16 @@ const stringToDate = (value) => {
6
6
  return new Date(value);
7
7
  };
8
8
  export class DateFieldBuilder extends FormFieldBuilder {
9
- //
10
- _metaUrl = import.meta.url;
11
9
  constructor(name) {
12
10
  super(name, 'date');
11
+ this.field.defaultValue = () => new Date();
13
12
  this.field.hooks = {
14
13
  beforeValidate: [stringToDate]
15
14
  };
16
15
  }
16
+ get dataType() {
17
+ return 'timestamp';
18
+ }
17
19
  get component() {
18
20
  return DateComponent;
19
21
  }
@@ -24,11 +26,11 @@ export class DateFieldBuilder extends FormFieldBuilder {
24
26
  this.field.defaultValue = value;
25
27
  return this;
26
28
  }
27
- get dataType() {
28
- return 'timestamp';
29
- }
30
29
  isTitle() {
31
30
  this.field.isTitle = true;
32
31
  return this;
33
32
  }
33
+ generateType() {
34
+ return `${this.name}${this.get.required ? '' : '?'}: Date`;
35
+ }
34
36
  }
@@ -2,14 +2,14 @@ import type { DataType } from '../../core/fields/builders/form-field-builder.js'
2
2
  import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.js';
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  export declare class EmailFieldBuilder extends FormFieldBuilder<EmailField> {
5
- _metaUrl: string;
6
5
  constructor(name: string);
7
- layout(layout: 'compact' | 'default'): this;
6
+ get dataType(): DataType;
8
7
  get component(): import("svelte").Component<import("./component/props").EmailFieldProps, {}, "">;
8
+ layout(layout: 'compact' | 'default'): this;
9
9
  unique(bool?: boolean): this;
10
10
  defaultValue(value: string | DefaultValueFn<string>): this;
11
- get dataType(): DataType;
12
11
  isTitle(): this;
12
+ protected generateType(): string;
13
13
  }
14
14
  export declare const email: (name: string) => EmailFieldBuilder;
15
15
  /****************************************************/
@@ -3,8 +3,6 @@ import { sanitize } from '../../util/string.js';
3
3
  import validate from '../../util/validate.js';
4
4
  import EmailComp from './component/Email.svelte';
5
5
  export class EmailFieldBuilder extends FormFieldBuilder {
6
- //
7
- _metaUrl = import.meta.url;
8
6
  constructor(name) {
9
7
  super(name, 'email');
10
8
  this.field.validate = validate.email;
@@ -12,13 +10,16 @@ export class EmailFieldBuilder extends FormFieldBuilder {
12
10
  beforeSave: [sanitize]
13
11
  };
14
12
  }
15
- layout(layout) {
16
- this.field.layout = layout;
17
- return this;
13
+ get dataType() {
14
+ return 'text';
18
15
  }
19
16
  get component() {
20
17
  return EmailComp;
21
18
  }
19
+ layout(layout) {
20
+ this.field.layout = layout;
21
+ return this;
22
+ }
22
23
  unique(bool) {
23
24
  this.field.unique = typeof bool === 'boolean' ? bool : true;
24
25
  return this;
@@ -27,12 +28,12 @@ export class EmailFieldBuilder extends FormFieldBuilder {
27
28
  this.field.defaultValue = value;
28
29
  return this;
29
30
  }
30
- get dataType() {
31
- return 'text';
32
- }
33
31
  isTitle() {
34
32
  this.field.isTitle = true;
35
33
  return this;
36
34
  }
35
+ generateType() {
36
+ return `${this.name}${this.get.required ? '' : '?'}: string`;
37
+ }
37
38
  }
38
39
  export const email = (name) => new EmailFieldBuilder(name);
@@ -45,7 +45,7 @@
45
45
  .filter((field) => !(field instanceof TabsBuilder))
46
46
  .filter((field) => field instanceof FormFieldBuilder)
47
47
  .filter((field) => !form.isLive || (form.isLive && field.get.live))
48
- .filter((field) => field.run.canRead(user.attributes, { id: form.values.id }));
48
+ .filter((field) => field.use.accessRead(user.attributes, { id: form.values.id }));
49
49
  });
50
50
 
51
51
  const basePath = $derived(path ? `${path}.` : '');
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { Field, FieldsPreviewProps, FormField } from '../types.js';
4
4
  import type { Component } from 'svelte';
5
5
  export declare class GroupFieldBuilder extends FormFieldBuilder<GroupField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): Component<{
9
8
  path: string;
@@ -66,6 +65,7 @@ export declare class GroupFieldBuilder extends FormFieldBuilder<GroupField> {
66
65
  _root?: boolean;
67
66
  preview?: Component<FieldsPreviewProps>;
68
67
  };
68
+ protected generateType(): string;
69
69
  }
70
70
  export declare const group: (name: string) => GroupFieldBuilder;
71
71
  /**
@@ -7,8 +7,6 @@ const isEmpty = (value) => !!value === false ||
7
7
  Object.getPrototypeOf(value) === Object.prototype &&
8
8
  Object.keys(value).length === 0);
9
9
  export class GroupFieldBuilder extends FormFieldBuilder {
10
- //
11
- _metaUrl = import.meta.url;
12
10
  constructor(name) {
13
11
  super(name, 'group');
14
12
  this.field.isEmpty = isEmpty;
@@ -41,6 +39,10 @@ export class GroupFieldBuilder extends FormFieldBuilder {
41
39
  compile() {
42
40
  return { ...this.field, fields: this.field.fields.map((f) => f.compile()) };
43
41
  }
42
+ generateType() {
43
+ const fieldsTypes = this.field.fields.map((field) => field.use.generateType()).filter(Boolean);
44
+ return this.field.fields.length ? `${this.name}: {${fieldsTypes.join(',\n\t')}}` : '';
45
+ }
44
46
  }
45
47
  export const group = (name) => new GroupFieldBuilder(name);
46
48
  /**
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FormField } from '../types.js';
4
4
  import type { Link, LinkType } from './types.js';
5
5
  export declare class LinkFieldBuilder extends FormFieldBuilder<LinkField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): import("svelte").Component<import("./component/props").LinkFieldProps, {}, "">;
9
8
  get cell(): import("svelte").Component<{
@@ -63,6 +62,7 @@ export declare class LinkFieldBuilder extends FormFieldBuilder<LinkField> {
63
62
  value: any;
64
63
  }> | null;
65
64
  };
65
+ protected generateType(): string;
66
66
  }
67
67
  export declare const link: (name: string) => LinkFieldBuilder;
68
68
  /****************************************************/
@@ -3,12 +3,8 @@ import { sanitize } from '../../util/string.js';
3
3
  import validate from '../../util/validate.js';
4
4
  import Cell from './component/Cell.svelte';
5
5
  import LinkComp from './component/Link.svelte';
6
- // @ts-expect-error — resolved at build time by the rime Vite plugin to either
7
- // relation/runtime.server.ts (real check) or relation/runtime.ts (client no-op)
8
- import { populateRessourceURL } from '$rime/runtime';
6
+ import { populateRessourceURL } from '$rime/fields/link';
9
7
  export class LinkFieldBuilder extends FormFieldBuilder {
10
- //
11
- _metaUrl = import.meta.url;
12
8
  constructor(name) {
13
9
  super(name, 'link');
14
10
  this.field.isEmpty = (link) => !link || (typeof link === 'object' && 'value' in link && !link.value);
@@ -61,5 +57,13 @@ export class LinkFieldBuilder extends FormFieldBuilder {
61
57
  }
62
58
  return super.compile();
63
59
  }
60
+ generateType() {
61
+ return `${this.name}${this.get.required ? '' : '?'}: {
62
+ type: ${this.get.types.map((t) => `'${t}'`).join(' | ')};
63
+ value: string | null;
64
+ target: '_self' | '_blank';
65
+ url?: string;
66
+ }`;
67
+ }
64
68
  }
65
69
  export const link = (name) => new LinkFieldBuilder(name);
@@ -0,0 +1,2 @@
1
+ import type { FieldHook, LinkField } from '../types.js';
2
+ export declare const populateRessourceURL: FieldHook<LinkField>;
@@ -1,14 +1,6 @@
1
1
  import { RimeError } from '../../core/errors/index.js';
2
2
  import { logger } from '../../core/logger/index.server.js';
3
3
  import { trycatch } from '../../util/function.js';
4
- export const toType = (field) => {
5
- return `${field.name}${field.get.required ? '' : '?'}: {
6
- type: ${field.get.types.map((t) => `'${t}'`).join(' | ')};
7
- value: string | null;
8
- target: '_self' | '_blank';
9
- url?: string;
10
- }`;
11
- };
12
4
  export const populateRessourceURL = async (link, { event, documentId, operation }) => {
13
5
  if (!link)
14
6
  return link;
@@ -3,7 +3,6 @@ import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.
3
3
  import type { DefaultValueFn, FieldValidationFunc, FormField } from '../types.js';
4
4
  export declare const number: (name: string) => NumberFieldBuilder;
5
5
  export declare class NumberFieldBuilder extends FormFieldBuilder<NumberField> {
6
- _metaUrl: string;
7
6
  constructor(name: string);
8
7
  get component(): import("svelte").Component<import("./component/props").NumberFieldProps, {}, "">;
9
8
  defaultValue(value: number | DefaultValueFn<number>): this;
@@ -54,6 +53,7 @@ export declare class NumberFieldBuilder extends FormFieldBuilder<NumberField> {
54
53
  value: any;
55
54
  }> | null;
56
55
  };
56
+ protected generateType(): string;
57
57
  }
58
58
  /****************************************************/
59
59
  export type NumberField = FormField & {
@@ -14,8 +14,6 @@ const validateNumber = (value, { config }) => {
14
14
  return true;
15
15
  };
16
16
  export class NumberFieldBuilder extends FormFieldBuilder {
17
- //
18
- _metaUrl = import.meta.url;
19
17
  constructor(name) {
20
18
  super(name, 'number');
21
19
  this.field.validate = validateNumber;
@@ -45,4 +43,7 @@ export class NumberFieldBuilder extends FormFieldBuilder {
45
43
  }
46
44
  return super.compile();
47
45
  }
46
+ generateType() {
47
+ return `${this.name}${this.get.required ? '' : '?'}: number`;
48
+ }
48
49
  }
@@ -1,11 +1,11 @@
1
1
  import type { DefaultValueFn, FormField, Option } from '../types.js';
2
2
  import { PickOneFieldBuilder } from '../../core/fields/builders/select-builder.js';
3
3
  export declare class RadioFieldBuilder extends PickOneFieldBuilder<RadioField> {
4
- _metaUrl: string;
5
4
  constructor(name: string);
6
5
  get component(): import("svelte").Component<import("./component/props.js").RadioFieldProps, {}, "">;
7
6
  layout(value: 'default' | 'row'): this;
8
7
  compile(): RadioField;
8
+ protected generateType(): string;
9
9
  }
10
10
  export declare const radio: (name: string) => RadioFieldBuilder;
11
11
  /****************************************************/
@@ -1,8 +1,6 @@
1
1
  import { PickOneFieldBuilder } from '../../core/fields/builders/select-builder.js';
2
2
  import Radio from './component/Radio.svelte';
3
3
  export class RadioFieldBuilder extends PickOneFieldBuilder {
4
- //
5
- _metaUrl = import.meta.url;
6
4
  constructor(name) {
7
5
  super(name, 'radio');
8
6
  this.field.many = false;
@@ -23,5 +21,9 @@ export class RadioFieldBuilder extends PickOneFieldBuilder {
23
21
  }
24
22
  return this.field;
25
23
  }
24
+ generateType() {
25
+ const optionsString = this.get.options.map((option) => `'${option.value}'`).join(' | ');
26
+ return `${this.name}${this.get.required ? '' : '?'}: ${optionsString}`;
27
+ }
26
28
  }
27
29
  export const radio = (name) => new RadioFieldBuilder(name);
@@ -1,11 +1,10 @@
1
1
  import type { DataType } from '../../core/fields/builders/form-field-builder.js';
2
2
  import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.js';
3
3
  import type { CollectionSlug, GenericDoc } from '../../core/types/doc.js';
4
- import type { DefaultValueFn, Field, FormField, RelationRef, RelationValue } from '../types.js';
4
+ import type { DefaultValueFn, FormField, RelationRef, RelationValue } from '../types.js';
5
5
  import type { RegisterCollection } from '../../index.js';
6
6
  import type { WithOptional } from '../../util/types.js';
7
7
  export declare class RelationFieldBuilder<Doc extends GenericDoc = GenericDoc> extends FormFieldBuilder<RelationField<Doc>> {
8
- _metaUrl: string;
9
8
  constructor(name: string);
10
9
  get component(): import("svelte").Component<{
11
10
  path: string;
@@ -27,12 +26,9 @@ export declare class RelationFieldBuilder<Doc extends GenericDoc = GenericDoc> e
27
26
  /** Documentation only — relation fields are diverted into relationFieldsMap/junction
28
27
  * tables before reaching the adapter's generic column renderer (see root.server.ts). */
29
28
  get dataType(): DataType;
29
+ protected generateType(): string;
30
30
  }
31
31
  export declare const relation: (name: string) => RelationFieldBuilder<GenericDoc>;
32
- /**
33
- * Checks if a field is a relation field.
34
- */
35
- export declare const isRelationField: (field: Field) => field is RelationField;
36
32
  /**
37
33
  * Checks if a relation value is resolved (contains the actual referenced document).
38
34
  *
@@ -1,13 +1,10 @@
1
1
  import { FormFieldBuilder } from '../../core/fields/builders/form-field-builder.js';
2
2
  import { hasProps, isObjectLiteral } from '../../util/object.js';
3
- // @ts-expect-error — resolved at build time by the rime Vite plugin to either
4
- // relation/runtime.server.ts (real check) or relation/runtime.ts (client no-op)
5
- import { ensureRelationExists } from '$rime/runtime';
3
+ import { capitalize } from '../../util/string.js';
4
+ import { ensureRelationExists } from '$rime/fields/relation';
6
5
  import Cell from './component/Cell.svelte';
7
6
  import RelationComponent from './component/Relation.svelte';
8
7
  export class RelationFieldBuilder extends FormFieldBuilder {
9
- //
10
- _metaUrl = import.meta.url;
11
8
  constructor(name) {
12
9
  super(name, 'relation');
13
10
  this.field.isEmpty = (value) => !value || (Array.isArray(value) && value.length === 0);
@@ -47,12 +44,11 @@ export class RelationFieldBuilder extends FormFieldBuilder {
47
44
  get dataType() {
48
45
  return 'json';
49
46
  }
47
+ generateType() {
48
+ return `${this.name}${this.get.required ? '' : '?'}: RelationValue<${capitalize(this.get.relationTo)}Doc>`;
49
+ }
50
50
  }
51
51
  export const relation = (name) => new RelationFieldBuilder(name);
52
- /**
53
- * Checks if a field is a relation field.
54
- */
55
- export const isRelationField = (field) => field.type === 'relation';
56
52
  /**
57
53
  * Checks if a relation value is resolved (contains the actual referenced document).
58
54
  *
@@ -1,5 +1,5 @@
1
1
  import type { FieldHookShared } from '../types.js';
2
- /** Client-side no-op — resolved via `$rime/runtime` when bundling for the browser (see
2
+ /** Client-side no-op — resolved via `$rime/fields/relation` when bundling for the browser (see
3
3
  * relation/index.ts). The panel never needs to validate a relation actually exists;
4
- * the real check (relation/runtime.server.ts) runs server-side before any write lands. */
4
+ * the real check (relation/module.server.ts) runs server-side before any write lands. */
5
5
  export declare const ensureRelationExists: FieldHookShared;
@@ -0,0 +1,4 @@
1
+ /** Client-side no-op — resolved via `$rime/fields/relation` when bundling for the browser (see
2
+ * relation/index.ts). The panel never needs to validate a relation actually exists;
3
+ * the real check (relation/module.server.ts) runs server-side before any write lands. */
4
+ export const ensureRelationExists = async (value) => value;
@@ -0,0 +1,5 @@
1
+ import type { FieldHookShared } from '../types.js';
2
+ /** Real implementation — resolved server-side via `$rime/fields/relation` (see relation/index.ts,
3
+ * relation/module.ts for the client-side no-op counterpart). Uses a plain static import of
4
+ * `$app/server`, which SvelteKit's build blocks from ever reaching client code. */
5
+ export declare const ensureRelationExists: FieldHookShared;
@@ -2,12 +2,9 @@ import { getRequestEvent } from '$app/server';
2
2
  import { env } from '$env/dynamic/public';
3
3
  import { PARAMS } from '../../core/constant.js';
4
4
  import { trycatchFetch } from '../../util/function.js';
5
- import { capitalize, toKebabCase } from '../../util/string.js';
6
- export const toType = (field) => {
7
- return `${field.name}${field.get.required ? '' : '?'}: RelationValue<${capitalize(field.get.relationTo)}Doc>`;
8
- };
9
- /** Real implementation — resolved server-side via `$rime/runtime` (see relation/index.ts,
10
- * relation/runtime.ts for the client-side no-op counterpart). Uses a plain static import of
5
+ import { toKebabCase } from '../../util/string.js';
6
+ /** Real implementation — resolved server-side via `$rime/fields/relation` (see relation/index.ts,
7
+ * relation/module.ts for the client-side no-op counterpart). Uses a plain static import of
11
8
  * `$app/server`, which SvelteKit's build blocks from ever reaching client code. */
12
9
  export const ensureRelationExists = async (value, { config }) => {
13
10
  const output = [];
@@ -4,7 +4,6 @@ import type { DefaultValueFn, FormField } from '../types.js';
4
4
  import type { JSONContent } from '@tiptap/core';
5
5
  import type { RichTextFeature } from './core/types.js';
6
6
  export declare class RichTextFieldBuilder extends FormFieldBuilder<RichTextField> {
7
- _metaUrl: string;
8
7
  constructor(name: string);
9
8
  get component(): import("svelte").Component<import("./component/props").RichTextFieldProps, {}, "">;
10
9
  get cell(): import("svelte").Component<{
@@ -30,6 +29,7 @@ export declare class RichTextFieldBuilder extends FormFieldBuilder<RichTextField
30
29
  static readonly stringify: (value: string) => string;
31
30
  defaultValue(value: RichTextContent | DefaultValueFn<RichTextContent>): this;
32
31
  get dataType(): DataType;
32
+ protected generateType(): string;
33
33
  }
34
34
  export declare const richText: (name: string) => RichTextFieldBuilder;
35
35
  /**
@@ -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
  /****************************************************/