nextjs-cms 0.9.41 → 0.9.42

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 (51) hide show
  1. package/dist/api/actions/pages.d.ts +4 -3
  2. package/dist/api/actions/pages.d.ts.map +1 -1
  3. package/dist/api/actions/pages.js +11 -4
  4. package/dist/api/trpc/root.d.ts +4 -3
  5. package/dist/api/trpc/root.d.ts.map +1 -1
  6. package/dist/api/trpc/routers/config.d.ts.map +1 -1
  7. package/dist/api/trpc/routers/hasItemsSection.d.ts +1 -0
  8. package/dist/api/trpc/routers/hasItemsSection.d.ts.map +1 -1
  9. package/dist/api/trpc/routers/navigation.d.ts +3 -3
  10. package/dist/api/trpc/server.d.ts +12 -9
  11. package/dist/api/trpc/server.d.ts.map +1 -1
  12. package/dist/cli/lib/update-sections.d.ts.map +1 -1
  13. package/dist/cli/lib/update-sections.js +19 -0
  14. package/dist/core/config/config-loader.d.ts +25 -6
  15. package/dist/core/config/config-loader.d.ts.map +1 -1
  16. package/dist/core/config/config-loader.js +9 -13
  17. package/dist/core/fields/photo.d.ts +86 -14
  18. package/dist/core/fields/photo.d.ts.map +1 -1
  19. package/dist/core/fields/photo.js +120 -23
  20. package/dist/core/fields/richText.d.ts +8 -8
  21. package/dist/core/fields/select.d.ts +1 -1
  22. package/dist/core/fields/select.d.ts.map +1 -1
  23. package/dist/core/fields/select.js +18 -2
  24. package/dist/core/fields/selectMultiple.d.ts.map +1 -1
  25. package/dist/core/fields/selectMultiple.js +9 -0
  26. package/dist/core/helpers/index.d.ts +2 -0
  27. package/dist/core/helpers/index.d.ts.map +1 -1
  28. package/dist/core/helpers/index.js +1 -0
  29. package/dist/core/helpers/watermark.d.ts +96 -0
  30. package/dist/core/helpers/watermark.d.ts.map +1 -0
  31. package/dist/core/helpers/watermark.js +61 -0
  32. package/dist/core/sections/category.d.ts +80 -44
  33. package/dist/core/sections/category.d.ts.map +1 -1
  34. package/dist/core/sections/hasItems.d.ts +140 -56
  35. package/dist/core/sections/hasItems.d.ts.map +1 -1
  36. package/dist/core/sections/section.d.ts +63 -26
  37. package/dist/core/sections/section.d.ts.map +1 -1
  38. package/dist/core/sections/section.js +2 -2
  39. package/dist/core/sections/simple.d.ts +44 -8
  40. package/dist/core/sections/simple.d.ts.map +1 -1
  41. package/dist/core/submit/gallery-order.d.ts +34 -0
  42. package/dist/core/submit/gallery-order.d.ts.map +1 -0
  43. package/dist/core/submit/gallery-order.js +50 -0
  44. package/dist/core/submit/submit.d.ts +8 -0
  45. package/dist/core/submit/submit.d.ts.map +1 -1
  46. package/dist/core/submit/submit.js +63 -3
  47. package/dist/core/types/index.d.ts +1 -0
  48. package/dist/core/types/index.d.ts.map +1 -1
  49. package/dist/translations/client.d.ts +4 -4
  50. package/dist/translations/server.d.ts +4 -4
  51. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/core/config/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/core/config/config-loader.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
+ import chalk from 'chalk';
2
+ import * as z from 'zod';
3
+ import { setConfigDicts } from '../../translations/dict-store.js';
4
+ import { watermarkConfigSchema } from '../helpers/index.js';
5
+ import { getConfigImportVersion, loadConfigModule } from './loader.js';
1
6
  if (typeof window !== 'undefined') {
2
7
  throw new Error('This module can only run on the server');
3
8
  }
4
- // import 'server-only'
5
- // import chalk from 'chalk'
6
- import * as z from 'zod';
7
- import { loadConfigModule, getConfigImportVersion } from './loader.js';
8
- import { setConfigDicts } from '../../translations/dict-store.js';
9
- import chalk from 'chalk';
10
9
  /** Locale codes for which we ship dictionaries in core. */
11
10
  export const AVAILABLE_I18N_LANGUAGES = ['en'];
12
11
  // 1. Define config schema
