includio-cms 0.14.3 → 0.14.5

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 CHANGED
@@ -3,6 +3,25 @@
3
3
  All notable changes to includio-cms are documented here.
4
4
  Generated from `src/lib/updates/` — do not edit manually.
5
5
 
6
+ ## 0.14.5 — 2026-04-10
7
+
8
+ Schema: unique indexes moved into Drizzle ORM definitions
9
+
10
+ ### Added
11
+ - Image & video style unique indexes now defined in Drizzle schema (single source of truth, no more SQL-only index comments)
12
+
13
+ ### Notes
14
+
15
+ No SQL migration needed — indexes already exist in DB. This only moves definitions from SQL comments into Drizzle ORM schema.
16
+
17
+ ## 0.14.4 — 2026-03-31
18
+
19
+ Improved type generation — select/checkboxes emit union types, fields with defaultValue are non-optional
20
+
21
+ ### Added
22
+ - Type generation: select and checkboxes fields now emit string literal union types instead of generic `string`/`string[]`
23
+ - Type generation: fields with `defaultValue` are now treated as guaranteed (non-optional) in generated TypeScript types
24
+
6
25
  ## 0.14.3 — 2026-03-27
7
26
 
8
27
  Background maintenance system — automatic style generation, poster regeneration, video transcoding, orphan cleanup on configurable schedule
package/DOCS.md CHANGED
@@ -1,4 +1,4 @@
1
- # Includio CMS Documentation (v0.14.3)
1
+ # Includio CMS Documentation (v0.14.5)
2
2
 
3
3
  > This file is auto-generated from the docs site. For the latest version, update the package.
4
4
 
package/ROADMAP.md CHANGED
@@ -276,6 +276,10 @@
276
276
  - [x] `[feature]` `[P2]` Configurable maintenance interval via `media.maintenance` config <!-- files: src/lib/types/cms.ts -->
277
277
  - [x] `[feature]` `[P1]` Maintenance page UI redesign — status banner, sections, SSE handler dedup <!-- files: src/lib/admin/client/maintenance/maintenance-page.svelte -->
278
278
 
279
+ ## 0.14.5 — Schema cleanup
280
+
281
+ - [x] `[chore]` `[P2]` Move image & video style unique indexes into Drizzle ORM schema (single source of truth) <!-- files: src/lib/db-postgres/schema/imageStyle.ts, src/lib/db-postgres/schema/videoStyle.ts -->
282
+
279
283
  ## 0.15.0 — SEO module
280
284
 
281
285
  - [ ] `[feature]` `[P1]` SERP preview + character limits for title/description <!-- files: src/lib/admin/components/fields/seo-field.svelte -->
@@ -300,7 +304,7 @@
300
304
  ## Backlog
301
305
 
302
306
  - [ ] `[feature]` `[P1]` Server-side pagination API (formalize 0.1.0 fix)
303
- - [ ] `[feature]` `[P1]` Improved type generation <!-- files: src/lib/core/server/generator/ -->
307
+ - [x] `[feature]` `[P1]` Improved type generation — union types for select/checkboxes, defaultValue makes fields non-optional <!-- files: src/lib/core/server/generator/ -->
304
308
  - [ ] `[feature]` `[P1]` Proper filtering API (SQL-level, not JS post-query)
305
309
  - [ ] `[feature]` `[P1]` Ban/unban UI — reason + expiry, `banUser`/`unbanUser` <!-- files: src/lib/admin/client/users/ban-user-dialog.svelte -->
306
310
  - [ ] `[feature]` `[P1]` Impersonation UI — impersonate/stop bar <!-- files: src/lib/admin/client/users/impersonation-bar.svelte -->
