includio-cms 0.7.2 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/ROADMAP.md +54 -2
  3. package/dist/admin/api/generate-styles.d.ts +2 -0
  4. package/dist/admin/api/generate-styles.js +32 -0
  5. package/dist/admin/api/handler.js +33 -0
  6. package/dist/admin/api/media-gc.js +10 -4
  7. package/dist/admin/api/rest/handler.js +17 -0
  8. package/dist/admin/api/rest/routes/collections.js +25 -13
  9. package/dist/admin/api/rest/routes/entries.d.ts +1 -1
  10. package/dist/admin/api/rest/routes/entries.js +10 -10
  11. package/dist/admin/api/rest/routes/media.d.ts +2 -0
  12. package/dist/admin/api/rest/routes/media.js +9 -0
  13. package/dist/admin/api/rest/routes/schema.d.ts +5 -0
  14. package/dist/admin/api/rest/routes/schema.js +152 -0
  15. package/dist/admin/api/rest/routes/singletons.d.ts +1 -1
  16. package/dist/admin/api/rest/routes/singletons.js +8 -7
  17. package/dist/admin/api/rest/routes/upload.d.ts +2 -0
  18. package/dist/admin/api/rest/routes/upload.js +28 -0
  19. package/dist/admin/api/upload.js +13 -0
  20. package/dist/admin/client/collection/collection-entries.svelte +35 -13
  21. package/dist/admin/client/entry/entry.svelte +21 -23
  22. package/dist/admin/client/entry/header/a11y-validator.js +2 -2
  23. package/dist/admin/client/entry/header/publish-panel.svelte +33 -85
  24. package/dist/admin/client/entry/header/status-badge.svelte +2 -2
  25. package/dist/admin/client/entry/header/version-history-sheet.svelte +9 -9
  26. package/dist/admin/client/entry/header/visibility.svelte +16 -10
  27. package/dist/admin/client/entry/utils.d.ts +3 -0
  28. package/dist/admin/client/entry/utils.js +22 -4
  29. package/dist/admin/client/form/form-submission/form-submission-page.svelte +4 -1
  30. package/dist/admin/client/form/form-submission/submission-field.svelte +10 -0
  31. package/dist/admin/client/index.d.ts +1 -0
  32. package/dist/admin/client/index.js +1 -0
  33. package/dist/admin/client/maintenance/maintenance-page.svelte +146 -2
  34. package/dist/admin/client/users/users-page.svelte +5 -6
  35. package/dist/admin/client/users/users-page.svelte.d.ts +1 -4
  36. package/dist/admin/components/fields/block-picker-modal.svelte +13 -4
  37. package/dist/admin/components/fields/blocks-field.svelte +40 -19
  38. package/dist/admin/components/fields/field-renderer.svelte +4 -8
  39. package/dist/admin/components/fields/object-field.svelte +7 -12
  40. package/dist/admin/components/fields/select-field.svelte +8 -2
  41. package/dist/admin/components/fields/seo-field.svelte +40 -93
  42. package/dist/admin/components/fields/simple-array-field.svelte +27 -16
  43. package/dist/admin/components/fields/text-field-wrapper.svelte +52 -197
  44. package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
  45. package/dist/admin/components/fields/url-field-wrapper.svelte +15 -25
  46. package/dist/admin/components/fields/url-field.svelte +61 -72
  47. package/dist/admin/components/layout/layout-renderer.svelte +10 -4
  48. package/dist/admin/components/media/file-preview.svelte +10 -1
  49. package/dist/admin/components/media/file-upload.svelte +5 -1
  50. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  51. package/dist/admin/components/media/files-list.svelte +12 -3
  52. package/dist/admin/components/media/media-library.svelte +109 -37
  53. package/dist/admin/components/media/media-selector.svelte +90 -16
  54. package/dist/admin/components/media/tag-sidebar.svelte +10 -6
  55. package/dist/admin/components/media/tag-sidebar.svelte.d.ts +7 -2
  56. package/dist/admin/components/tiptap/FigureNodeView.svelte +15 -10
  57. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +53 -94
  58. package/dist/admin/components/tiptap/SlashCommandPopup.svelte +8 -3
  59. package/dist/admin/components/tiptap/editor-toolbar.svelte +28 -23
  60. package/dist/admin/components/tiptap/image-dialog.svelte +12 -7
  61. package/dist/admin/components/tiptap/inline-block-node.js +6 -5
  62. package/dist/admin/components/tiptap/lang.d.ts +77 -0
  63. package/dist/admin/components/tiptap/lang.js +170 -0
  64. package/dist/admin/components/tiptap/link-dialog.svelte +31 -28
  65. package/dist/admin/components/tiptap/slash-command.js +27 -23
  66. package/dist/admin/components/tiptap/table-dialog.svelte +9 -4
  67. package/dist/admin/components/tiptap/video-dialog.svelte +6 -1
  68. package/dist/admin/remote/email.remote.d.ts +1 -0
  69. package/dist/admin/remote/email.remote.js +5 -0
  70. package/dist/admin/remote/entry.remote.d.ts +2 -5
  71. package/dist/admin/remote/entry.remote.js +23 -28
  72. package/dist/admin/remote/index.d.ts +1 -0
  73. package/dist/admin/remote/index.js +1 -0
  74. package/dist/admin/remote/media.remote.d.ts +15 -0
  75. package/dist/admin/remote/media.remote.js +18 -2
  76. package/dist/admin/remote/preview.remote.js +3 -1
  77. package/dist/admin/utils/entryLabel.js +9 -6
  78. package/dist/admin/utils/translationStatus.js +1 -2
  79. package/dist/cli/scaffold/admin.js +34 -2
  80. package/dist/cms/runtime/api.d.ts +16 -12
  81. package/dist/cms/runtime/api.js +7 -6
  82. package/dist/cms/runtime/remote.js +2 -2
  83. package/dist/cms/runtime/schemas.d.ts +1 -1
  84. package/dist/cms/runtime/schemas.js +1 -1
  85. package/dist/cms/runtime/types.d.ts +118 -112
  86. package/dist/cms/runtime/types.js +0 -12
  87. package/dist/core/cms.d.ts +3 -1
  88. package/dist/core/cms.js +30 -0
  89. package/dist/core/fields/fieldSchemaToTs.js +9 -15
  90. package/dist/core/fields/formFieldSchemaToTs.js +7 -0
  91. package/dist/core/server/entries/operations/create.js +10 -4
  92. package/dist/core/server/entries/operations/get.d.ts +1 -0
  93. package/dist/core/server/entries/operations/get.js +186 -191
  94. package/dist/core/server/entries/operations/update.d.ts +6 -7
  95. package/dist/core/server/entries/operations/update.js +20 -38
  96. package/dist/core/server/fields/populateEntry.js +16 -52
  97. package/dist/core/server/fields/resolveImageFields.js +69 -120
  98. package/dist/core/server/fields/resolveRelationFields.js +30 -51
  99. package/dist/core/server/fields/resolveRichtextLinks.js +46 -100
  100. package/dist/core/server/fields/resolveTypographyOrphans.bench.d.ts +1 -0
  101. package/dist/core/server/fields/resolveTypographyOrphans.bench.js +87 -0
  102. package/dist/core/server/fields/resolveTypographyOrphans.d.ts +3 -0
  103. package/dist/core/server/fields/resolveTypographyOrphans.js +128 -0
  104. package/dist/core/server/fields/resolveUrlFields.js +47 -56
  105. package/dist/core/server/fields/utils/fixOrphans.d.ts +5 -0
  106. package/dist/core/server/fields/utils/fixOrphans.js +12 -0
  107. package/dist/core/server/fields/utils/imageStyles.d.ts +4 -2
  108. package/dist/core/server/fields/utils/imageStyles.js +41 -25
  109. package/dist/core/server/fields/utils/resolveMedia.js +1 -6
  110. package/dist/core/server/forms/submissions/operations/delete.js +26 -2
  111. package/dist/core/server/forms/submissions/utils/parseMultipart.d.ts +2 -0
  112. package/dist/core/server/forms/submissions/utils/parseMultipart.js +75 -0
  113. package/dist/core/server/generator/fields.d.ts +6 -0
  114. package/dist/core/server/generator/fields.js +43 -5
  115. package/dist/core/server/generator/formFieldSchemaToString.js +10 -0
  116. package/dist/core/server/generator/formFields.js +1 -0
  117. package/dist/core/server/generator/generator.js +98 -30
  118. package/dist/core/server/media/operations/getFiles.d.ts +5 -0
  119. package/dist/core/server/media/operations/getFiles.js +6 -0
  120. package/dist/core/server/media/operations/uploadPrivateFile.d.ts +4 -0
  121. package/dist/core/server/media/operations/uploadPrivateFile.js +8 -0
  122. package/dist/core/server/media/styles/operations/batchGenerateStyles.d.ts +16 -0
  123. package/dist/core/server/media/styles/operations/batchGenerateStyles.js +144 -0
  124. package/dist/db-postgres/index.js +303 -37
  125. package/dist/db-postgres/schema/entry.d.ts +0 -94
  126. package/dist/db-postgres/schema/entry.js +0 -6
  127. package/dist/db-postgres/schema/entryVersion.d.ts +17 -0
  128. package/dist/db-postgres/schema/entryVersion.js +1 -0
  129. package/dist/entity/index.d.ts +9 -4
  130. package/dist/entity/index.js +24 -24
  131. package/dist/files-local/index.js +43 -0
  132. package/dist/paraglide/messages/_index.d.ts +36 -3
  133. package/dist/paraglide/messages/_index.js +71 -3
  134. package/dist/paraglide/messages/en.d.ts +5 -0
  135. package/dist/paraglide/messages/en.js +14 -0
  136. package/dist/paraglide/messages/pl.d.ts +5 -0
  137. package/dist/paraglide/messages/pl.js +14 -0
  138. package/dist/sveltekit/components/preview.svelte +2 -326
  139. package/dist/sveltekit/components/preview.svelte.d.ts +5 -16
  140. package/dist/sveltekit/server/index.d.ts +2 -1
  141. package/dist/sveltekit/server/index.js +2 -1
  142. package/dist/sveltekit/server/preview.js +4 -7
  143. package/dist/types/adapters/db.d.ts +15 -1
  144. package/dist/types/adapters/files.d.ts +6 -0
  145. package/dist/types/cms.d.ts +5 -0
  146. package/dist/types/entries.d.ts +54 -18
  147. package/dist/types/fields.d.ts +14 -24
  148. package/dist/types/formFields.d.ts +7 -2
  149. package/dist/types/index.d.ts +2 -2
  150. package/dist/types/layout.d.ts +0 -1
  151. package/dist/types/structured-content.d.ts +5 -0
  152. package/dist/updates/0.10.0/index.d.ts +2 -0
  153. package/dist/updates/0.10.0/index.js +15 -0
  154. package/dist/updates/0.11.0/index.d.ts +2 -0
  155. package/dist/updates/0.11.0/index.js +12 -0
  156. package/dist/updates/0.12.0/index.d.ts +2 -0
  157. package/dist/updates/0.12.0/index.js +12 -0
  158. package/dist/updates/0.13.0/index.d.ts +2 -0
  159. package/dist/updates/0.13.0/index.js +10 -0
  160. package/dist/updates/0.13.1/index.d.ts +2 -0
  161. package/dist/updates/0.13.1/index.js +20 -0
  162. package/dist/updates/0.7.3/index.d.ts +2 -0
  163. package/dist/updates/0.7.3/index.js +10 -0
  164. package/dist/updates/0.8.0/index.d.ts +2 -0
  165. package/dist/updates/0.8.0/index.js +18 -0
  166. package/dist/updates/0.8.0/migrate.d.ts +2 -0
  167. package/dist/updates/0.8.0/migrate.js +101 -0
  168. package/dist/updates/0.9.0/index.d.ts +2 -0
  169. package/dist/updates/0.9.0/index.js +38 -0
  170. package/dist/updates/index.js +9 -1
  171. package/package.json +7 -6
  172. package/dist/admin/components/fields/image-field.svelte +0 -198
  173. package/dist/admin/components/fields/image-field.svelte.d.ts +0 -8
  174. package/dist/admin/components/fields/richtext-field.svelte +0 -13
  175. package/dist/admin/components/fields/richtext-field.svelte.d.ts +0 -8
  176. package/dist/admin/components/tiptap.svelte +0 -11
  177. package/dist/admin/components/tiptap.svelte.d.ts +0 -6
  178. package/dist/core/server/entries/utils/getEntryTranslation.d.ts +0 -1
  179. package/dist/core/server/entries/utils/getEntryTranslation.js +0 -18
  180. package/dist/paraglide/messages/hello_world.d.ts +0 -5
  181. package/dist/paraglide/messages/hello_world.js +0 -33
  182. package/dist/paraglide/messages/login_hello.d.ts +0 -16
  183. package/dist/paraglide/messages/login_hello.js +0 -34
  184. package/dist/paraglide/messages/login_please_login.d.ts +0 -16
  185. package/dist/paraglide/messages/login_please_login.js +0 -34
