includio-cms 0.5.7 → 0.6.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.
- package/CHANGELOG.md +49 -0
- package/ROADMAP.md +20 -4
- package/dist/admin/api/handler.js +2 -0
- package/dist/admin/api/media-gc.d.ts +3 -0
- package/dist/admin/api/media-gc.js +27 -0
- package/dist/admin/client/collection/collection-entries.svelte +43 -1
- package/dist/admin/client/collection/table-toolbar.svelte +64 -1
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -0
- package/dist/admin/client/index.d.ts +1 -0
- package/dist/admin/client/index.js +1 -0
- package/dist/admin/client/maintenance/maintenance-page.svelte +205 -0
- package/dist/admin/client/maintenance/maintenance-page.svelte.d.ts +3 -0
- package/dist/admin/components/fields/field-renderer.svelte +3 -2
- package/dist/admin/components/fields/field-renderer.svelte.d.ts +1 -0
- package/dist/admin/components/fields/object-field.svelte +5 -5
- package/dist/admin/components/fields/object-field.svelte.d.ts +1 -1
- package/dist/admin/components/fields/text-field-wrapper.svelte +5 -3
- package/dist/admin/components/layout/lang.d.ts +1 -0
- package/dist/admin/components/layout/lang.js +4 -2
- package/dist/admin/components/layout/layout-renderer.svelte +81 -107
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
- package/dist/admin/components/layout/nav-main.svelte +6 -0
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +13 -6
- package/dist/admin/components/tiptap/content-editor.svelte +11 -2
- package/dist/admin/styles/admin.css +2 -1
- package/dist/ai-claude/index.js +10 -4
- package/dist/cli/index.js +10 -3
- package/dist/cli/install-peers.d.ts +3 -0
- package/dist/cli/install-peers.js +52 -0
- package/dist/core/fields/fieldSchemaToTs.js +2 -0
- package/dist/core/fields/layoutUtils.d.ts +30 -3
- package/dist/core/fields/layoutUtils.js +145 -17
- package/dist/core/server/generator/generator.js +21 -10
- package/dist/core/server/media/operations/purgeImageStyles.d.ts +7 -0
- package/dist/core/server/media/operations/purgeImageStyles.js +25 -0
- package/dist/core/server/media/operations/reconcileMedia.d.ts +12 -0
- package/dist/core/server/media/operations/reconcileMedia.js +62 -0
- package/dist/core/server/media/styles/operations/createMediaStyle.js +12 -1
- package/dist/db-postgres/index.js +25 -12
- package/dist/db-postgres/schema/imageStyle.js +2 -0
- package/dist/entity/index.d.ts +26 -0
- package/dist/entity/index.js +113 -0
- package/dist/files-local/index.js +11 -1
- package/dist/types/adapters/db.d.ts +8 -0
- package/dist/types/adapters/files.d.ts +2 -0
- package/dist/types/layout.d.ts +8 -0
- package/dist/updates/0.5.8/index.d.ts +2 -0
- package/dist/updates/0.5.8/index.js +27 -0
- package/dist/updates/0.6.0/index.d.ts +2 -0
- package/dist/updates/0.6.0/index.js +20 -0
- package/dist/updates/index.js +3 -1
- package/package.json +48 -14
|
@@ -32,6 +32,8 @@ export interface DatabaseAdapter {
|
|
|
32
32
|
getImageStyle: GetImageStyle;
|
|
33
33
|
createImageStyle: CreateImageStyle;
|
|
34
34
|
deleteImageStylesByMediaFileId: DeleteImageStylesByMediaFileId;
|
|
35
|
+
getAllImageStyles: GetAllImageStyles;
|
|
36
|
+
deleteAllImageStyles: DeleteAllImageStyles;
|
|
35
37
|
getMediaFiles: GetMediaFiles;
|
|
36
38
|
getMediaFile: GetMediaFile;
|
|
37
39
|
updateMediaFile: UpdateMediaFile;
|
|
@@ -118,4 +120,10 @@ export type CreateImageStyle = (mediaFileId: string, file: UploadedMediaFile, st
|
|
|
118
120
|
export type DeleteImageStylesByMediaFileId = (mediaFileId: string) => Promise<{
|
|
119
121
|
url: string;
|
|
120
122
|
}[]>;
|
|
123
|
+
export type GetAllImageStyles = () => Promise<{
|
|
124
|
+
id: string;
|
|
125
|
+
url: string;
|
|
126
|
+
mediaFileId: string;
|
|
127
|
+
}[]>;
|
|
128
|
+
export type DeleteAllImageStyles = () => Promise<number>;
|
|
121
129
|
export type GetImageStyle = (mediaFileId: string, style: ImageFieldStyle) => Promise<ImageStyle | null>;
|
|
@@ -4,6 +4,7 @@ export interface FilesAdapter {
|
|
|
4
4
|
uploadFile: UploadFile;
|
|
5
5
|
renameFile: RenameFile;
|
|
6
6
|
deleteFile: DeleteFile;
|
|
7
|
+
listFiles: ListFiles;
|
|
7
8
|
}
|
|
8
9
|
export type DownloadFile = (id: string) => Promise<File | null>;
|
|
9
10
|
export type UploadFile = (file: File) => Promise<UploadedMediaFile>;
|
|
@@ -16,3 +17,4 @@ export type RenameFile = (url: string, oldName: string, newName: string) => Prom
|
|
|
16
17
|
error: 'name-already-exists';
|
|
17
18
|
}>;
|
|
18
19
|
export type DeleteFile = (filename: string) => Promise<void>;
|
|
20
|
+
export type ListFiles = () => Promise<string[]>;
|
package/dist/types/layout.d.ts
CHANGED
|
@@ -17,6 +17,10 @@ interface LayoutNodeBase {
|
|
|
17
17
|
export interface SectionNode extends LayoutNodeBase {
|
|
18
18
|
type: 'section';
|
|
19
19
|
label: Localized;
|
|
20
|
+
/**
|
|
21
|
+
* Field references — supports top-level slugs and dot-notation for object fields.
|
|
22
|
+
* @example ['title', 'hero.subtitle', 'companyInfo.contact.email']
|
|
23
|
+
*/
|
|
20
24
|
fields?: string[];
|
|
21
25
|
children?: LayoutNode[];
|
|
22
26
|
}
|
|
@@ -28,6 +32,10 @@ export interface ColumnsNode extends LayoutNodeBase {
|
|
|
28
32
|
export interface CardNode extends LayoutNodeBase {
|
|
29
33
|
type: 'card';
|
|
30
34
|
label: Localized;
|
|
35
|
+
/**
|
|
36
|
+
* Field references — supports top-level slugs and dot-notation for object fields.
|
|
37
|
+
* @example ['companyInfo.name', 'companyInfo.motto'] — fields from different objects in one card
|
|
38
|
+
*/
|
|
31
39
|
fields?: string[];
|
|
32
40
|
children?: LayoutNode[];
|
|
33
41
|
autoGrid?: boolean;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const update = {
|
|
2
|
+
version: '0.5.8',
|
|
3
|
+
date: '2026-03-09',
|
|
4
|
+
description: 'Media GC: deduplicate image styles, auto-cleanup, admin maintenance page',
|
|
5
|
+
features: [
|
|
6
|
+
'Image style upsert: replace duplicates instead of creating new files',
|
|
7
|
+
'Auto-cleanup old style files from disk on regeneration',
|
|
8
|
+
'Admin maintenance page: purge styles, reconcile orphaned disk files'
|
|
9
|
+
],
|
|
10
|
+
fixes: [
|
|
11
|
+
'Deduplicate existing image style records (keep newest per unique key)'
|
|
12
|
+
],
|
|
13
|
+
breakingChanges: [],
|
|
14
|
+
sql: `-- Deduplicate: keep newest style (by id) per unique key, delete rest
|
|
15
|
+
DELETE FROM image_styles a
|
|
16
|
+
USING image_styles b
|
|
17
|
+
WHERE a.media_file_id = b.media_file_id
|
|
18
|
+
AND a.name = b.name
|
|
19
|
+
AND COALESCE(a.width, 0) = COALESCE(b.width, 0)
|
|
20
|
+
AND COALESCE(a.height, 0) = COALESCE(b.height, 0)
|
|
21
|
+
AND COALESCE(a.quality, 0) = COALESCE(b.quality, 0)
|
|
22
|
+
AND a.id < b.id;
|
|
23
|
+
|
|
24
|
+
-- Unique index to prevent future duplicates
|
|
25
|
+
CREATE UNIQUE INDEX IF NOT EXISTS image_styles_unique_key
|
|
26
|
+
ON image_styles (media_file_id, name, COALESCE(width, 0), COALESCE(height, 0), COALESCE(quality, 0));`
|
|
27
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const update = {
|
|
2
|
+
version: '0.6.0',
|
|
3
|
+
date: '2026-03-10',
|
|
4
|
+
description: 'Entity module, collection filters, layout dot-notation, peerDeps migration',
|
|
5
|
+
features: [
|
|
6
|
+
'Entity module — programmatic CRUD API for entries (`getEntity`)',
|
|
7
|
+
'CLI `install-peers` command for automatic peer dependency installation',
|
|
8
|
+
'Collection data filters — filter entries by select/radio field values in toolbar',
|
|
9
|
+
'Layout dot-notation — distribute object fields across layout nodes'
|
|
10
|
+
],
|
|
11
|
+
fixes: [
|
|
12
|
+
'AI Claude: lazy client init, no crash without API key',
|
|
13
|
+
'Codegen: quote hyphenated slugs, PascalCase form schemas, improved query types',
|
|
14
|
+
'TipTap: inline block content field lang fix + placeholder UX',
|
|
15
|
+
'Zod schema: skip lang wrapper for non-localized content field'
|
|
16
|
+
],
|
|
17
|
+
breakingChanges: [
|
|
18
|
+
'Runtime dependencies moved to peerDependencies — run `pnpm includio install-peers` after upgrade'
|
|
19
|
+
]
|
|
20
|
+
};
|
package/dist/updates/index.js
CHANGED
|
@@ -19,7 +19,9 @@ import { update as update054 } from './0.5.4/index.js';
|
|
|
19
19
|
import { update as update055 } from './0.5.5/index.js';
|
|
20
20
|
import { update as update056 } from './0.5.6/index.js';
|
|
21
21
|
import { update as update057 } from './0.5.7/index.js';
|
|
22
|
-
|
|
22
|
+
import { update as update058 } from './0.5.8/index.js';
|
|
23
|
+
import { update as update060 } from './0.6.0/index.js';
|
|
24
|
+
export const updates = [update0065, update0066, update0067, update0068, update0069, update010, update011, update012, update013, update014, update015, update020, update022, update050, update051, update052, update053, update054, update055, update056, update057, update058, update060];
|
|
23
25
|
export const getUpdatesFrom = (fromVersion) => {
|
|
24
26
|
const fromParts = fromVersion.split('.').map(Number);
|
|
25
27
|
return updates.filter((update) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "includio-cms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev",
|
|
6
6
|
"build": "vite build && npm run prepack",
|
|
@@ -49,6 +49,10 @@
|
|
|
49
49
|
"types": "./dist/core/index.d.ts",
|
|
50
50
|
"node": "./dist/core/index.js"
|
|
51
51
|
},
|
|
52
|
+
"./entity": {
|
|
53
|
+
"types": "./dist/entity/index.d.ts",
|
|
54
|
+
"node": "./dist/entity/index.js"
|
|
55
|
+
},
|
|
52
56
|
"./types": {
|
|
53
57
|
"types": "./dist/types/index.d.ts",
|
|
54
58
|
"svelte": "./dist/types/index.js",
|
|
@@ -126,10 +130,41 @@
|
|
|
126
130
|
"peerDependencies": {
|
|
127
131
|
"@sveltejs/kit": "^2.48.0",
|
|
128
132
|
"@sveltejs/vite-plugin-svelte": "^6.2.1",
|
|
133
|
+
"better-auth": "^1.3.34",
|
|
134
|
+
"bits-ui": "^2.11.5",
|
|
135
|
+
"drizzle-orm": "^0.40.0",
|
|
136
|
+
"embla-carousel-svelte": "^8.6.0",
|
|
137
|
+
"formsnap": "^2.0.1",
|
|
138
|
+
"paneforge": "^1.0.2",
|
|
139
|
+
"postgres": "^3.4.5",
|
|
140
|
+
"runed": "^0.35.1",
|
|
141
|
+
"sharp": "^0.34.2",
|
|
129
142
|
"svelte": "^5.43.0",
|
|
143
|
+
"svelte-sonner": "^1.0.5",
|
|
144
|
+
"svelte-tiptap": "^3.0.1",
|
|
145
|
+
"sveltekit-superforms": "^2.28.1",
|
|
146
|
+
"tailwind-merge": "^3.3.1",
|
|
147
|
+
"tailwindcss": "^4.1.13",
|
|
130
148
|
"vite": "^7.2.0",
|
|
131
149
|
"zod": "^4.0.0"
|
|
132
150
|
},
|
|
151
|
+
"peerDependenciesMeta": {
|
|
152
|
+
"runed": {
|
|
153
|
+
"optional": true
|
|
154
|
+
},
|
|
155
|
+
"svelte-tiptap": {
|
|
156
|
+
"optional": true
|
|
157
|
+
},
|
|
158
|
+
"paneforge": {
|
|
159
|
+
"optional": true
|
|
160
|
+
},
|
|
161
|
+
"svelte-sonner": {
|
|
162
|
+
"optional": true
|
|
163
|
+
},
|
|
164
|
+
"embla-carousel-svelte": {
|
|
165
|
+
"optional": true
|
|
166
|
+
}
|
|
167
|
+
},
|
|
133
168
|
"devDependencies": {
|
|
134
169
|
"@chromatic-com/storybook": "^5.0.1",
|
|
135
170
|
"@eslint/compat": "^1.2.5",
|
|
@@ -153,6 +188,8 @@
|
|
|
153
188
|
"@types/fluent-ffmpeg": "^2.1.27",
|
|
154
189
|
"@types/node": "^22",
|
|
155
190
|
"@types/nodemailer": "^7.0.4",
|
|
191
|
+
"better-auth": "^1.3.34",
|
|
192
|
+
"bits-ui": "^2.11.5",
|
|
156
193
|
"clsx": "^2.1.1",
|
|
157
194
|
"drizzle-kit": "^0.30.2",
|
|
158
195
|
"drizzle-orm": "^0.40.0",
|
|
@@ -164,22 +201,31 @@
|
|
|
164
201
|
"flexsearch": "^0.8.212",
|
|
165
202
|
"formsnap": "^2.0.1",
|
|
166
203
|
"globals": "^16.0.0",
|
|
204
|
+
"paneforge": "^1.0.2",
|
|
205
|
+
"postgres": "^3.4.5",
|
|
167
206
|
"jsdom": "^26.0.0",
|
|
168
207
|
"mdsvex": "^0.12.3",
|
|
169
208
|
"prettier": "^3.4.2",
|
|
170
209
|
"prettier-plugin-svelte": "^3.3.3",
|
|
171
210
|
"prettier-plugin-tailwindcss": "^0.6.11",
|
|
172
211
|
"publint": "^0.3.2",
|
|
212
|
+
"runed": "^0.35.1",
|
|
173
213
|
"rehype-autolink-headings": "^7.1.0",
|
|
174
214
|
"rehype-slug": "^6.0.0",
|
|
175
215
|
"remark-gfm": "^4.0.1",
|
|
216
|
+
"sharp": "^0.34.2",
|
|
176
217
|
"shiki": "^3.21.0",
|
|
177
218
|
"storybook": "^10.2.10",
|
|
178
219
|
"svelte": "^5.43.6",
|
|
179
220
|
"svelte-check": "^4.0.0",
|
|
221
|
+
"svelte-sonner": "^1.0.5",
|
|
222
|
+
"svelte-tiptap": "^3.0.1",
|
|
223
|
+
"sveltekit-superforms": "^2.28.1",
|
|
180
224
|
"ts-morph": "^26.0.0",
|
|
181
225
|
"tsx": "^4.20.3",
|
|
182
226
|
"typescript": "^5.0.0",
|
|
227
|
+
"tailwind-merge": "^3.3.1",
|
|
228
|
+
"tailwindcss": "^4.1.13",
|
|
183
229
|
"typescript-eslint": "^8.20.0",
|
|
184
230
|
"vite": "^7.2.2",
|
|
185
231
|
"vitest": "^3.2.3"
|
|
@@ -215,8 +261,6 @@
|
|
|
215
261
|
"@tiptap/starter-kit": "^3.17.1",
|
|
216
262
|
"@tiptap/suggestion": "^3.17.1",
|
|
217
263
|
"arctic": "^3.7.0",
|
|
218
|
-
"better-auth": "^1.3.34",
|
|
219
|
-
"bits-ui": "^2.11.5",
|
|
220
264
|
"dotenv": "^16.5.0",
|
|
221
265
|
"fast-glob": "^3.3.3",
|
|
222
266
|
"fluent-ffmpeg": "^2.1.3",
|
|
@@ -224,24 +268,14 @@
|
|
|
224
268
|
"lowlight": "^3.3.0",
|
|
225
269
|
"nodemailer": "^7.0.11",
|
|
226
270
|
"openai": "^6.9.0",
|
|
227
|
-
"paneforge": "^1.0.2",
|
|
228
271
|
"path-to-regexp": "^8.2.0",
|
|
229
|
-
"postgres": "^3.4.5",
|
|
230
272
|
"readline": "^1.3.0",
|
|
231
|
-
"runed": "^0.35.1",
|
|
232
|
-
"sharp": "^0.34.2",
|
|
233
273
|
"slugify": "^1.6.6",
|
|
234
|
-
"svelte-sonner": "^1.0.5",
|
|
235
|
-
"svelte-tiptap": "^3.0.1",
|
|
236
274
|
"sveltekit-flash-message": "^2.4.6",
|
|
237
|
-
"sveltekit-superforms": "^2.28.1",
|
|
238
|
-
"tailwind-merge": "^3.3.1",
|
|
239
275
|
"tailwind-variants": "^3.1.1",
|
|
240
|
-
"tailwindcss": "^4.1.13",
|
|
241
276
|
"tippy.js": "^6.3.7",
|
|
242
277
|
"tw-animate-css": "^1.3.4",
|
|
243
|
-
"uuid": "^11.1.0"
|
|
244
|
-
"zod": "^4.0.0"
|
|
278
|
+
"uuid": "^11.1.0"
|
|
245
279
|
},
|
|
246
280
|
"pnpm": {
|
|
247
281
|
"onlyBuiltDependencies": [
|