@@ -135,9 +134,10 @@ const cmsConfigSchema = z.object({
135
134
  })
136
135
  .optional(),
137
136
  /**
138
- * Global images watermark configuration
137
+ * Global images watermark configuration.
138
+ * `false` = off; object = watermark asset + defaults. See core/helpers/watermark.
139
139
  */
140
- watermark: z.boolean().optional(),
140
+ watermark: watermarkConfigSchema.optional(),
141
141
  })
142
142
  .optional(),
143
143
  })
@@ -315,11 +315,7 @@ function isPluginConfigWithOverrides(input) {
315
315
  return typeof input === 'object' && input !== null && 'plugin' in input;
316
316
  }
317
317
  function isPluginDescriptor(input) {
318
- return (typeof input === 'object' &&
319
- input !== null &&
320
- 'package' in input &&
321
- 'title' in input &&
322
- !('plugin' in input));
318
+ return typeof input === 'object' && input !== null && 'package' in input && 'title' in input && !('plugin' in input);
323
319
  }
324
320
  function normalizePluginConfigInputs(plugins) {
325
321
  return plugins?.map((entry) => {
@@ -1,6 +1,8 @@
1
+ import sharp from 'sharp';
2
+ import * as z from 'zod';
3
+ import type { ResolvedWatermark, WatermarkConfig, WatermarkPosition } from '../helpers/index.js';
1
4
  import type { BaseFieldConfig } from './field.js';
2
5
  import { entityKind } from '../helpers/index.js';
3
- import * as z from 'zod';
4
6
  import { FileField } from './fileField.js';
5
7
  declare const sizeSchema: z.ZodUnion<readonly [z.ZodObject<{
6
8
  width: z.ZodNumber;
@@ -29,9 +31,43 @@ declare const sizeSchema: z.ZodUnion<readonly [z.ZodObject<{
29
31
  }, z.core.$strict>>;
30
32
  }, z.core.$strict>], "fit">]>;
31
33
  type SizeConfig = z.infer<typeof sizeSchema>;
34
+ /**
35
+ * Watermark position → sharp gravity. Kept here (server-only) with the rest of the sharp logic;
36
+ * the pure config schema lives in core/helpers/watermark.
37
+ */
38
+ export declare const positionToGravity: Record<WatermarkPosition, string>;
39
+ /**
40
+ * Load and validate a watermark image once, caching by path. Fail-fast: throws a clear
41
+ * error if the file cannot be read or decoded.
42
+ */
43
+ export declare function loadWatermarkSource(imagePath: string): Promise<Buffer>;
44
+ /**
45
+ * Build a sharp composite overlay for a resolved watermark against a base image of `outputWidth`.
46
+ * Resizes the mark to `size * outputWidth`, applies opacity, and (for non-tiled marks with a
47
+ * margin) pads a transparent border so `gravity` insets the mark from the edge/corner.
48
+ */
49
+ export declare function buildOverlay(watermark: ResolvedWatermark, outputWidth: number): Promise<sharp.OverlayOptions>;
32
50
  declare const configSchema: z.ZodObject<{
33
- /** Whether to add watermark to images */
34
- watermark: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
51
+ /** Watermark config: false = off, or a watermark object. See core/helpers/watermark. */
52
+ watermark: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
53
+ imagePath: z.ZodString;
54
+ position: z.ZodOptional<z.ZodEnum<{
55
+ "top-left": "top-left";
56
+ top: "top";
57
+ "top-right": "top-right";
58
+ left: "left";
59
+ center: "center";
60
+ right: "right";
61
+ "bottom-left": "bottom-left";
62
+ bottom: "bottom";
63
+ "bottom-right": "bottom-right";
64
+ }>>;
65
+ size: z.ZodOptional<z.ZodNumber>;
66
+ opacity: z.ZodOptional<z.ZodNumber>;
67
+ margin: z.ZodOptional<z.ZodNumber>;
68
+ tile: z.ZodOptional<z.ZodBoolean>;
69
+ applyToThumbnail: z.ZodOptional<z.ZodBoolean>;
70
+ }, z.core.$strict>]>>;
35
71
  blurPlaceholder: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
36
72
  size: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
37
73
  width: z.ZodNumber;
@@ -104,10 +140,10 @@ declare const configSchema: z.ZodObject<{
104
140
  * @hint 'jpg' is an alias for 'jpeg'
105
141
  */
106
142
  fileType: z.ZodOptional<z.ZodArray<z.ZodEnum<{
107
- webp: "webp";
108
- jpg: "jpg";
109
143
  jpeg: "jpeg";
144
+ jpg: "jpg";
110
145
  png: "png";
146
+ webp: "webp";
111
147
  }>>>;
112
148
  /**
113
149
  * Remove the extension from the file name
@@ -118,7 +154,7 @@ declare const configSchema: z.ZodObject<{
118
154
  type Config = z.infer<typeof configSchema>;
119
155
  export declare class PhotoField extends FileField<'photo', Config> {
120
156
  static readonly [entityKind]: string;
121
- readonly watermark: boolean | null | undefined;
157
+ readonly watermark: WatermarkConfig | undefined;
122
158
  readonly blurPlaceholder: boolean | null | undefined;
123
159
  readonly size: SizeConfig | undefined;
124
160
  readonly maxFileSize: {
@@ -225,8 +261,26 @@ export declare class PhotoField extends FileField<'photo', Config> {
225
261
  }
226
262
  export type PhotoFieldClientConfig = ReturnType<PhotoField['exportForClient']>;
227
263
  declare const optionsSchema: z.ZodObject<{
228
- /** Whether to add watermark to images */
229
- watermark: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
264
+ /** Watermark config: false = off, or a watermark object. See core/helpers/watermark. */
265
+ watermark: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
266
+ imagePath: z.ZodString;
267
+ position: z.ZodOptional<z.ZodEnum<{
268
+ "top-left": "top-left";
269
+ top: "top";
270
+ "top-right": "top-right";
271
+ left: "left";
272
+ center: "center";
273
+ right: "right";
274
+ "bottom-left": "bottom-left";
275
+ bottom: "bottom";
276
+ "bottom-right": "bottom-right";
277
+ }>>;
278
+ size: z.ZodOptional<z.ZodNumber>;
279
+ opacity: z.ZodOptional<z.ZodNumber>;
280
+ margin: z.ZodOptional<z.ZodNumber>;
281
+ tile: z.ZodOptional<z.ZodBoolean>;
282
+ applyToThumbnail: z.ZodOptional<z.ZodBoolean>;
283
+ }, z.core.$strict>]>>;
230
284
  blurPlaceholder: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
231
285
  size: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
232
286
  width: z.ZodNumber;
@@ -299,10 +353,10 @@ declare const optionsSchema: z.ZodObject<{
299
353
  * @hint 'jpg' is an alias for 'jpeg'
300
354
  */
301
355
  fileType: z.ZodOptional<z.ZodArray<z.ZodEnum<{
302
- webp: "webp";
303
- jpg: "jpg";
304
356
  jpeg: "jpeg";
357
+ jpg: "jpg";
305
358
  png: "png";
359
+ webp: "webp";
306
360
  }>>>;
307
361
  /**
308
362
  * Remove the extension from the file name
@@ -321,8 +375,26 @@ declare const optionsSchema: z.ZodObject<{
321
375
  declare const photoFieldConfigSchema: z.ZodObject<{
322
376
  type: z.ZodLiteral<"photo">;
323
377
  build: z.ZodFunction<z.core.$ZodFunctionArgs, z.ZodCustom<PhotoField, PhotoField>>;
324
- /** Whether to add watermark to images */
325
- watermark: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
378
+ /** Watermark config: false = off, or a watermark object. See core/helpers/watermark. */
379
+ watermark: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
380
+ imagePath: z.ZodString;
381
+ position: z.ZodOptional<z.ZodEnum<{
382
+ "top-left": "top-left";
383
+ top: "top";
384
+ "top-right": "top-right";
385
+ left: "left";
386
+ center: "center";
387
+ right: "right";
388
+ "bottom-left": "bottom-left";
389
+ bottom: "bottom";
390
+ "bottom-right": "bottom-right";
391
+ }>>;
392
+ size: z.ZodOptional<z.ZodNumber>;
393
+ opacity: z.ZodOptional<z.ZodNumber>;
394
+ margin: z.ZodOptional<z.ZodNumber>;
395
+ tile: z.ZodOptional<z.ZodBoolean>;
396
+ applyToThumbnail: z.ZodOptional<z.ZodBoolean>;
397
+ }, z.core.$strict>]>>;
326
398
  blurPlaceholder: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