@@ -2,7 +2,7 @@ import { command, query } from '$app/server';
2
2
  import { createEntry as createEntryOperation, createEntrySchema, createEntryVersion } from '../../core/server/entries/operations/create.js';
3
3
  import { getRawEntries as getRawEntriesOperation, countRawEntries as countRawEntriesOperation, getRawEntry as getRawEntryOperation, getRawEntryOrThrow, getDbEntry, getDbEntryOrThrow, getEntries as getEntriesOperation, getEntry as getEntryOperation, getEntryVersion as getEntryVersionOperation, getEntryLabels as getEntryLabelsOperation } from '../../core/server/entries/operations/get.js';
4
4
  import { getCMS } from '../../core/cms.js';
5
- import { pruneOldDraftVersions, unpublishEntry, upsertDraftVersion, updateEntry, updateEntrySchema, updateEntryVersionCommandTypes } from '../../core/server/entries/operations/update.js';
5
+ import { pruneOldDraftVersions, unpublishEntryLang, upsertDraftVersion, updateEntry, updateEntrySchema, updateEntryVersionCommandTypes } from '../../core/server/entries/operations/update.js';
6
6
  import z from 'zod';
7
7
  import { requireAuth } from './middleware/auth.js';
8
8
  import { entryStatuses } from '../../types/entries.js';