@@ -44,7 +44,7 @@ export interface BlogPost {
44
44
  slug?: string;
45
45
  cover?: ImageFieldData | VideoFieldData | null;
46
46
  rating: number;
47
- category?: string;
47
+ category?: 'technology' | 'design' | 'business' | 'tutorial';
48
48
  publishedAt?: string;
49
49
  thumbnail?: ImageFieldData | VideoFieldData | null;
50
50
  content?: StructuredContentDoc;
@@ -71,7 +71,7 @@ export interface Project {
71
71
  _url?: string;
72
72
  title: string;
73
73
  description?: string;
74
- status?: string;
74
+ status?: 'active' | 'completed' | 'archived';
75
75
  startDate?: string;
76
76
  url?: {
77
77
  url: string;
@@ -140,12 +140,12 @@ export type FormEntryMap = {
140
140
  };
141
141
  export type CalloutBlockData = {
142
142
  title?: string;
143
- style?: string;
143
+ style?: 'info' | 'warning' | 'success';
144
144
  };
145
145
  export type CtaBlockData = {
146
146
  buttonText?: string;
147
147
  url?: string;
148
- variant?: string;
148
+ variant?: 'primary' | 'secondary' | 'outline';
149
149
  };
150
150
  export type NoteBlockData = {
151
151
  text?: string;
@@ -1,5 +1,8 @@
1
1
  import { toPascalCase } from './utils.js';
2
2
  let _customFields = new Map();
3
+ function isGuaranteed(f) {
4
+ return !!(f.required || f.type === 'seo' || f.defaultValue !== undefined);
5
+ }
3
6
  export function setGeneratorCustomFields(customFields) {
4
7
  _customFields = customFields;
5
8
  }
@@ -27,10 +30,12 @@ function getFieldTypeAsString(field) {
27
30
  const name = toPascalCase(field.collection);
28
31
  return field.multiple ? `${name}[]` : name;
29
32
  }
30
- case 'select':
31
- return field.multiple ? 'string[]' : 'string';
33
+ case 'select': {
34
+ const union = field.options.map((opt) => `'${opt.value.trim()}'`).join(' | ');
35
+ return field.multiple ? `(${union})[]` : union;
36
+ }
32
37
  case 'checkboxes':
33
- return 'string[]';
38
+ return `(${field.options.map((opt) => `'${opt.value.trim()}'`).join(' | ')})[]`;
34
39
  case 'number':
35
40
  return 'number';
36
41
  case 'boolean':
@@ -38,7 +43,7 @@ function getFieldTypeAsString(field) {
38
43
  case 'object':
39
44
  return `{
40
45
  slug: '${field.slug}';
41
- data: {${field.fields.map((f) => ` ${f.slug}${f.required ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')}};
46
+ data: {${field.fields.map((f) => ` ${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')}};
42
47
  }`;
43
48
  case 'blocks':
44
49
  return `
@@ -47,7 +52,7 @@ function getFieldTypeAsString(field) {
47
52
  .map((f) => `
48
53
  {
49
54
  slug: '${f.slug}';
50
- data: {${f.fields.map((f) => ` ${f.slug}${f.required ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')}};
55
+ data: {${f.fields.map((f) => ` ${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')}};
51
56
  }
52
57
  `)
53
58
  .join(' | ')}
@@ -91,12 +96,12 @@ function getFieldTypeAsString(field) {
91
96
  }
92
97
  export function generateTsTypeFromFields(fields) {
93
98
  return `{
94
- ${fields.map((f) => ` ${f.slug}${f.required || f.type === 'seo' ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')};
99
+ ${fields.map((f) => ` ${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFieldTypeAsString(f)}`).join(';\n')};
95
100
  }`;
96
101
  }
97
102
  export function generateFlatTsTypeFromFields(fields) {
98
103
  return `{
99
- ${fields.map((f) => ` ${f.slug}${f.required || f.type === 'seo' ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
104
+ ${fields.map((f) => ` ${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
100
105
  }`;
101
106
  }
102
107
  function getFlatFieldTypeAsString(field) {
@@ -114,7 +119,7 @@ function getFlatFieldTypeAsString(field) {
114
119
  case 'object':
115
120
  return `{
116
121
  _slug: '${field.slug}';
117
- ${field.fields.map((f) => `${f.slug}${f.required ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
122
+ ${field.fields.map((f) => `${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
118
123
  }`;
119
124
  case 'blocks':
120
125
  return `
@@ -123,7 +128,7 @@ function getFlatFieldTypeAsString(field) {
123
128
  .map((f) => `
124
129
  {
125
130
  _slug: '${f.slug}';
126
- ${f.fields.map((f) => `${f.slug}${f.required ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
131
+ ${f.fields.map((f) => `${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
127
132
  }
128
133
  `)
129
134
  .join(' | ')}
@@ -134,6 +139,6 @@ function getFlatFieldTypeAsString(field) {
134
139
  }
135
140
  export function generateInlineBlockTypeString(block) {
136
141
  return `{
137
- ${block.fields.map((f) => ` ${f.slug}${f.required ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
142
+ ${block.fields.map((f) => ` ${f.slug}${isGuaranteed(f) ? '' : '?'}: ${getFlatFieldTypeAsString(f)}`).join(';\n')};
138
143
  }`;
139
144
  }
@@ -1,4 +1,5 @@
1
- import { boolean, integer, pgTable, real, text, uuid } from 'drizzle-orm/pg-core';
1
+ import { boolean, integer, pgTable, real, text, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
2
+ import { sql } from 'drizzle-orm';
2
3
  export const imageStylesTable = pgTable('image_styles', {
3
4
  id: uuid('id').primaryKey().defaultRandom(),
4
5
  mediaFileId: uuid('media_file_id').notNull(),
@@ -11,6 +12,6 @@ export const imageStylesTable = pgTable('image_styles', {
11
12
  media: text('media'),
12
13
  mimeType: text('mime_type').notNull(),
13
14
  aspectRatio: real('aspect_ratio')
14
- });
15
- // NOTE: unique index on (media_file_id, name, COALESCE(width,0), COALESCE(height,0), COALESCE(quality,0))
16
- // is managed via SQL migration in src/lib/updates/0.5.8/index.ts (expression-based, not supported by Drizzle ORM)
15
+ }, (t) => [
16
+ uniqueIndex('image_styles_unique_key').on(t.mediaFileId, t.name, sql `COALESCE(${t.width}, 0)`, sql `COALESCE(${t.height}, 0)`, sql `COALESCE(${t.quality}, 0)`, sql `COALESCE(${t.aspectRatio}, 0)`)
17
+ ]);
@@ -1,4 +1,4 @@
1
- import { integer, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';
1
+ import { integer, pgTable, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
2
2
  export const videoStylesTable = pgTable('video_styles', {
3
3
  id: uuid('id').primaryKey().defaultRandom(),
4
4
  mediaFileId: uuid('media_file_id').notNull(),
@@ -13,6 +13,4 @@ export const videoStylesTable = pgTable('video_styles', {
13
13
  status: text('status').notNull().default('pending'),
14
14
  error: text('error'),
15
15
  createdAt: timestamp('created_at').defaultNow()
16
- });
17
- // NOTE: unique index on (media_file_id, name) is managed via SQL migration
18
- // in src/lib/updates/0.14.0/index.ts
16
+ }, (t) => [uniqueIndex('video_styles_unique_key').on(t.mediaFileId, t.name)]);
@@ -1,36 +1,3 @@
1
- export function hello_world(inputs: {
2
- name: NonNullable<unknown>;
3
- }, options?: {
4
- locale?: "en" | "pl";
5
- }): string;
6
- /**
7
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
8
- *
9
- * - Changing this function will be over-written by the next build.
10
- *
11
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
12
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
13
- *
14
- * @param {{}} inputs
15
- * @param {{ locale?: "en" | "pl" }} options
16
- * @returns {string}
17
- */
18
- declare function login_hello(inputs?: {}, options?: {
19
- locale?: "en" | "pl";
20
- }): string;
21
- /**
22
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
23
- *
24
- * - Changing this function will be over-written by the next build.
25
- *
26
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
27
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
28
- *
29
- * @param {{}} inputs
30
- * @param {{ locale?: "en" | "pl" }} options
31
- * @returns {string}
32
- */
33
- declare function login_please_login(inputs?: {}, options?: {
34
- locale?: "en" | "pl";
35
- }): string;
36
- export { login_hello as login.hello, login_please_login as login.please_login };
1
+ export * from "./hello_world.js";
2
+ export * from "./login_hello.js";
3
+ export * from "./login_please_login.js";
@@ -1,72 +1,4 @@
1
1
  /* eslint-disable */
2
- import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from "../runtime.js"
3
- import * as en from "./en.js"
4
- import * as pl from "./pl.js"
5
- /**
6
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
7
- *
8
- * - Changing this function will be over-written by the next build.
9
- *
10
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
11
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
12
- *
13
- * @param {{ name: NonNullable<unknown> }} inputs
14
- * @param {{ locale?: "en" | "pl" }} options
15
- * @returns {string}
16
- */
17
- /* @__NO_SIDE_EFFECTS__ */
18
- export const hello_world = (inputs, options = {}) => {
19
- if (experimentalMiddlewareLocaleSplitting && isServer === false) {
20
- return /** @type {any} */ (globalThis).__paraglide_ssr.hello_world(inputs)
21
- }
22
- const locale = options.locale ?? getLocale()
23
- trackMessageCall("hello_world", locale)
24
- if (locale === "en") return en.hello_world(inputs)
25
- return pl.hello_world(inputs)
26
- };
27
- /**
28
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
29
- *
30
- * - Changing this function will be over-written by the next build.
31
- *
32
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
33
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
34
- *
35
- * @param {{}} inputs
36
- * @param {{ locale?: "en" | "pl" }} options
37
- * @returns {string}
38
- */
39
- /* @__NO_SIDE_EFFECTS__ */
40
- const login_hello = (inputs = {}, options = {}) => {
41
- if (experimentalMiddlewareLocaleSplitting && isServer === false) {
42
- return /** @type {any} */ (globalThis).__paraglide_ssr.login_hello(inputs)
43
- }
44
- const locale = options.locale ?? getLocale()
45
- trackMessageCall("login_hello", locale)
46
- if (locale === "en") return en.login_hello(inputs)
47
- return pl.login_hello(inputs)
48
- };
49
- export { login_hello as "login.hello" }
50
- /**
51
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
52
- *
53
- * - Changing this function will be over-written by the next build.
54
- *
55
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
56
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
57
- *
58
- * @param {{}} inputs
59
- * @param {{ locale?: "en" | "pl" }} options
60
- * @returns {string}
61
- */
62
- /* @__NO_SIDE_EFFECTS__ */
63
- const login_please_login = (inputs = {}, options = {}) => {
64
- if (experimentalMiddlewareLocaleSplitting && isServer === false) {
65
- return /** @type {any} */ (globalThis).__paraglide_ssr.login_please_login(inputs)
66
- }
67
- const locale = options.locale ?? getLocale()
68
- trackMessageCall("login_please_login", locale)
69
- if (locale === "en") return en.login_please_login(inputs)
70
- return pl.login_please_login(inputs)
71
- };
72
- export { login_please_login as "login.please_login" }
2
+ export * from './hello_world.js'
3
+ export * from './login_hello.js'
4
+ export * from './login_please_login.js'
@@ -0,0 +1,5 @@
1
+ export function hello_world(inputs: {
2
+ name: NonNullable<unknown>;
3
+ }, options?: {
4
+ locale?: "en" | "pl";
5
+ }): string;
@@ -0,0 +1,33 @@
1
+ /* eslint-disable */
2
+ import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from '../runtime.js';
3
+
4
+ const en_hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Hello, ${i.name} from en!`
6
+ };
7
+
8
+ const pl_hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
9
+ return `Hello, ${i.name} from pl!`
10
+ };
11
+
12
+ /**
13
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
14
+ *
15
+ * - Changing this function will be over-written by the next build.
16
+ *
17
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
18
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
19
+ *
20
+ * @param {{ name: NonNullable<unknown> }} inputs
21
+ * @param {{ locale?: "en" | "pl" }} options
22
+ * @returns {string}
23
+ */
24
+ /* @__NO_SIDE_EFFECTS__ */
25
+ export const hello_world = (inputs, options = {}) => {
26
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
27
+ return /** @type {any} */ (globalThis).__paraglide_ssr.hello_world(inputs)
28
+ }
29
+ const locale = options.locale ?? getLocale()
30
+ trackMessageCall("hello_world", locale)
31
+ if (locale === "en") return en_hello_world(inputs)
32
+ return pl_hello_world(inputs)
33
+ };
@@ -0,0 +1,16 @@
1
+ export { login_hello as login.hello };
2
+ /**
3
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
4
+ *
5
+ * - Changing this function will be over-written by the next build.
6
+ *
7
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
8
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
9
+ *
10
+ * @param {{}} inputs
11
+ * @param {{ locale?: "en" | "pl" }} options
12
+ * @returns {string}
13
+ */
14
+ declare function login_hello(inputs?: {}, options?: {
15
+ locale?: "en" | "pl";
16
+ }): string;
@@ -0,0 +1,34 @@
1
+ /* eslint-disable */
2
+ import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from '../runtime.js';
3
+
4
+ const en_login_hello = /** @type {(inputs: {}) => string} */ () => {
5
+ return `Welcome back`
6
+ };
7
+
8
+ const pl_login_hello = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Witaj ponownie`
10
+ };
11
+
12
+ /**
13
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
14
+ *
15
+ * - Changing this function will be over-written by the next build.
16
+ *
17
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
18
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
19
+ *
20
+ * @param {{}} inputs
21
+ * @param {{ locale?: "en" | "pl" }} options
22
+ * @returns {string}
23
+ */
24
+ /* @__NO_SIDE_EFFECTS__ */
25
+ const login_hello = (inputs = {}, options = {}) => {
26
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
27
+ return /** @type {any} */ (globalThis).__paraglide_ssr.login_hello(inputs)
28
+ }
29
+ const locale = options.locale ?? getLocale()
30
+ trackMessageCall("login_hello", locale)
31
+ if (locale === "en") return en_login_hello(inputs)
32
+ return pl_login_hello(inputs)
33
+ };
34
+ export { login_hello as "login.hello" }
@@ -0,0 +1,16 @@
1
+ export { login_please_login as login.please_login };
2
+ /**
3
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
4
+ *
5
+ * - Changing this function will be over-written by the next build.
6
+ *
7
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
8
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
9
+ *
10
+ * @param {{}} inputs
11
+ * @param {{ locale?: "en" | "pl" }} options
12
+ * @returns {string}
13
+ */
14
+ declare function login_please_login(inputs?: {}, options?: {
15
+ locale?: "en" | "pl";
16
+ }): string;
@@ -0,0 +1,34 @@
1
+ /* eslint-disable */
2
+ import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from '../runtime.js';
3
+
4
+ const en_login_please_login = /** @type {(inputs: {}) => string} */ () => {
5
+ return `Login to your account`
6
+ };
7
+
8
+ const pl_login_please_login = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Zaloguj się na swoje konto`
10
+ };
11
+
12
+ /**
13
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
14
+ *
15
+ * - Changing this function will be over-written by the next build.
16
+ *
17
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
18
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
19
+ *
20
+ * @param {{}} inputs
21
+ * @param {{ locale?: "en" | "pl" }} options
22
+ * @returns {string}
23
+ */
24
+ /* @__NO_SIDE_EFFECTS__ */
25
+ const login_please_login = (inputs = {}, options = {}) => {
26
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
27
+ return /** @type {any} */ (globalThis).__paraglide_ssr.login_please_login(inputs)
28
+ }
29
+ const locale = options.locale ?? getLocale()
30
+ trackMessageCall("login_please_login", locale)
31
+ if (locale === "en") return en_login_please_login(inputs)
32
+ return pl_login_please_login(inputs)
33
+ };
34
+ export { login_please_login as "login.please_login" }
@@ -0,0 +1,2 @@
1
+ import type { CmsUpdate } from '../index.js';
2
+ export declare const update: CmsUpdate;
@@ -0,0 +1,11 @@
1
+ export const update = {
2
+ version: '0.14.4',
3
+ date: '2026-03-31',
4
+ description: 'Improved type generation — select/checkboxes emit union types, fields with defaultValue are non-optional',
5
+ features: [
6
+ 'Type generation: select and checkboxes fields now emit string literal union types instead of generic `string`/`string[]`',
7
+ 'Type generation: fields with `defaultValue` are now treated as guaranteed (non-optional) in generated TypeScript types'
8
+ ],
9
+ fixes: [],
10
+ breakingChanges: []
11
+ };
@@ -0,0 +1,2 @@
1
+ import type { CmsUpdate } from '../index.js';
2
+ export declare const update: CmsUpdate;
@@ -0,0 +1,11 @@
1
+ export const update = {
2
+ version: '0.14.5',
3
+ date: '2026-04-10',
4
+ description: 'Schema: unique indexes moved into Drizzle ORM definitions',
5
+ features: [
6
+ 'Image & video style unique indexes now defined in Drizzle schema (single source of truth, no more SQL-only index comments)'
7
+ ],
8
+ fixes: [],
9
+ breakingChanges: [],
10
+ notes: 'No SQL migration needed — indexes already exist in DB. This only moves definitions from SQL comments into Drizzle ORM schema.'
11
+ };
@@ -41,7 +41,9 @@ import { update as update0140 } from './0.14.0/index.js';
41
41
  import { update as update0141 } from './0.14.1/index.js';
42
42
  import { update as update0142 } from './0.14.2/index.js';
43
43
  import { update as update0143 } from './0.14.3/index.js';
44
- 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, update061, update062, update070, update071, update072, update073, update080, update090, update0100, update0110, update0120, update0130, update0131, update0132, update0133, update0134, update0140, update0141, update0142, update0143];
44
+ import { update as update0144 } from './0.14.4/index.js';
45
+ import { update as update0145 } from './0.14.5/index.js';
46
+ 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, update061, update062, update070, update071, update072, update073, update080, update090, update0100, update0110, update0120, update0130, update0131, update0132, update0133, update0134, update0140, update0141, update0142, update0143, update0144, update0145];
45
47
  export const getUpdatesFrom = (fromVersion) => {
46
48
  const fromParts = fromVersion.split('.').map(Number);
47
49
  return updates.filter((update) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "includio-cms",
3
- "version": "0.14.3",
3
+ "version": "0.14.5",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run prepack",
@@ -1,5 +0,0 @@
1
- export const hello_world: (inputs: {
2
- name: NonNullable<unknown>;
3
- }) => string;
4
- export const login_hello: (inputs: {}) => string;
5
- export const login_please_login: (inputs: {}) => string;
@@ -1,14 +0,0 @@
1
- /* eslint-disable */
2
-
3
-
4
- export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
- return `Hello, ${i.name} from en!`
6
- };
7
-
8
- export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
- return `Welcome back`
10
- };
11
-
12
- export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
- return `Login to your account`
14
- };
@@ -1,5 +0,0 @@
1
- export const hello_world: (inputs: {
2
- name: NonNullable<unknown>;
3
- }) => string;
4
- export const login_hello: (inputs: {}) => string;
5
- export const login_please_login: (inputs: {}) => string;
@@ -1,14 +0,0 @@
1
- /* eslint-disable */
2
-
3
-
4
- export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
- return `Hello, ${i.name} from pl!`
6
- };
7
-
8
- export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
- return `Witaj ponownie`
10
- };
11
-
12
- export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
- return `Zaloguj się na swoje konto`
14
- };