@prenta/core 8.17.0 → 8.18.0

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 (85) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +13 -0
  4. package/dist/actions.js.map +1 -1
  5. package/dist/api/route-helpers/forms.d.ts.map +1 -1
  6. package/dist/api/route-helpers/forms.js +16 -1
  7. package/dist/api/route-helpers/forms.js.map +1 -1
  8. package/dist/api/route-helpers/media.d.ts.map +1 -1
  9. package/dist/api/route-helpers/media.js +2 -1
  10. package/dist/api/route-helpers/media.js.map +1 -1
  11. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  12. package/dist/api/routes/ai-authoring.js +6 -1
  13. package/dist/api/routes/ai-authoring.js.map +1 -1
  14. package/dist/api/routes/folders.d.ts.map +1 -1
  15. package/dist/api/routes/folders.js +4 -1
  16. package/dist/api/routes/folders.js.map +1 -1
  17. package/dist/api/routes/forms.d.ts.map +1 -1
  18. package/dist/api/routes/forms.js +37 -5
  19. package/dist/api/routes/forms.js.map +1 -1
  20. package/dist/api/routes/media.d.ts.map +1 -1
  21. package/dist/api/routes/media.js +92 -118
  22. package/dist/api/routes/media.js.map +1 -1
  23. package/dist/api/routes/sections.d.ts.map +1 -1
  24. package/dist/api/routes/sections.js +29 -0
  25. package/dist/api/routes/sections.js.map +1 -1
  26. package/dist/api/validate-body.d.ts +1 -0
  27. package/dist/api/validate-body.d.ts.map +1 -1
  28. package/dist/api/validate-body.js +2 -0
  29. package/dist/api/validate-body.js.map +1 -1
  30. package/dist/config/types.d.ts +8 -0
  31. package/dist/config/types.d.ts.map +1 -1
  32. package/dist/cron/index.d.ts.map +1 -1
  33. package/dist/cron/index.js +42 -0
  34. package/dist/cron/index.js.map +1 -1
  35. package/dist/forms/attribution.d.ts.map +1 -1
  36. package/dist/forms/attribution.js +4 -0
  37. package/dist/forms/attribution.js.map +1 -1
  38. package/dist/forms/entries.d.ts +16 -3
  39. package/dist/forms/entries.d.ts.map +1 -1
  40. package/dist/forms/entries.js +376 -26
  41. package/dist/forms/entries.js.map +1 -1
  42. package/dist/forms/submission.d.ts.map +1 -1
  43. package/dist/forms/submission.js +4 -1
  44. package/dist/forms/submission.js.map +1 -1
  45. package/dist/forms/types.d.ts +40 -0
  46. package/dist/forms/types.d.ts.map +1 -1
  47. package/dist/generated/internal/class.js +1 -1
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/media/library-membership.d.ts +46 -0
  53. package/dist/media/library-membership.d.ts.map +1 -0
  54. package/dist/media/library-membership.js +168 -0
  55. package/dist/media/library-membership.js.map +1 -0
  56. package/dist/media/public-url.d.ts +7 -0
  57. package/dist/media/public-url.d.ts.map +1 -0
  58. package/dist/media/public-url.js +12 -0
  59. package/dist/media/public-url.js.map +1 -0
  60. package/dist/media/reoptimize.d.ts.map +1 -1
  61. package/dist/media/reoptimize.js +3 -18
  62. package/dist/media/reoptimize.js.map +1 -1
  63. package/dist/media/storage-delete.d.ts +8 -0
  64. package/dist/media/storage-delete.d.ts.map +1 -0
  65. package/dist/media/storage-delete.js +41 -0
  66. package/dist/media/storage-delete.js.map +1 -0
  67. package/dist/media/storage-key.d.ts +43 -0
  68. package/dist/media/storage-key.d.ts.map +1 -0
  69. package/dist/media/storage-key.js +52 -0
  70. package/dist/media/storage-key.js.map +1 -0
  71. package/dist/sections/validate.d.ts.map +1 -1
  72. package/dist/sections/validate.js +6 -25
  73. package/dist/sections/validate.js.map +1 -1
  74. package/dist/security/sanitize.d.ts +5 -0
  75. package/dist/security/sanitize.d.ts.map +1 -1
  76. package/dist/security/sanitize.js +109 -0
  77. package/dist/security/sanitize.js.map +1 -1
  78. package/dist/security/upload.d.ts.map +1 -1
  79. package/dist/security/upload.js +19 -3
  80. package/dist/security/upload.js.map +1 -1
  81. package/dist/server-site.d.ts.map +1 -1
  82. package/dist/server-site.js +2 -1
  83. package/dist/server-site.js.map +1 -1
  84. package/package.json +1 -1
  85. package/prisma/schema.prisma +3 -3
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Decide whether a section image is in the media library.
3
+ *
4
+ * The synchronous check only flags obvious static paths. External URLs need a
5
+ * lookup (`libraryWarningsForSection`) because library files are also https.
6
+ * `enforceLibrary: 'block'` turns those findings into a publish error.
7
+ */
8
+ import type { PrentaCMSConfig } from '../config/types.js';
9
+ import type { CollectionDefinition } from '../config/types.js';
10
+ export type LibraryEnforcement = 'warn' | 'block';
11
+ export type MediaPlacement = 'empty' | 'library' | 'static' | 'external' | 'unchecked';
12
+ export interface KnownMedia {
13
+ urls: ReadonlySet<string>;
14
+ ids: ReadonlySet<string>;
15
+ }
16
+ export interface MediaSlot {
17
+ field: string;
18
+ value: string;
19
+ }
20
+ export interface LibraryFinding {
21
+ field: string;
22
+ placement: 'static' | 'external';
23
+ message: string;
24
+ }
25
+ export declare function resolveLibraryEnforcement(config: Pick<PrentaCMSConfig, 'media'> | null | undefined): LibraryEnforcement;
26
+ /** Obvious on-disk paths. `/media/…` is the local library and is not static. */
27
+ export declare function isStaticAssetPath(url: string): boolean;
28
+ export declare function classifyMediaReference(value: string, known?: KnownMedia): MediaPlacement;
29
+ /** Alt field that belongs next to a media field in the same field list. */
30
+ export declare function companionAltKey(mediaKey: string, fields: ReadonlyArray<{
31
+ key: string;
32
+ }>): string | undefined;
33
+ export declare function collectSectionMediaSlots(sectionType: string, content: Record<string, unknown> | null | undefined): MediaSlot[];
34
+ export declare function findingsForSlots(slots: MediaSlot[], known?: KnownMedia): LibraryFinding[];
35
+ export declare function libraryWarningsForSection(db: unknown, sectionType: string, content: Record<string, unknown> | null | undefined): Promise<LibraryFinding[]>;
36
+ /**
37
+ * On publish, `block` refuses off-library images. `warn` (the default) records
38
+ * them and does not stop the publish.
39
+ */
40
+ export declare function enforceLibraryOnPublish(params: {
41
+ db: unknown;
42
+ collectionDef: CollectionDefinition | null | undefined;
43
+ data: Record<string, unknown>;
44
+ config: Pick<PrentaCMSConfig, 'media'> | null | undefined;
45
+ }): Promise<string[]>;
46
+ //# sourceMappingURL=library-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-membership.d.ts","sourceRoot":"","sources":["../../src/media/library-membership.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAK9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAA;AACjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;AAEtF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACzB,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB;AAOD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACxD,kBAAkB,CAEpB;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,CAQxF;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GACrC,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,SAAS,EAAE,CA8Bb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,EAAE,CAWzF;AAyBD,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,OAAO,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,OAAO,CAAC,cAAc,EAAE,CAAC,CA0B3B;AAkBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,EAAE,EAAE,OAAO,CAAA;IACX,aAAa,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAAA;IACtD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,CAAA;CAC1D,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBpB"}
@@ -0,0 +1,168 @@
1
+ import { getSectionType } from '../sections/registry.js';
2
+ import { resolveRepeaterField, visibleFields } from '../sections/fields.js';
3
+ import { isGatedContentCollection } from '../validation/publish.js';
4
+ const STATIC_MESSAGE = 'Image is a static path, not a media library file. Upload it, then use the returned URL.';
5
+ const EXTERNAL_MESSAGE = 'Image is hosted outside the media library. Import it so optimization, alt text, and usage tracking apply.';
6
+ export function resolveLibraryEnforcement(config) {
7
+ return config?.media?.enforceLibrary === 'block' ? 'block' : 'warn';
8
+ }
9
+ /** Obvious on-disk paths. `/media/…` is the local library and is not static. */
10
+ export function isStaticAssetPath(url) {
11
+ const u = url.trim();
12
+ if (!u)
13
+ return false;
14
+ if (u.startsWith('./') || u.startsWith('../'))
15
+ return true;
16
+ if (u.includes('/public/') || u.includes('/_next/static/'))
17
+ return true;
18
+ if (/^\/(?:images?|img|assets|static|uploads)\//i.test(u))
19
+ return true;
20
+ if (u.startsWith('/') && !u.startsWith('/api/') && !u.startsWith('/media/'))
21
+ return true;
22
+ return false;
23
+ }
24
+ export function classifyMediaReference(value, known) {
25
+ const u = value.trim();
26
+ if (!u)
27
+ return 'empty';
28
+ if (known && (known.ids.has(u) || known.urls.has(u)))
29
+ return 'library';
30
+ if (isStaticAssetPath(u))
31
+ return 'static';
32
+ if (u.startsWith('/media/'))
33
+ return known ? 'static' : 'unchecked';
34
+ if (/^https?:\/\//i.test(u))
35
+ return known ? 'external' : 'unchecked';
36
+ return 'unchecked';
37
+ }
38
+ /** Alt field that belongs next to a media field in the same field list. */
39
+ export function companionAltKey(mediaKey, fields) {
40
+ const candidates = new Set(['alt', 'imageAlt', mediaKey.replace(/Url$/, 'Alt'), `${mediaKey}Alt`]);
41
+ return fields.find((field) => field.key !== mediaKey && candidates.has(field.key))?.key;
42
+ }
43
+ export function collectSectionMediaSlots(sectionType, content) {
44
+ const def = getSectionType(sectionType);
45
+ if (!def)
46
+ return [];
47
+ const data = content ?? {};
48
+ const slots = [];
49
+ for (const field of visibleFields(def.fields, data)) {
50
+ const repeater = resolveRepeaterField(field);
51
+ if (repeater) {
52
+ const rawRows = data[field.key];
53
+ const rows = Array.isArray(rawRows) ? rawRows : [];
54
+ const mediaFields = repeater.fields.filter((sub) => sub.type === 'media');
55
+ rows.forEach((raw, index) => {
56
+ if (!raw || typeof raw !== 'object')
57
+ return;
58
+ const row = raw;
59
+ for (const mediaField of mediaFields) {
60
+ const value = row[mediaField.key];
61
+ if (typeof value === 'string' && value.trim()) {
62
+ slots.push({ field: `${field.key}[${index}].${mediaField.key}`, value: value.trim() });
63
+ }
64
+ }
65
+ });
66
+ continue;
67
+ }
68
+ if (field.type !== 'media')
69
+ continue;
70
+ const value = data[field.key];
71
+ if (typeof value === 'string' && value.trim()) {
72
+ slots.push({ field: field.key, value: value.trim() });
73
+ }
74
+ }
75
+ return slots;
76
+ }
77
+ export function findingsForSlots(slots, known) {
78
+ const findings = [];
79
+ for (const slot of slots) {
80
+ const placement = classifyMediaReference(slot.value, known);
81
+ if (placement === 'static') {
82
+ findings.push({ field: slot.field, placement, message: STATIC_MESSAGE });
83
+ }
84
+ else if (placement === 'external') {
85
+ findings.push({ field: slot.field, placement, message: EXTERNAL_MESSAGE });
86
+ }
87
+ }
88
+ return findings;
89
+ }
90
+ function mediaLookup(db) {
91
+ if (!db || typeof db !== 'object' || !('media' in db))
92
+ return undefined;
93
+ const media = db.media;
94
+ if (!media || typeof media.findMany !== 'function')
95
+ return undefined;
96
+ return media;
97
+ }
98
+ export async function libraryWarningsForSection(db, sectionType, content) {
99
+ const slots = collectSectionMediaSlots(sectionType, content);
100
+ const media = mediaLookup(db);
101
+ if (slots.length === 0 || !media)
102
+ return findingsForSlots(slots);
103
+ const values = [...new Set(slots.map((slot) => slot.value))];
104
+ let rows = [];
105
+ try {
106
+ rows = await media.findMany({
107
+ where: {
108
+ deletedAt: null,
109
+ OR: [{ publicUrl: { in: values } }, { storageKey: { in: values } }, { id: { in: values } }],
110
+ },
111
+ select: { id: true, publicUrl: true, storageKey: true },
112
+ });
113
+ }
114
+ catch {
115
+ return findingsForSlots(slots);
116
+ }
117
+ const urls = new Set();
118
+ const ids = new Set();
119
+ for (const row of rows) {
120
+ ids.add(row.id);
121
+ if (row.publicUrl)
122
+ urls.add(row.publicUrl);
123
+ if (row.storageKey && /^https?:\/\//i.test(row.storageKey))
124
+ urls.add(row.storageKey);
125
+ if (row.storageKey?.startsWith('/'))
126
+ urls.add(row.storageKey);
127
+ }
128
+ return findingsForSlots(slots, { urls, ids });
129
+ }
130
+ function sectionList(data) {
131
+ if (!Array.isArray(data.sections))
132
+ return [];
133
+ return data.sections.flatMap((raw) => {
134
+ if (!raw || typeof raw !== 'object')
135
+ return [];
136
+ const section = raw;
137
+ if (typeof section.sectionType !== 'string')
138
+ return [];
139
+ const content = section.content && typeof section.content === 'object'
140
+ ? section.content
141
+ : {};
142
+ return [{ sectionType: section.sectionType, content }];
143
+ });
144
+ }
145
+ /**
146
+ * On publish, `block` refuses off-library images. `warn` (the default) records
147
+ * them and does not stop the publish.
148
+ */
149
+ export async function enforceLibraryOnPublish(params) {
150
+ if (!isGatedContentCollection(params.collectionDef))
151
+ return [];
152
+ const mode = resolveLibraryEnforcement(params.config);
153
+ const messages = [];
154
+ for (const section of sectionList(params.data)) {
155
+ const findings = await libraryWarningsForSection(params.db, section.sectionType, section.content);
156
+ for (const finding of findings) {
157
+ messages.push(`${section.sectionType}: ${finding.message}`);
158
+ }
159
+ }
160
+ if (messages.length > 0 && mode === 'block') {
161
+ throw new Error(`Cannot publish — ${messages.join(' ')}`);
162
+ }
163
+ if (messages.length > 0 && mode === 'warn' && process.env.NODE_ENV !== 'test') {
164
+ console.warn('[prenta] off-library images:', messages.join(' '));
165
+ }
166
+ return messages;
167
+ }
168
+ //# sourceMappingURL=library-membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-membership.js","sourceRoot":"","sources":["../../src/media/library-membership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** The URL a browser can fetch. Object keys are not URLs. */
2
+ export declare function resolveMediaPublicUrl(row: {
3
+ publicUrl?: string | null;
4
+ storageKey?: string | null;
5
+ url?: string | null;
6
+ }): string;
7
+ //# sourceMappingURL=public-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-url.d.ts","sourceRoot":"","sources":["../../src/media/public-url.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB,GAAG,MAAM,CAQT"}
@@ -0,0 +1,12 @@
1
+ /** The URL a browser can fetch. Object keys are not URLs. */
2
+ export function resolveMediaPublicUrl(row) {
3
+ for (const value of [row.publicUrl, row.storageKey, row.url]) {
4
+ if (typeof value !== 'string' || !value)
5
+ continue;
6
+ if (value.startsWith('http://') || value.startsWith('https://') || value.startsWith('/')) {
7
+ return value;
8
+ }
9
+ }
10
+ return '';
11
+ }
12
+ //# sourceMappingURL=public-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-url.js","sourceRoot":"","sources":["../../src/media/public-url.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CAAC,GAIrC;IACC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,SAAQ;QACjD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reoptimize.d.ts","sourceRoot":"","sources":["../../src/media/reoptimize.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAiBjD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,SAA0D;CAI9E;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAEtC,OAAO,SAAiH;CAK3H;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,KAAK,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;AAExE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,EAAE;QACZ,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,OAAO,EAAE,MAAM,CAAA;QACf,cAAc,EAAE,MAAM,CAAA;QACtB,YAAY,EAAE,MAAM,CAAA;QACpB,qBAAqB,EAAE,MAAM,CAAA;QAC7B,sBAAsB,EAAE,MAAM,CAAA;KAC/B,CAAA;CACF;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AA+BD,oFAAoF;AACpF,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC,GAC7C,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAqID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAkH3B;AAWD,+DAA+D;AAC/D,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAqE1C"}
1
+ {"version":3,"file":"reoptimize.d.ts","sourceRoot":"","sources":["../../src/media/reoptimize.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAkBjD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,SAA0D;CAI9E;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAEtC,OAAO,SAAiH;CAK3H;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,KAAK,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;AAExE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,EAAE;QACZ,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,OAAO,EAAE,MAAM,CAAA;QACf,cAAc,EAAE,MAAM,CAAA;QACtB,YAAY,EAAE,MAAM,CAAA;QACpB,qBAAqB,EAAE,MAAM,CAAA;QAC7B,sBAAsB,EAAE,MAAM,CAAA;KAC/B,CAAA;CACF;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AA+BD,oFAAoF;AACpF,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC,GAC7C,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAuHD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAkH3B;AAWD,+DAA+D;AAC/D,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAqE1C"}
@@ -14,6 +14,7 @@
14
14
  import { createLogger } from '../diagnostics/logger.js';
15
15
  import { safeFetch } from '../security/safe-fetch.js';
16
16
  import { validateWebhookUrl } from '../security/webhook.js';
17
+ import { deleteStoredMediaBytes } from './storage-delete.js';
17
18
  import { getStorageAdapter } from '../storage/index.js';
18
19
  import { hashMediaContent } from './content-hash.js';
19
20
  import { formatBytes, generateBlurPlaceholder, getImageMetadata, optimizeImage, } from './optimize.js';
@@ -126,23 +127,7 @@ async function storeMediaBytes(key, buffer, mimeType) {
126
127
  }
127
128
  }
128
129
  async function deleteStoredBytes(key) {
129
- const storage = getStorageAdapter();
130
- if (storage) {
131
- try {
132
- await storage.delete(key);
133
- }
134
- catch {
135
- /* best-effort */
136
- }
137
- return;
138
- }
139
- try {
140
- const blob = await importBlobStorage();
141
- await blob.del(key);
142
- }
143
- catch {
144
- /* best-effort */
145
- }
130
+ await deleteStoredMediaBytes(key);
146
131
  }
147
132
  function summary(originalSize, optimizedSize, originalFormat, outputFormat, extra = {}) {
148
133
  const savings = originalSize > 0 ? Math.max(0, Math.round((1 - optimizedSize / originalSize) * 100)) : 0;
@@ -275,7 +260,7 @@ export async function reoptimizeMedia(db, media, options = {}) {
275
260
  where: { id: media.id },
276
261
  data: {
277
262
  filename: result.filename,
278
- storageKey: newUrl,
263
+ storageKey: newKey,
279
264
  publicUrl: newUrl,
280
265
  mimeType: result.mimeType,
281
266
  fileSize: result.optimizedSize,
@@ -1 +1 @@
1
- {"version":3,"file":"reoptimize.js","sourceRoot":"","sources":["../../src/media/reoptimize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reoptimize.js","sourceRoot":"","sources":["../../src/media/reoptimize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE/D,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAA;AAE5C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAA;AAEhE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,GAAG,uDAAuD;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAO,GAAG,8GAA8G;QAExH,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAyCD,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAChD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAG,MAAwC;IAC7D,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxF,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,iBAAiB;IAQ9B,MAAM,GAAG,GAAG,UAAU,GAAG,MAAM,CAAA;IAC/B,OAAO,MAAM,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;AAC7F,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA8C;IAE9C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACzC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAAE,SAAQ;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBACpC,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,KAAK;gBAChB,eAAe,EAAE,IAAI;aACtB,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,SAAQ;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;YACvD,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,gBAAgB,EAAE,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,QAAgB;IAC1E,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,+CAA+C,EAAE;gBACzD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAA;YACF,MAAM,IAAI,eAAe,EAAE,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;YACzC,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,GAAG,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE;YACrD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;QACF,MAAM,IAAI,eAAe,EAAE,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,OAAO,CACd,YAAoB,EACpB,aAAqB,EACrB,cAAsB,EACtB,YAAoB,EACpB,QAAmD,EAAE;IAErD,MAAM,OAAO,GACX,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1F,OAAO;QACL,YAAY;QACZ,aAAa;QACb,OAAO;QACP,cAAc;QACd,YAAY;QACZ,qBAAqB,EAAE,WAAW,CAAC,YAAY,CAAC;QAChD,sBAAsB,EAAE,WAAW,CAAC,aAAa,CAAC;QAClD,GAAG,KAAK;KACT,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmD,EACnD,IAAiF;IAEjF,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACzD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC5D,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAClE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,EAAY,EACZ,KAAY,EACZ,IAAiF;IAEjF,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QACrB,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;QACvB,IAAI,EAAE;YACJ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD;KACF,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,EAAY,EACZ,KAAY,EACZ,KAAa;IAEb,IAAI,IAAkD,CAAA;IACtD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAC1B,GAAG,YAAY,KAAK;YAClB,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,+EAA+E,CACpF,CAAA;IACH,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,kBAAkB,CAC1B,qHAAqH,CACtH,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAA;IACzE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE;QAC/C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,QAAQ,IAAI,IAAI;KAC3B,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAA;IAC/B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACtC,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;YACxF,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,KAAK;SACd,CAAC;KACH,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAY,EACZ,KAAY,EACZ,UAAmC,EAAE;IAErC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK;YACL,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACpF,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,WAAW;gBACnB,gBAAgB,EAAE,IAAI;aACvB,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEpF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,qCAAqC;IACrC,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClD,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,KAAK;gBACL,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;oBACxF,gBAAgB,EAAE,IAAI;iBACvB,CAAC;aACH,CAAA;QACH,CAAC;QACD,OAAO,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,MAAiD,CAAA;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,+DAA+D,EAAE;YACxE,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;QACF,IAAI,CAAC;YACH,OAAO,MAAM,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAC1B,mGAAmG,CACpG,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;QACtE,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,CAAA;QAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAA;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5E,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,2BAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACrD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;SAC9B,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YACvB,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,MAAM;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,aAAa;gBAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;gBACtC,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;aAC7C;SACF,CAAC,CAAA;QACF,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAE/B,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,OAAO;YACd,YAAY,EAAE,OAAO,CACnB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,aAAa,EACpB,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,QAAQ,CAChB;SACF,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE;QAC/C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;KAClC,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAA;IAC/B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACtC,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,OAAO,CACnB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,aAAa,EACpB,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,QAAQ,EACf;YACE,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,KAAK;SACd,CACF;KACF,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CACjB,KAAmD,EACnD,qBAA8B;IAE9B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IACtD,IAAI,CAAC,qBAAqB;QAAE,OAAO,IAAI,CAAA;IACvC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;AACtC,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAY,EACZ,UAA4C,EAAE;IAE9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,KAAK,CAAA;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,MAAM,MAAM,GAAoC;QAC9C,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,EAAE;KACX,CAAA;IAED,IAAI,MAA0B,CAAA;IAC9B,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;YACpC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;YAC1B,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;YACtB,IAAI,EAAE,SAAS;YACf,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAK;QAC7B,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAA;QAEpC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,OAAO,EAAE,CAAA;gBAChB,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,SAAS,EAAE,CAAA;gBAClB,SAAQ;YACV,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC7D,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;oBACvB,KAAK,WAAW;wBACd,MAAM,CAAC,SAAS,EAAE,CAAA;wBAClB,MAAK;oBACP,KAAK,QAAQ;wBACX,MAAM,CAAC,MAAM,EAAE,CAAA;wBACf,MAAK;oBACP,KAAK,WAAW;wBACd,MAAM,CAAC,SAAS,EAAE,CAAA;wBAClB,MAAK;oBACP,KAAK,SAAS;wBACZ,MAAM,CAAC,OAAO,EAAE,CAAA;wBAChB,MAAK;oBACP,OAAO,CAAC,CAAC,CAAC;wBACR,MAAM,MAAM,GAAU,OAAO,CAAC,MAAM,CAAA;wBACpC,KAAK,MAAM,CAAA;oBACb,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,EAAE,CAAA;gBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBAC1D,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS;YAAE,MAAK;IACrC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Remove stored bytes for an object key. Legacy rows still hold a public URL
3
+ * in `storageKey`; those are passed through so existing re-optimize deletes
4
+ * keep working. Failures are logged. Trash does not call this — the cleanup
5
+ * purge does, once usage tracking covers every reference.
6
+ */
7
+ export declare function deleteStoredMediaBytes(key: string): Promise<void>;
8
+ //# sourceMappingURL=storage-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-delete.d.ts","sourceRoot":"","sources":["../../src/media/storage-delete.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBvE"}
@@ -0,0 +1,41 @@
1
+ import { createLogger } from '../diagnostics/logger.js';
2
+ import { getStorageAdapter } from '../storage/index.js';
3
+ async function importBlobStorage() {
4
+ const mod = '@vercel/' + 'blob';
5
+ return import(/* webpackIgnore: true */ /* turbopackIgnore: true */ /* @vite-ignore */ mod);
6
+ }
7
+ const log = createLogger('media');
8
+ /**
9
+ * Remove stored bytes for an object key. Legacy rows still hold a public URL
10
+ * in `storageKey`; those are passed through so existing re-optimize deletes
11
+ * keep working. Failures are logged. Trash does not call this — the cleanup
12
+ * purge does, once usage tracking covers every reference.
13
+ */
14
+ export async function deleteStoredMediaBytes(key) {
15
+ if (!key)
16
+ return;
17
+ const storage = getStorageAdapter();
18
+ if (storage) {
19
+ try {
20
+ await storage.delete(key);
21
+ }
22
+ catch (err) {
23
+ log.warn('Storage delete failed', {
24
+ key,
25
+ error: err instanceof Error ? err.message : String(err),
26
+ });
27
+ }
28
+ return;
29
+ }
30
+ try {
31
+ const blob = await importBlobStorage();
32
+ await blob.del(key);
33
+ }
34
+ catch (err) {
35
+ log.warn('Blob delete failed', {
36
+ key,
37
+ error: err instanceof Error ? err.message : String(err),
38
+ });
39
+ }
40
+ }
41
+ //# sourceMappingURL=storage-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-delete.js","sourceRoot":"","sources":["../../src/media/storage-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,UAAU,iBAAiB;IAC9B,MAAM,GAAG,GAAG,UAAU,GAAG,MAAM,CAAA;IAC/B,OAAO,MAAM,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;AAC7F,CAAC;AAED,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;AAEjC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAW;IACtD,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBAChC,GAAG;gBACH,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAA;QACJ,CAAC;QACD,OAAM;IACR,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACtC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC7B,GAAG;YACH,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `storageKey` is the object key (`prenta/media/<ts>-<name>`). Older rows
3
+ * stored the public URL there. `publicUrl` is always the URL browsers fetch.
4
+ */
5
+ export declare function storageObjectKeyFromPublicUrl(url: string): string | null;
6
+ export interface StorageKeyBackfillDb {
7
+ media: {
8
+ findMany: (args: {
9
+ where: {
10
+ storageKey: {
11
+ startsWith: string;
12
+ };
13
+ };
14
+ select: {
15
+ id: true;
16
+ storageKey: true;
17
+ publicUrl: true;
18
+ };
19
+ }) => Promise<Array<{
20
+ id: string;
21
+ storageKey: string;
22
+ publicUrl: string | null;
23
+ }>>;
24
+ update: (args: {
25
+ where: {
26
+ id: string;
27
+ };
28
+ data: {
29
+ storageKey: string;
30
+ publicUrl: string;
31
+ };
32
+ }) => Promise<unknown>;
33
+ };
34
+ }
35
+ export interface StorageKeyBackfillResult {
36
+ updated: number;
37
+ skipped: number;
38
+ }
39
+ /** Point legacy rows at the object key hidden in their public URL. */
40
+ export declare function backfillMediaStorageKeys(db: StorageKeyBackfillDb, options?: {
41
+ dryRun?: boolean;
42
+ }): Promise<StorageKeyBackfillResult>;
43
+ //# sourceMappingURL=storage-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-key.d.ts","sourceRoot":"","sources":["../../src/media/storage-key.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBxE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE;YACf,KAAK,EAAE;gBAAE,UAAU,EAAE;oBAAE,UAAU,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,CAAA;YAC7C,MAAM,EAAE;gBAAE,EAAE,EAAE,IAAI,CAAC;gBAAC,UAAU,EAAE,IAAI,CAAC;gBAAC,SAAS,EAAE,IAAI,CAAA;aAAE,CAAA;SACxD,KAAK,OAAO,CAAC,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC,CAAA;QAClF,MAAM,EAAE,CAAC,IAAI,EAAE;YACb,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;YACrB,IAAI,EAAE;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAA;aAAE,CAAA;SAChD,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KACvB,CAAA;CACF;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,sEAAsE;AACtE,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,oBAAoB,EACxB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAsBnC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `storageKey` is the object key (`prenta/media/<ts>-<name>`). Older rows
3
+ * stored the public URL there. `publicUrl` is always the URL browsers fetch.
4
+ */
5
+ export function storageObjectKeyFromPublicUrl(url) {
6
+ let pathname;
7
+ try {
8
+ pathname = new URL(url).pathname;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ const marker = 'prenta/media/';
14
+ const idx = pathname.indexOf(marker);
15
+ if (idx < 0)
16
+ return null;
17
+ let key;
18
+ try {
19
+ key = decodeURIComponent(pathname.slice(idx));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ if (key.includes('..') || key.includes('\\') || key.includes('\0'))
25
+ return null;
26
+ return key;
27
+ }
28
+ /** Point legacy rows at the object key hidden in their public URL. */
29
+ export async function backfillMediaStorageKeys(db, options) {
30
+ const rows = await db.media.findMany({
31
+ where: { storageKey: { startsWith: 'http' } },
32
+ select: { id: true, storageKey: true, publicUrl: true },
33
+ });
34
+ let updated = 0;
35
+ let skipped = 0;
36
+ for (const row of rows) {
37
+ const key = storageObjectKeyFromPublicUrl(row.storageKey);
38
+ if (!key || key === row.storageKey) {
39
+ skipped++;
40
+ continue;
41
+ }
42
+ if (!options?.dryRun) {
43
+ await db.media.update({
44
+ where: { id: row.id },
45
+ data: { storageKey: key, publicUrl: row.publicUrl ?? row.storageKey },
46
+ });
47
+ }
48
+ updated++;
49
+ }
50
+ return { updated, skipped };
51
+ }
52
+ //# sourceMappingURL=storage-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-key.js","sourceRoot":"","sources":["../../src/media/storage-key.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACvD,IAAI,QAAgB,CAAA;IACpB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAA;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/E,OAAO,GAAG,CAAA;AACZ,CAAC;AAoBD,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAwB,EACxB,OAA8B;IAE9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;KACxD,CAAC,CAAA;IACF,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACzD,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC;YACnC,OAAO,EAAE,CAAA;YACT,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;gBACpB,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;gBACrB,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE;aACtE,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/sections/validate.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AA2B1E;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,eAAe,GAC1B,uBAAuB,CAgIzB"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/sections/validate.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAe1E;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,eAAe,GAC1B,uBAAuB,CA2HzB"}
@@ -12,6 +12,7 @@
12
12
  * required.`) so callers can prepend their own context (`${sectionName}:
13
13
  * ...`) without double-labelling.
14
14
  */
15
+ import { collectSectionMediaSlots, companionAltKey, findingsForSlots, } from '../media/library-membership.js';
15
16
  import { getSectionType } from './registry.js';
16
17
  import { resolveRepeaterField, visibleFields } from './fields.js';
17
18
  import { parseEmbed, parseEmbedIframe } from './embed.js';
@@ -20,22 +21,6 @@ const URL_OK = /^(https?:\/\/|\/|#|mailto:|tel:)/i;
20
21
  function isBlank(v) {
21
22
  return v === undefined || v === null || (typeof v === 'string' && v.trim() === '');
22
23
  }
23
- /** Heuristic: URLs that look like static /public assets rather than library uploads. */
24
- function isLikelyOutsideMediaLibrary(url) {
25
- const u = url.trim();
26
- if (!u)
27
- return false;
28
- if (u.startsWith('./') || u.startsWith('../'))
29
- return true;
30
- if (u.includes('/public/') || u.includes('/_next/static/'))
31
- return true;
32
- if (/^\/(?:images?|img|assets|static|media|uploads)\//i.test(u))
33
- return true;
34
- // Root-relative paths (e.g. `/hero.jpg`) skip CMS blob/CDN delivery.
35
- if (u.startsWith('/') && !u.startsWith('/api/'))
36
- return true;
37
- return false;
38
- }
39
24
  /** Label/URL field pairs: the URL must be valid when its label is filled in. */
40
25
  const BUTTON_PAIRS = [
41
26
  ['primaryButtonLabel', 'primaryButtonUrl'],
@@ -97,12 +82,8 @@ export function validateSectionContent(sectionType, content, _settings) {
97
82
  message: 'image needs alt text for accessibility.',
98
83
  });
99
84
  }
100
- if (!isBlank(data.imageUrl) && isLikelyOutsideMediaLibrary(String(data.imageUrl))) {
101
- warnings.push({
102
- sectionType,
103
- field: 'imageUrl',
104
- message: 'Image URL does not appear to be from the media library. Upload the asset via Media or upload_media, then reference its URL so alt text, optimization, and usage tracking apply.',
105
- });
85
+ for (const finding of findingsForSlots(collectSectionMediaSlots(sectionType, data))) {
86
+ warnings.push({ sectionType, field: finding.field, message: finding.message });
106
87
  }
107
88
  // Embed/video: whichever source is chosen must resolve, so an arbitrary URL
108
89
  // can never be rendered inside an <iframe>. Each source is reported against
@@ -173,7 +154,7 @@ export function validateSectionContent(sectionType, content, _settings) {
173
154
  function validateRepeater(sectionType, key, repeater, value, errors, warnings) {
174
155
  const rows = Array.isArray(value) ? value : [];
175
156
  const mediaField = repeater.fields.find((f) => f.type === 'media');
176
- const altField = repeater.fields.find((f) => f.key === 'alt');
157
+ const altKey = mediaField ? companionAltKey(mediaField.key, repeater.fields) : undefined;
177
158
  rows.forEach((raw, i) => {
178
159
  if (!raw || typeof raw !== 'object')
179
160
  return;
@@ -188,10 +169,10 @@ function validateRepeater(sectionType, key, repeater, value, errors, warnings) {
188
169
  }
189
170
  }
190
171
  // An image row with a set image but no alt text is an accessibility gap.
191
- if (mediaField && altField && !isBlank(row[mediaField.key]) && isBlank(row[altField.key])) {
172
+ if (mediaField && altKey && !isBlank(row[mediaField.key]) && isBlank(row[altKey])) {
192
173
  warnings.push({
193
174
  sectionType,
194
- field: `${key}[${i}].${altField.key}`,
175
+ field: `${key}[${i}].${altKey}`,
195
176
  message: `${repeater.rowLabel} ${i + 1} is missing alt text for accessibility.`,
196
177
  });
197
178
  }