@@ -44,7 +44,7 @@ export const getEntries = query(z.object({
44
44
  });
45
45
  export const getEntryLabels = query(z.object({
46
46
  slug: z.string(),
47
- ids: z.array(z.string()).optional(),
47
+ ids: z.array(z.string().uuid()).optional(),
48
48
  search: z.string().optional(),
49
49
  limit: z.number().int().positive().optional(),
50
50
  status: z.enum(['published', 'draft', 'all']).optional()
@@ -101,6 +101,7 @@ export const getEntryForEntryPage = query(z.string(), async (id) => {
101
101
  });
102
102
  const updateEntryVersionCommandSchema = z.object({
103
103
  entryId: z.string().uuid(),
104
+ lang: z.string(),
104
105
  data: z.record(z.string(), z.unknown()),
105
106
  type: z.enum(updateEntryVersionCommandTypes),
106
107
  scheduledAt: z.date().optional()
@@ -110,49 +111,39 @@ export const updateEntryVersionCommand = command(updateEntryVersionCommandSchema
110
111
  let result;
111
112
  switch (input.type) {
112
113
  case 'draft':
113
- result = await upsertDraftVersion(input.entryId, input.data, { skipValidation: true });
114
+ result = await upsertDraftVersion(input.entryId, input.data, input.lang, { skipValidation: true });
114
115
  break;
115
116
  case 'published-now': {
116
- const existingEntry = await getDbEntryOrThrow({ id: input.entryId });
117
- // Dual-write: still set version.publishedAt for backward compat
117
+ // Create a new published version for this language
118
118
  result = await createEntryVersion({
119
- ...input,
119
+ entryId: input.entryId,
120
+ lang: input.lang,
121
+ data: input.data,
120
122
  publishedAt: new Date(),
121
123
  publishedBy: user.id
122
124
  });
123
- // Update entry-level publish state
124
- await updateEntry(input.entryId, {
125
- publishedVersionId: result.id,
126
- publishedBy: user.id,
127
- publishedAt: existingEntry.publishedAt ?? new Date()
128
- });
129
125
  break;
130
126
  }
131
127
  case 'published-scheduled': {
132
128
  if (!input.scheduledAt) {
133
129
  throw new Error('scheduledAt is required for scheduled publishing');
134
130
  }
135
- // Dual-write: still set version.publishedAt for backward compat
136
131
  result = await createEntryVersion({
137
- ...input,
132
+ entryId: input.entryId,
133
+ lang: input.lang,
134
+ data: input.data,
138
135
  publishedAt: input.scheduledAt,
139
136
  publishedBy: user.id
140
137
  });
141
- // Update entry-level publish state
142
- await updateEntry(input.entryId, {
143
- publishedVersionId: result.id,
144
- publishedBy: user.id,
145
- publishedAt: input.scheduledAt
146
- });
147
138
  break;
148
139
  }
149
140
  case 'cancel-published':
150
- result = await unpublishEntry(input.entryId);
141
+ await unpublishEntryLang(input.entryId, input.lang);
151
142
  break;
152
143
  }
153
144
  // Prune old draft versions only after publish/schedule (drafts upsert in-place)
154
145
  if (input.type !== 'draft') {
155
- await pruneOldDraftVersions(input.entryId);
146
+ await pruneOldDraftVersions(input.entryId, input.lang);
156
147
  // Refresh cached entry so UI reactively updates (status badge, version history)
157
148
  await getEntryForEntryPage(input.entryId).refresh();
158
149
  }
@@ -216,8 +207,9 @@ export const getRecentEntries = query(z.number().default(6), async (limit) => {
216
207
  let label = null;
217
208
  if (config && config.type === 'collection' && config.entryAdminTitle && latestVersion) {
218
209
  const titleData = latestVersion.data[config.entryAdminTitle];
219
- if (titleData && typeof titleData === 'object') {
220
- label = String(Object.values(titleData)[0] || '');
210
+ // Data is flat titleData is the string directly
211
+ if (typeof titleData === 'string') {
212
+ label = titleData || '';
221
213
  }
222
214
  }
223
215
  if (config && config.type === 'single' && config.label) {
@@ -237,9 +229,11 @@ export const getRecentEntries = query(z.number().default(6), async (limit) => {
237
229
  collectionLabel = config.label;
238
230
  }
239
231
  }
240
- const status = entry.publishedVersionId
232
+ const hasPublished = Object.values(entry.publishedVersions).some((v) => v != null);
233
+ const hasScheduled = Object.values(entry.scheduledVersions).some((v) => v != null);
234
+ const status = hasPublished
241
235
  ? 'published'
242
- : entry.scheduledVersion
236
+ : hasScheduled
243
237
  ? 'scheduled'
244
238
  : 'draft';
245
239
  return {
@@ -262,8 +256,9 @@ export const getRecentActivity = query(z.number().default(10), async (limit) =>
262
256
  let label = null;
263
257
  if (config && config.type === 'collection' && config.entryAdminTitle) {
264
258
  const titleData = latestVersion.data[config.entryAdminTitle];
265
- if (titleData && typeof titleData === 'object') {
266
- label = String(Object.values(titleData)[0] || '');
259
+ // Data is flat titleData is the string directly
260
+ if (typeof titleData === 'string') {
261
+ label = titleData || null;
267
262
  }
268
263
  }
269
264
  if (config && config.type === 'single' && config.label) {
@@ -7,3 +7,4 @@ export * from './languages.remote.js';
7
7
  export * from './form.remote.js';
8
8
  export * from './ai.remote.js';
9
9
  export * from './preview.remote.js';
10
+ export * from './email.remote.js';
@@ -7,3 +7,4 @@ export * from './languages.remote.js';
7
7
  export * from './form.remote.js';
8
8
  export * from './ai.remote.js';
9
9
  export * from './preview.remote.js';
10
+ export * from './email.remote.js';
@@ -14,8 +14,23 @@ export declare const getMediaFiles: import("@sveltejs/kit").RemoteQueryFunction<
14
14
  tagIds?: string[] | undefined;
15
15
  mimeTypes?: string[] | undefined;
16
16
  search?: string | undefined;
17
+ untagged?: boolean | undefined;
18
+ limit?: number | undefined;
19
+ offset?: number | undefined;
17
20
  };
18
21
  }, import("../../types/media.js").MediaFile[]>;
22
+ export declare const countMediaFiles: import("@sveltejs/kit").RemoteQueryFunction<{
23
+ data: {
24
+ tagIds?: string[] | undefined;
25
+ mimeTypes?: string[] | undefined;
26
+ search?: string | undefined;
27
+ untagged?: boolean | undefined;
28
+ };
29
+ }, number>;
30
+ export declare const getMediaTagsWithCounts: import("@sveltejs/kit").RemoteQueryFunction<void, {
31
+ tag: import("../../types/media.js").MediaTag;
32
+ count: number;
33
+ }[]>;
19
34
  export declare const getFileById: import("@sveltejs/kit").RemoteQueryFunction<string, import("../../types/media.js").MediaFile | null>;
20
35
  export declare const deleteMediaFile: import("@sveltejs/kit").RemoteCommand<string, Promise<void>>;
21
36
  export declare const bulkDeleteMediaFiles: import("@sveltejs/kit").RemoteCommand<{
@@ -2,7 +2,7 @@ import { command, query } from '$app/server';
2
2
  import { setAlt, renameMediaFile as renameMediaFileOperation, updateMediaAccessibility as updateMediaAccessibilityOp } from '../../core/server/media/operations/updateFile.js';
3
3
  import z from 'zod';
4
4
  import { deleteMediaFile as deleteMediaFileFn, bulkDeleteMediaFiles as bulkDeleteMediaFilesFn } from '../../core/server/media/operations/deleteMediaFile.js';
5
- import { getFile, getFiles } from '../../core/server/media/operations/getFiles.js';
5
+ import { getFile, getFiles, countFiles, getMediaTagsWithCounts as getMediaTagsWithCountsFn } from '../../core/server/media/operations/getFiles.js';
6
6
  import { getMediaTags as getMediaTagsFn, createMediaTag as createMediaTagFn, updateMediaTag as updateMediaTagFn, deleteMediaTag as deleteMediaTagFn, setMediaFileTags as setMediaFileTagsFn, bulkSetMediaFileTags as bulkSetMediaFileTagsFn } from '../../core/server/media/operations/tags.js';
7
7
  import { requireAuth } from './middleware/auth.js';
8
8
  const setMediaFileAltSchema = z.object({
@@ -34,11 +34,27 @@ export const getMediaFiles = query(z.object({
34
34
  ids: z.array(z.string().uuid()).optional(),
35
35
  tagIds: z.array(z.string().uuid()).optional(),
36
36
  mimeTypes: z.array(z.string()).optional(),
37
- search: z.string().optional()
37
+ search: z.string().optional(),
38
+ untagged: z.boolean().optional(),
39
+ limit: z.number().int().positive().optional(),
40
+ offset: z.number().int().nonnegative().optional()
38
41
  })
39
42
  }), async (data) => {
40
43
  return getFiles(data);
41
44
  });
45
+ export const countMediaFiles = query(z.object({
46
+ data: z.object({
47
+ tagIds: z.array(z.string().uuid()).optional(),
48
+ mimeTypes: z.array(z.string()).optional(),
49
+ search: z.string().optional(),
50
+ untagged: z.boolean().optional()
51
+ })
52
+ }), async (data) => {
53
+ return countFiles(data);
54
+ });
55
+ export const getMediaTagsWithCounts = query(async () => {
56
+ return getMediaTagsWithCountsFn();
57
+ });
42
58
  export const getFileById = query(z.string().uuid(), async (id) => {
43
59
  return getFile(id);
44
60
  });
@@ -10,5 +10,7 @@ const schema = z.object({
10
10
  });
11
11
  export const populatePreviewData = command(schema, async ({ data, slug, language }) => {
12
12
  const config = getCMS().getBySlug(slug);
13
- return populateEntryData(data, getFieldsFromConfig(config), language);
13
+ const fields = getFieldsFromConfig(config);
14
+ const populated = await populateEntryData(data, fields, language);
15
+ return populated;
14
16
  });
@@ -1,19 +1,22 @@
1
1
  import { getAtPath } from './objectPath.js';
2
2
  export function getRawCollectionEntryLabel(entry, config, language) {
3
- if (entry.publishedVersion) {
3
+ const publishedVersion = entry.publishedVersions[language];
4
+ if (publishedVersion) {
5
+ // Data is flat — entryAdminTitle value is directly a string
4
6
  return config.entryAdminTitle
5
- ? getAtPath(entry.publishedVersion.data, config.entryAdminTitle)?.[language] || entry.id
7
+ ? String(publishedVersion.data[config.entryAdminTitle] || entry.id)
6
8
  : entry.id;
7
9
  }
8
- if (entry.draftVersion) {
10
+ const draftVersion = entry.draftVersions[language];
11
+ if (draftVersion) {
9
12
  return config.entryAdminTitle
10
- ? getAtPath(entry.draftVersion.data, config.entryAdminTitle)?.[language] || entry.id
13
+ ? String(draftVersion.data[config.entryAdminTitle] || entry.id)
11
14
  : entry.id;
12
15
  }
13
16
  return entry.id;
14
17
  }
15
18
  export function getCollectionEntryLabel(entry, config) {
16
19
  return config.entryAdminTitle
17
- ? getAtPath(entry.data, config.entryAdminTitle) || entry.id
18
- : entry.id;
20
+ ? getAtPath(entry, config.entryAdminTitle) || entry._id
21
+ : entry._id;
19
22
  }
@@ -13,7 +13,6 @@ function isFieldFilled(value, fieldType) {
13
13
  return false;
14
14
  switch (fieldType) {
15
15
  case 'text':
16
- case 'richtext':
17
16
  return typeof value === 'string' && value.length > 0;
18
17
  case 'content': {
19
18
  if (typeof value !== 'object')
@@ -46,7 +45,7 @@ function collectLocalizedFields(fields) {
46
45
  if (field.localized === false)
47
46
  continue;
48
47
  const label = extractLabel(field.label, field.slug);
49
- if (field.type === 'text' || field.type === 'richtext' || field.type === 'content') {
48
+ if (field.type === 'text' || field.type === 'content') {
50
49
  result.push({ slug: field.slug, label, type: field.type, required: !!field.required });
51
50
  }
52
51
  }
@@ -50,6 +50,16 @@ export * from 'includio-cms/admin/remote';
50
50
  </script>
51
51
 
52
52
  <AcceptInvitePage />
53
+ `
54
+ },
55
+ {
56
+ path: 'admin/reset-password/+page.svelte',
57
+ content: `${GENERATED_COMMENT}
58
+ <script lang="ts">
59
+ import { ResetPasswordPage } from 'includio-cms/admin/client';
60
+ </script>
61
+
62
+ <ResetPasswordPage />
53
63
  `
54
64
  },
55
65
  {
@@ -109,13 +119,25 @@ export * from 'includio-cms/admin/remote';
109
119
  `
110
120
  },
111
121
  {
112
- path: 'admin/(afterLogin)/form-submissions/[submissionId]/+page.svelte',
122
+ path: 'admin/(afterLogin)/form-submissions/[id]/+page.server.ts',
123
+ content: `${GENERATED_COMMENT_TS}
124
+ export async function load({ params }) {
125
+ return {
126
+ submissionId: params.id
127
+ };
128
+ }
129
+ `
130
+ },
131
+ {
132
+ path: 'admin/(afterLogin)/form-submissions/[id]/+page.svelte',
113
133
  content: `${GENERATED_COMMENT}
114
134
  <script lang="ts">
115
135
  import { FormSubmissionPage } from 'includio-cms/admin/client';
136
+
137
+ let { data } = $props();
116
138
  </script>
117
139
 
118
- <FormSubmissionPage />
140
+ <FormSubmissionPage {data} />
119
141
  `
120
142
  },
121
143
  {
@@ -138,6 +160,16 @@ export * from 'includio-cms/admin/remote';
138
160
  </script>
139
161
 
140
162
  <AccountPage />
163
+ `
164
+ },
165
+ {
166
+ path: 'admin/(afterLogin)/maintenance/+page.svelte',
167
+ content: `${GENERATED_COMMENT}
168
+ <script lang="ts">
169
+ import { MaintenancePage } from 'includio-cms/admin/client';
170
+ </script>
171
+
172
+ <MaintenancePage />
141
173
  `
142
174
  },
143
175
  {
@@ -1,20 +1,24 @@
1
1
  import type { SingleEntryMap, SingleSlug, CollectionEntryMap, CollectionSlug, FormEntryMap, SiteLanguage } from './types';
2
- interface GetEntryQueryOptions<T extends {
3
- data: Record<string, unknown>;
4
- }> {
2
+ interface GetEntryOptions {
5
3
  id?: string;
6
4
  status?: 'draft' | 'published' | 'scheduled' | 'archived';
7
- dataValues?: Partial<T['data']>;
8
- }
9
- interface GetEntryOptions {
10
- /**
11
- * Language code to fetch the entry in. Defaults to the first language in the CMS config.
12
- */
5
+ dataValues?: Record<string, unknown>;
13
6
  language?: SiteLanguage;
14
7
  }
15
- export declare function getSingleEntry<K extends SingleSlug>(slug: K, data: GetEntryQueryOptions<SingleEntryMap[K]>, options: GetEntryOptions): Promise<SingleEntryMap[K] | null>;
16
- export declare function getCollectionEntry<K extends CollectionSlug>(slug: K, data: GetEntryQueryOptions<CollectionEntryMap[K]>, options: GetEntryOptions): Promise<CollectionEntryMap[K] | null>;
17
- export declare function getCollectionEntries<K extends CollectionSlug>(slug: K, options: GetEntryOptions): Promise<CollectionEntryMap[K][]>;
8
+ interface GetEntriesOptions extends GetEntryOptions {
9
+ ids?: string[];
10
+ dataLike?: Record<string, unknown>;
11
+ orderBy?: {
12
+ column: 'createdAt' | 'updatedAt' | 'sortOrder';
13
+ direction: 'asc' | 'desc';
14
+ };
15
+ limit?: number;
16
+ offset?: number;
17
+ }
18
+ export declare function getSingleEntry<K extends SingleSlug>(slug: K, options?: GetEntryOptions): Promise<SingleEntryMap[K] | null>;
19
+ export declare function getCollectionEntry<K extends CollectionSlug>(slug: K, options?: GetEntryOptions): Promise<CollectionEntryMap[K] | null>;
20
+ export declare function getCollectionEntries<K extends CollectionSlug>(slug: K, options?: GetEntriesOptions): Promise<CollectionEntryMap[K][]>;
21
+ export declare function countCollectionEntries<K extends CollectionSlug>(slug: K, options?: Omit<GetEntriesOptions, 'limit' | 'offset' | 'orderBy'>): Promise<number>;
18
22
  export interface SubmitFormOptions {
19
23
  ip?: string;
20
24
  userAgent?: string;
@@ -1,22 +1,23 @@
1
1
  // This file is auto-generated. Do not edit directly.
2
- import { getEntry, getEntries, createFormSubmission } from 'includio-cms/sveltekit/server';
3
- export async function getSingleEntry(slug, data, options) {
2
+ import { getEntry, getEntries, countEntries, createFormSubmission } from 'includio-cms/sveltekit/server';
3
+ export async function getSingleEntry(slug, options = {}) {
4
4
  return (await getEntry({
5
- ...data,
6
5
  slug,
7
6
  ...options
8
7
  }));
9
8
  }
10
- export async function getCollectionEntry(slug, data, options) {
9
+ export async function getCollectionEntry(slug, options = {}) {
11
10
  return (await getEntry({
12
- ...data,
13
11
  slug,
14
12
  ...options
15
13
  }));
16
14
  }
17
- export async function getCollectionEntries(slug, options) {
15
+ export async function getCollectionEntries(slug, options = {}) {
18
16
  return (await getEntries({ slug, ...options }));
19
17
  }
18
+ export async function countCollectionEntries(slug, options = {}) {
19
+ return countEntries({ slug, ...options });
20
+ }
20
21
  export async function submitForm(slug, data, options) {
21
22
  return createFormSubmission({ slug, data, ...options });
22
23
  }
@@ -1,7 +1,7 @@
1
1
  // This file is auto-generated. Do not edit directly.
2
2
  import { command } from '$app/server';
3
3
  import { submitForm } from './api';
4
- import { contactFormSchema } from './schemas';
5
- export const submitContactCommand = command(contactFormSchema, async (data) => {
4
+ import { ContactFormSchema } from './schemas';
5
+ export const submitContactCommand = command(ContactFormSchema, async (data) => {
6
6
  await submitForm('contact', data);
7
7
  });
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export declare const contactFormSchema: z.ZodObject<{
2
+ export declare const ContactFormSchema: z.ZodObject<{
3
3
  name: z.ZodString;
4
4
  email: z.ZodString;
5
5
  phone: z.ZodString;
@@ -1,6 +1,6 @@
1
1
  // This file is auto-generated. Do not edit directly.
2
2
  import { z } from 'zod';
3
- export const contactFormSchema = z.object({
3
+ export const ContactFormSchema = z.object({
4
4
  "name": z.string().min(1),
5
5
  "email": z.string().min(1).email(),
6
6
  "phone": z.string(),