327
399
  size: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
328
400
  width: z.ZodNumber;
@@ -395,10 +467,10 @@ declare const photoFieldConfigSchema: z.ZodObject<{
395
467
  * @hint 'jpg' is an alias for 'jpeg'
396
468
  */
397
469
  fileType: z.ZodOptional<z.ZodArray<z.ZodEnum<{
398
- webp: "webp";
399
- jpg: "jpg";
400
470
  jpeg: "jpeg";
471
+ jpg: "jpg";
401
472
  png: "png";
473
+ webp: "webp";
402
474
  }>>>;
403
475
  /**
404
476
  * Remove the extension from the file name
@@ -1 +1 @@
1
- {"version":3,"file":"photo.d.ts","sourceRoot":"","sources":["../../../src/core/fields/photo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"photo.d.ts","sourceRoot":"","sources":["../../../src/core/fields/photo.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAExB,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD,OAAO,EAAE,UAAU,EAA2C,MAAM,qBAAqB,CAAA;AAEzF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AA2C1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;IAPZ;;;OAGG;;;;;;;6BAI0G,CAAA;AAEjH,KAAK,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAkC5C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAU/D,CAAA;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBtE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAkCnH;AAED,QAAA,MAAM,YAAY;IACd,wFAAwF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA/HxF;;;WAGG;;;;;;;;;;;;;;;;;;QAyBC;;;WAGG;;;;;;;;IAqGP;;;;;;;OAOG;;;;;;;;IAEH;;;;;;;OAOG;;;;;;;IAEH;;;OAGG;;kBAEL,CAAA;AAEF,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAE1C,qBAAa,UAAW,SAAQ,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IACtD,gBAAyB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAe;IAC5D,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,eAAe,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAA;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAA;IAC7B,OAAO,CAAC,UAAU,CAAyC;IAC3D,yFAAyF;IACzF,OAAO,CAAC,gBAAgB,CAAyC;IACjE,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IAEjC;;;OAGG;IACH,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,kBAAkB,CAAU;gBAExB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI;IAoCxD;;;;OAIG;YACW,YAAY;IAkBX,KAAK;IAOJ,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAnFD,MAAM;kBAAQ,IAAI,GAAG,IAAI;;;;;;;;;;;;;;IAmGvD;;OAEG;IACG,WAAW;IAqGK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAcnC,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpG;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIX,WAAW,CAAC,KAAK,EAAE,MAAM;IAIvB,QAAQ,CAAC,KAAK,EAAE,GAAG;IAQ5B,OAAO,CAAC,IAAI,EAAE,IAAI;IAKlB,aAAa;IAab;;OAEG;IACG,oBAAoB;CA6J7B;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAE9E,QAAA,MAAM,aAAa;IApdf,wFAAwF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA/HxF;;;WAGG;;;;;;;;;;;;;;;;;;QAyBC;;;WAGG;;;;;;;;IAqGP;;;;;;;OAOG;;;;;;;;IAEH;;;;;;;OAOG;;;;;;;IAEH;;;OAGG;;;;;;;;;;kBA6bL,CAAA;AAEF,QAAA,MAAM,sBAAsB;;;IAzdxB,wFAAwF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA/HxF;;;WAGG;;;;;;;;;;;;;;;;;;QAyBC;;;WAGG;;;;;;;;IAqGP;;;;;;;OAOG;;;;;;;;IAEH;;;;;;;OAOG;;;;;;;IAEH;;;OAGG;;;;;;;;;;kBAmcL,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,gBAAgB,CAmBjF"}
@@ -1,14 +1,14 @@
1
- import { baseFieldConfigSchema } from './field.js';
2
- import { entityKind } from '../helpers/index.js';
3
- import * as z from 'zod';
4
- import sharp from 'sharp';
5
- import path from 'path';
6
1
  import fs from 'fs';
2
+ import path from 'path';
7
3
  import { customAlphabet } from 'nanoid';
8
- import { FileField } from './fileField.js';
4
+ import sharp from 'sharp';
5
+ import * as z from 'zod';
6
+ import getString from '../../translations/index.js';
9
7
  import { humanReadableFileSize } from '../../utils/index.js';
10
8
  import { getCMSConfig } from '../config/index.js';
11
- import getString from '../../translations/index.js';
9
+ import { entityKind, resolveWatermark, watermarkConfigSchema } from '../helpers/index.js';
10
+ import { baseFieldConfigSchema } from './field.js';
11
+ import { FileField } from './fileField.js';
12
12
  const backgroundSchema = z
13
13
  .strictObject({
14
14
  r: z.number().min(0).max(255).describe('Red channel (0-255)'),
@@ -75,9 +75,85 @@ const maxFileSizeSchema = z.strictObject({
75
75
  size: z.number().describe('Maximum file size'),
76
76
  unit: z.enum(['kb', 'mb']).describe('Size unit'),
77
77
  });
78
+ /**
79
+ * Watermark position → sharp gravity. Kept here (server-only) with the rest of the sharp logic;
80
+ * the pure config schema lives in core/helpers/watermark.
81
+ */
82
+ export const positionToGravity = {
83
+ 'top-left': 'northwest',
84
+ top: 'north',
85
+ 'top-right': 'northeast',
86
+ left: 'west',
87
+ center: 'centre',
88
+ right: 'east',
89
+ 'bottom-left': 'southwest',
90
+ bottom: 'south',
91
+ 'bottom-right': 'southeast',
92
+ };
93
+ /** Cache of validated watermark source buffers, keyed by resolved absolute path. */
94
+ const watermarkSourceCache = new Map();
95
+ /**
96
+ * Load and validate a watermark image once, caching by path. Fail-fast: throws a clear
97
+ * error if the file cannot be read or decoded.
98
+ */
99
+ export function loadWatermarkSource(imagePath) {
100
+ const resolved = path.isAbsolute(imagePath) ? imagePath : path.join(process.cwd(), imagePath);
101
+ let cached = watermarkSourceCache.get(resolved);
102
+ if (!cached) {
103
+ cached = (async () => {
104
+ try {
105
+ const buffer = await fs.promises.readFile(resolved);
106
+ await sharp(buffer).metadata();
107
+ return buffer;
108
+ }
109
+ catch (error) {
110
+ watermarkSourceCache.delete(resolved);
111
+ throw new Error(`Watermark image could not be loaded: ${resolved} (${error.message})`);
112
+ }
113
+ })();
114
+ watermarkSourceCache.set(resolved, cached);
115
+ }
116
+ return cached;
117
+ }
118
+ /**
119
+ * Build a sharp composite overlay for a resolved watermark against a base image of `outputWidth`.
120
+ * Resizes the mark to `size * outputWidth`, applies opacity, and (for non-tiled marks with a
121
+ * margin) pads a transparent border so `gravity` insets the mark from the edge/corner.
122
+ */
123
+ export async function buildOverlay(watermark, outputWidth) {
124
+ const source = await loadWatermarkSource(watermark.imagePath);
125
+ const targetWidth = Math.max(1, Math.round(watermark.size * outputWidth));
126
+ let overlay = sharp(source).resize({ width: targetWidth });
127
+ // Apply opacity via the dest-in alpha trick: multiply the mark's alpha by `opacity`.
128
+ if (watermark.opacity < 1) {
129
+ overlay = overlay.ensureAlpha().composite([
130
+ {
131
+ input: Buffer.from([255, 255, 255, Math.round(watermark.opacity * 255)]),
132
+ raw: { width: 1, height: 1, channels: 4 },
133
+ tile: true,
134
+ blend: 'dest-in',
135
+ },
136
+ ]);
137
+ }
138
+ // Inset from edge/corner: pad the mark with a transparent margin, then let gravity place it flush.
139
+ if (!watermark.tile && watermark.margin > 0) {
140
+ overlay = overlay.extend({
141
+ top: watermark.margin,
142
+ bottom: watermark.margin,
143
+ left: watermark.margin,
144
+ right: watermark.margin,
145
+ background: { r: 0, g: 0, b: 0, alpha: 0 },
146
+ });
147
+ }
148
+ return {
149
+ input: await overlay.png().toBuffer(),
150
+ gravity: positionToGravity[watermark.position],
151
+ tile: watermark.tile,
152
+ };
153
+ }
78
154
  const configSchema = z.strictObject({
79
- /** Whether to add watermark to images */
80
- watermark: z.boolean().nullable().optional(),
155
+ /** Watermark config: false = off, or a watermark object. See core/helpers/watermark. */
156
+ watermark: watermarkConfigSchema.optional(),
81
157
  blurPlaceholder: z.boolean().nullable().optional(),
82
158
  size: sizeSchema.optional(),
83
159
  thumbnail: thumbnailSchema.optional(),
@@ -237,45 +313,66 @@ export class PhotoField extends FileField {
237
313
  * - fit: 'contain' -> pad with background to fill dimensions
238
314
  */
239
315
  const cmsImageQuality = cmsConfig.media.images.image.quality ?? 80;
316
+ /**
317
+ * Resolve the watermark once (field overrides gallery-resolved value overrides global).
318
+ * The overlay is sized against the final output width so it scales with the image.
319
+ */
320
+ const resolvedWatermark = resolveWatermark(this.watermark, cmsConfig.media.images.watermark);
321
+ const mainOutputWidth = this.size
322
+ ? this.size.width
323
+ : ((await this._sharpImage.clone().metadata()).width ?? 0);
324
+ const mainOverlay = resolvedWatermark && mainOutputWidth > 0 ? await buildOverlay(resolvedWatermark, mainOutputWidth) : null;
240
325
  if (this.size) {
241
326
  const quality = this.size.quality ?? cmsImageQuality;
242
327
  const outputPath = path.join(uploadsFolder, '.photos', this._folder, this.value);
243
328
  if ('strict' in this.size) {
244
329
  // Strict mode: exact dimensions already validated, just convert to webp
245
- await this._sharpImage.clone().webp({ quality }).toFile(outputPath);
330
+ let pipeline = this._sharpImage.clone();
331
+ if (mainOverlay)
332
+ pipeline = pipeline.composite([mainOverlay]);
333
+ await pipeline.webp({ quality }).toFile(outputPath);
246
334
  }
247
335
  else if (this.size.fit === 'cover') {
248
- await this._sharpImage
336
+ let pipeline = this._sharpImage
249
337
  .clone()
250
- .resize({ width: this.size.width, height: this.size.height, fit: 'cover' })
251
- .webp({ quality })
252
- .toFile(outputPath);
338
+ .resize({ width: this.size.width, height: this.size.height, fit: 'cover' });
339
+ if (mainOverlay)
340
+ pipeline = pipeline.composite([mainOverlay]);
341
+ await pipeline.webp({ quality }).toFile(outputPath);
253
342
  }
254
343
  else {
255
344
  // contain: pad with background
256
345
  const background = this.size.background ?? cmsBackground;
257
- await this._sharpImage
346
+ let pipeline = this._sharpImage
258
347
  .clone()
259
- .resize({ width: this.size.width, height: this.size.height, fit: 'contain', background })
260
- .webp({ quality })
261
- .toFile(outputPath);
348
+ .resize({ width: this.size.width, height: this.size.height, fit: 'contain', background });
349
+ if (mainOverlay)
350
+ pipeline = pipeline.composite([mainOverlay]);
351
+ await pipeline.webp({ quality }).toFile(outputPath);
262
352
  }
263
353
  }
264
354
  else {
265
- await this._sharpImage.clone().toFile(path.join(uploadsFolder, '.photos', this._folder, this.value));
355
+ let pipeline = this._sharpImage.clone();
356
+ if (mainOverlay)
357
+ pipeline = pipeline.composite([mainOverlay]);
358
+ await pipeline.toFile(path.join(uploadsFolder, '.photos', this._folder, this.value));
266
359
  }
267
360
  /**
268
361
  * Write a thumbnail
269
362
  */
270
363
  const thumbBackground = ('background' in thumbnail ? thumbnail.background : undefined) ?? cmsBackground;
271
- await this._sharpImage
272
- .clone()
273
- .resize({
364
+ const thumbOverlay = resolvedWatermark && resolvedWatermark.applyToThumbnail
365
+ ? await buildOverlay(resolvedWatermark, thumbnail.width)
366
+ : null;
367
+ let thumbPipeline = this._sharpImage.clone().resize({
274
368
  width: thumbnail.width,
275
369
  height: thumbnail.height,
276
370
  fit: thumbnail.fit,
277
371
  ...(thumbnail.fit === 'contain' ? { background: thumbBackground } : {}),
278
- })
372
+ });
373
+ if (thumbOverlay)
374
+ thumbPipeline = thumbPipeline.composite([thumbOverlay]);
375
+ await thumbPipeline
279
376
  .webp({
280
377
  quality: thumbnail.quality ?? cmsImageQuality,
281
378
  })
@@ -31,10 +31,10 @@ declare const allowImageUploadsSchema: z.ZodObject<{
31
31
  */
32
32
  omitExtension: z.ZodOptional<z.ZodBoolean>;
33
33
  format: z.ZodOptional<z.ZodEnum<{
34
- webp: "webp";
35
- jpg: "jpg";
36
34
  jpeg: "jpeg";
35
+ jpg: "jpg";
37
36
  png: "png";
37
+ webp: "webp";
38
38
  }>>;
39
39
  }, z.core.$strict>;
40
40
  declare const configSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -73,10 +73,10 @@ declare const configSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
73
73
  */
74
74
  omitExtension: z.ZodOptional<z.ZodBoolean>;
75
75
  format: z.ZodOptional<z.ZodEnum<{
76
- webp: "webp";
77
- jpg: "jpg";
78
76
  jpeg: "jpeg";
77
+ jpg: "jpg";
79
78
  png: "png";
79
+ webp: "webp";
80
80
  }>>;
81
81
  }, z.core.$strict>>;
82
82
  }, z.core.$strict>, z.ZodObject<{
@@ -171,10 +171,10 @@ declare const optionsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
171
171
  */
172
172
  omitExtension: z.ZodOptional<z.ZodBoolean>;
173
173
  format: z.ZodOptional<z.ZodEnum<{
174
- webp: "webp";
175
- jpg: "jpg";
176
174
  jpeg: "jpeg";
175
+ jpg: "jpg";
177
176
  png: "png";
177
+ webp: "webp";
178
178
  }>>;
179
179
  }, z.core.$strict>>;
180
180
  name: z.ZodString;
@@ -237,10 +237,10 @@ declare const richTextFieldConfigSchema: z.ZodIntersection<z.ZodDiscriminatedUni
237
237
  */
238
238
  omitExtension: z.ZodOptional<z.ZodBoolean>;
239
239
  format: z.ZodOptional<z.ZodEnum<{
240
- webp: "webp";
241
- jpg: "jpg";
242
240
  jpeg: "jpeg";
241
+ jpg: "jpg";
243
242
  png: "png";
243
+ webp: "webp";
244
244
  }>>;
245
245
  }, z.core.$strict>>;
246
246
  name: z.ZodString;
@@ -379,8 +379,8 @@ declare const selectFieldConfigSchema: z.ZodIntersection<z.ZodUnion<readonly [z.
379
379
  }, z.core.$strict>]>, z.ZodObject<{
380
380
  type: z.ZodLiteral<"select">;
381
381
  optionsType: z.ZodEnum<{
382
- section: "section";
383
382
  db: "db";
383
+ section: "section";
384
384
  static: "static";
385
385
  }>;
386
386
  build: z.ZodFunction<z.core.$ZodFunctionArgs, z.ZodCustom<SelectField, SelectField>>;
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/core/fields/select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/core/fields/select.ts"],"names":[],"mappings":"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"}
@@ -144,9 +144,14 @@ export class SelectField extends Field {
144
144
  */
145
145
  if (typeof value === 'string' || typeof value === 'number') {
146
146
  /**
147
- * Split the values by comma and set the value as an array of objects
147
+ * Split the values by comma and set the value as an array of objects.
148
+ * Empty segments are dropped — '' is never a valid option value, and
149
+ * an unset select posts exactly that.
148
150
  */
149
- const values = value.toString().split(',');
151
+ const values = value
152
+ .toString()
153
+ .split(',')
154
+ .filter((value) => value !== '');
150
155
  this.value = [];
151
156
  values.map((value) => {
152
157
  if (this.checkValueExists) {
@@ -176,6 +181,17 @@ export class SelectField extends Field {
176
181
  else {
177
182
  this.value = undefined;
178
183
  }
184
+ /**
185
+ * Nothing resolved to a real option — either the select was left empty
186
+ * (`Submit.setFieldValue` hands us `[]` for an untouched select) or
187
+ * `checkValueExists` dropped everything submitted. Represent that as
188
+ * "no value" rather than an empty array: an empty array would join into
189
+ * '' in `getSubmitValue()`, and an INSERT writes that verbatim, which
190
+ * MySQL rejects for int and enum columns.
191
+ */
192
+ if (this.value?.length === 0) {
193
+ this.value = undefined;
194
+ }
179
195
  }
180
196
  hasSqlNameAndValue() {
181
197
  return this.destinationDb === undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"selectMultiple.d.ts","sourceRoot":"","sources":["../../../src/core/fields/selectMultiple.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selectMultiple.d.ts","sourceRoot":"","sources":["../../../src/core/fields/selectMultiple.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAyB,KAAK,EAAE,MAAM,YAAY,CAAA;AAsDzD,QAAA,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAdnB,WAAW,GAAG,UAAU;cACxB,MAAM;gBACJ,MAAM;iBACL,eAAe,GAAG,eAAe;;cAHpC,WAAW,GAAG,UAAU;cACxB,MAAM;gBACJ,MAAM;iBACL,eAAe,GAAG,eAAe;;;;;;;;;;;;;;;oBAepD,CAAA;AAEF,KAAK,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAEhF,qBAAa,mBAAoB,SAAQ,KAAK,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;IACxF,gBAAyB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAwB;IACrE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAA;IACjD,QAAQ,CAAC,EAAE,EAAE;QACT,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,EAAE,MAAM,CAAA;QAClB,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;QAClC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IACa,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;IACjD,SAAkB,aAAa,CAAC,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,EAAE,MAAM,CAAA;QACtB,gBAAgB,EAAE,MAAM,CAAA;KAC3B,CAAA;IACQ,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,CAAY;IAEtD,OAAO,CAAC,eAAe,CAAoB;gBAC/B,MAAM,EAAE,eAAe,CAAC,yBAAyB,CAAC;IAyD9D,MAAM,CAAC,aAAa,IAAI,MAAM;IAId,kBAAkB,IAAI,OAAO;IAI7C;;OAEG;IACH,QAAQ;;;;IAIR;;OAEG;IACM,cAAc,IAAI,MAAM,GAAG,YAAY,EAAE,GAAG,SAAS;IAQ9D;;;;OAIG;IACM,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS;IAyD5D,eAAe;;;;;;;;;;;;;;;;;;IAQT,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsD1D,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxE;;OAEG;IACY,KAAK;YAsBN,YAAY;IAuB1B;;;OAGG;YACW,sBAAsB;IASpC;;;OAGG;YACW,iCAAiC;IAiB/C;;;OAGG;IACH,OAAO,CAAC,aAAa;IAUrB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAYhC,aAAa;IAWb;;OAEG;IACG,oBAAoB;CAkC7B;AAED,MAAM,MAAM,+BAA+B,GAAG,UAAU,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAqBhG,QAAA,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cApczB,WAAW,GAAG,UAAU;cACxB,MAAM;gBACJ,MAAM;iBACL,eAAe,GAAG,eAAe;;cAHpC,WAAW,GAAG,UAAU;cACxB,MAAM;gBACJ,MAAM;iBACL,eAAe,GAAG,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0crD,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAA;AAEjG;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC,yBAAyB,CAAC,GAAG,6BAA6B,CAiBpH"}
@@ -192,6 +192,15 @@ export class SelectMultipleField extends Field {
192
192
  else {
193
193
  this.value = value;
194
194
  }
195
+ /**
196
+ * Nothing resolved to a real option — the field was left empty, or every
197
+ * submitted value was dropped. Represent that as "no value" rather than an
198
+ * empty array: an empty array would join into '' in `getSubmitValue()`, and
199
+ * an INSERT writes that verbatim, which MySQL rejects for int columns.
200
+ */
201
+ if (this.value?.length === 0) {
202
+ this.value = undefined;
203
+ }
195
204
  }
196
205
  exportForClient() {
197
206
  return {
@@ -3,4 +3,6 @@ export { entityKind } from './entity.js';
3
3
  export type { LZEntity } from './entity.js';
4
4
  export { hasOwnEntityKind } from './entity.js';
5
5
  export { evaluateConditionalRule, evaluateConditionalRuleGroup, normalizeConditionalRules } from './conditional-rules.js';
6
+ export { watermarkPositionEnum, watermarkObjectSchema, watermarkConfigSchema, WATERMARK_DEFAULTS, resolveWatermark, } from './watermark.js';
7
+ export type { WatermarkPosition, WatermarkObject, WatermarkConfig, ResolvedWatermark } from './watermark.js';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI9C,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI9C,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AACzH,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -5,3 +5,4 @@ export { hasOwnEntityKind } from './entity.js';
5
5
  // factories that section configs use), so they are intentionally not re-exported here to avoid a
6
6
  // duplicate export when `core/index` merges both barrels.
7
7
  export { evaluateConditionalRule, evaluateConditionalRuleGroup, normalizeConditionalRules } from './conditional-rules.js';
8
+ export { watermarkPositionEnum, watermarkObjectSchema, watermarkConfigSchema, WATERMARK_DEFAULTS, resolveWatermark, } from './watermark.js';