@prenta/core 8.13.5 → 8.15.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.
- package/CHANGELOG.md +70 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +22 -5
- package/dist/actions.js.map +1 -1
- package/dist/ai/batch-list.d.ts +37 -6
- package/dist/ai/batch-list.d.ts.map +1 -1
- package/dist/ai/batch-list.js +217 -7
- package/dist/ai/batch-list.js.map +1 -1
- package/dist/ai/feature-defaults.d.ts.map +1 -1
- package/dist/ai/feature-defaults.js +1 -1
- package/dist/ai/feature-defaults.js.map +1 -1
- package/dist/ai/tasks/media-detail-limits.d.ts +5 -0
- package/dist/ai/tasks/media-detail-limits.d.ts.map +1 -0
- package/dist/ai/tasks/media-detail-limits.js +5 -0
- package/dist/ai/tasks/media-detail-limits.js.map +1 -0
- package/dist/ai/tasks/media-details.d.ts +51 -0
- package/dist/ai/tasks/media-details.d.ts.map +1 -0
- package/dist/ai/tasks/media-details.js +117 -0
- package/dist/ai/tasks/media-details.js.map +1 -0
- package/dist/api/route-helpers/auth.d.ts +0 -6
- package/dist/api/route-helpers/auth.d.ts.map +1 -1
- package/dist/api/route-helpers/auth.js +13 -8
- package/dist/api/route-helpers/auth.js.map +1 -1
- package/dist/api/route-helpers/forms.d.ts +2 -2
- package/dist/api/route-helpers/forms.d.ts.map +1 -1
- package/dist/api/route-helpers/forms.js +47 -3
- package/dist/api/route-helpers/forms.js.map +1 -1
- package/dist/api/routes/dashboard.d.ts.map +1 -1
- package/dist/api/routes/dashboard.js +228 -16
- package/dist/api/routes/dashboard.js.map +1 -1
- package/dist/api/routes/forms.d.ts.map +1 -1
- package/dist/api/routes/forms.js +219 -6
- package/dist/api/routes/forms.js.map +1 -1
- package/dist/api/routes/scheduling.d.ts.map +1 -1
- package/dist/api/routes/scheduling.js +8 -1
- package/dist/api/routes/scheduling.js.map +1 -1
- package/dist/api/routes/system.js +2 -2
- package/dist/api/routes/system.js.map +1 -1
- package/dist/forms/attribution-settings.d.ts +2 -0
- package/dist/forms/attribution-settings.d.ts.map +1 -1
- package/dist/forms/attribution-settings.js +28 -22
- package/dist/forms/attribution-settings.js.map +1 -1
- package/dist/forms/attribution.d.ts +10 -1
- package/dist/forms/attribution.d.ts.map +1 -1
- package/dist/forms/attribution.js +26 -2
- package/dist/forms/attribution.js.map +1 -1
- package/dist/forms/client-validation.d.ts +13 -2
- package/dist/forms/client-validation.d.ts.map +1 -1
- package/dist/forms/client-validation.js +29 -10
- package/dist/forms/client-validation.js.map +1 -1
- package/dist/forms/entries.d.ts.map +1 -1
- package/dist/forms/entries.js +3 -1
- package/dist/forms/entries.js.map +1 -1
- package/dist/forms/form-model.d.ts +19 -0
- package/dist/forms/form-model.d.ts.map +1 -1
- package/dist/forms/form-model.js.map +1 -1
- package/dist/forms/index.d.ts +1 -1
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/public-html.d.ts +12 -1
- package/dist/forms/public-html.d.ts.map +1 -1
- package/dist/forms/public-html.js +94 -14
- package/dist/forms/public-html.js.map +1 -1
- package/dist/forms/redirect-url.d.ts +12 -0
- package/dist/forms/redirect-url.d.ts.map +1 -0
- package/dist/forms/redirect-url.js +33 -0
- package/dist/forms/redirect-url.js.map +1 -0
- package/dist/forms/service.d.ts +6 -1
- package/dist/forms/service.d.ts.map +1 -1
- package/dist/forms/service.js +147 -6
- package/dist/forms/service.js.map +1 -1
- package/dist/forms/site-settings.d.ts +77 -0
- package/dist/forms/site-settings.d.ts.map +1 -0
- package/dist/forms/site-settings.js +276 -0
- package/dist/forms/site-settings.js.map +1 -0
- package/dist/forms/submission.d.ts +15 -0
- package/dist/forms/submission.d.ts.map +1 -1
- package/dist/forms/submission.js +32 -5
- package/dist/forms/submission.js.map +1 -1
- package/dist/forms/types.d.ts +30 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/types.js +1 -0
- package/dist/forms/types.js.map +1 -1
- package/dist/forms/validation.d.ts.map +1 -1
- package/dist/forms/validation.js +2 -2
- package/dist/forms/validation.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs/batch-ai.d.ts.map +1 -1
- package/dist/jobs/batch-ai.js +67 -19
- package/dist/jobs/batch-ai.js.map +1 -1
- package/dist/jobs/contract.d.ts +3 -1
- package/dist/jobs/contract.d.ts.map +1 -1
- package/dist/jobs/review.d.ts.map +1 -1
- package/dist/jobs/review.js +49 -5
- package/dist/jobs/review.js.map +1 -1
- package/dist/jobs/serialize.d.ts.map +1 -1
- package/dist/jobs/serialize.js +2 -0
- package/dist/jobs/serialize.js.map +1 -1
- package/dist/media/seo.d.ts +18 -0
- package/dist/media/seo.d.ts.map +1 -1
- package/dist/media/seo.js +24 -0
- package/dist/media/seo.js.map +1 -1
- package/dist/media/used-on-titles.d.ts +8 -0
- package/dist/media/used-on-titles.d.ts.map +1 -0
- package/dist/media/used-on-titles.js +33 -0
- package/dist/media/used-on-titles.js.map +1 -0
- package/dist/security/rate-limit.d.ts +7 -0
- package/dist/security/rate-limit.d.ts.map +1 -1
- package/dist/security/rate-limit.js +20 -4
- package/dist/security/rate-limit.js.map +1 -1
- package/dist/server-site.d.ts.map +1 -1
- package/dist/server-site.js +3 -0
- package/dist/server-site.js.map +1 -1
- package/dist/stats/dashboard.d.ts +66 -0
- package/dist/stats/dashboard.d.ts.map +1 -0
- package/dist/stats/dashboard.js +111 -0
- package/dist/stats/dashboard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard period-report date/series helpers.
|
|
3
|
+
*
|
|
4
|
+
* Date-only values are manipulated at UTC noon so daylight-saving changes in
|
|
5
|
+
* the site's timezone can never shift a calendar day. Instants are bucketed
|
|
6
|
+
* back into calendar dates with Intl in the site's IANA timezone.
|
|
7
|
+
*/
|
|
8
|
+
const DATE_KEY = /^\d{4}-\d{2}-\d{2}$/;
|
|
9
|
+
const DAY_MS = 86_400_000;
|
|
10
|
+
export function isValidTimeZone(timeZone) {
|
|
11
|
+
try {
|
|
12
|
+
new Intl.DateTimeFormat('en-US', { timeZone }).format(new Date());
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function parseDateKey(value) {
|
|
20
|
+
if (!DATE_KEY.test(value))
|
|
21
|
+
return null;
|
|
22
|
+
const parsed = new Date(`${value}T12:00:00.000Z`);
|
|
23
|
+
if (Number.isNaN(parsed.getTime()))
|
|
24
|
+
return null;
|
|
25
|
+
// Reject rolled dates such as 2026-02-30.
|
|
26
|
+
return formatUtcDateKey(parsed) === value ? parsed : null;
|
|
27
|
+
}
|
|
28
|
+
function formatUtcDateKey(date) {
|
|
29
|
+
return date.toISOString().slice(0, 10);
|
|
30
|
+
}
|
|
31
|
+
export function addDateKeyDays(dateKey, days) {
|
|
32
|
+
const date = parseDateKey(dateKey);
|
|
33
|
+
if (!date)
|
|
34
|
+
return dateKey;
|
|
35
|
+
date.setUTCDate(date.getUTCDate() + days);
|
|
36
|
+
return formatUtcDateKey(date);
|
|
37
|
+
}
|
|
38
|
+
export function inclusiveDays(start, end) {
|
|
39
|
+
const a = parseDateKey(start);
|
|
40
|
+
const b = parseDateKey(end);
|
|
41
|
+
if (!a || !b)
|
|
42
|
+
return 0;
|
|
43
|
+
return Math.round((b.getTime() - a.getTime()) / DAY_MS) + 1;
|
|
44
|
+
}
|
|
45
|
+
export function dateKeysBetween(start, end) {
|
|
46
|
+
const days = inclusiveDays(start, end);
|
|
47
|
+
if (days <= 0)
|
|
48
|
+
return [];
|
|
49
|
+
return Array.from({ length: days }, (_, index) => addDateKeyDays(start, index));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Match the prototype's comparisonFor semantics, including JavaScript's
|
|
53
|
+
* Feb 29 -> Mar 1 roll when subtracting a year from a leap-day range.
|
|
54
|
+
*/
|
|
55
|
+
export function comparisonFor(mode, start, end) {
|
|
56
|
+
if (mode === 'none')
|
|
57
|
+
return null;
|
|
58
|
+
if (mode === 'year') {
|
|
59
|
+
const startDate = parseDateKey(start);
|
|
60
|
+
const endDate = parseDateKey(end);
|
|
61
|
+
if (!startDate || !endDate)
|
|
62
|
+
return null;
|
|
63
|
+
startDate.setUTCFullYear(startDate.getUTCFullYear() - 1);
|
|
64
|
+
endDate.setUTCFullYear(endDate.getUTCFullYear() - 1);
|
|
65
|
+
return { start: formatUtcDateKey(startDate), end: formatUtcDateKey(endDate) };
|
|
66
|
+
}
|
|
67
|
+
const days = inclusiveDays(start, end);
|
|
68
|
+
if (days <= 0)
|
|
69
|
+
return null;
|
|
70
|
+
return {
|
|
71
|
+
start: addDateKeyDays(start, -days),
|
|
72
|
+
end: addDateKeyDays(start, -1),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const formatterCache = new Map();
|
|
76
|
+
export function dateKeyInTimeZone(instant, timeZone) {
|
|
77
|
+
let formatter = formatterCache.get(timeZone);
|
|
78
|
+
if (!formatter) {
|
|
79
|
+
formatter = new Intl.DateTimeFormat('en-CA', {
|
|
80
|
+
timeZone,
|
|
81
|
+
year: 'numeric',
|
|
82
|
+
month: '2-digit',
|
|
83
|
+
day: '2-digit',
|
|
84
|
+
});
|
|
85
|
+
formatterCache.set(timeZone, formatter);
|
|
86
|
+
}
|
|
87
|
+
const parts = formatter.formatToParts(instant);
|
|
88
|
+
const year = parts.find((part) => part.type === 'year')?.value;
|
|
89
|
+
const month = parts.find((part) => part.type === 'month')?.value;
|
|
90
|
+
const day = parts.find((part) => part.type === 'day')?.value;
|
|
91
|
+
return `${year}-${month}-${day}`;
|
|
92
|
+
}
|
|
93
|
+
export function buildDailySeries(dates, instants, timeZone) {
|
|
94
|
+
const indexByDate = new Map(dates.map((date, index) => [date, index]));
|
|
95
|
+
const values = new Array(dates.length).fill(0);
|
|
96
|
+
for (const instant of instants) {
|
|
97
|
+
if (!instant)
|
|
98
|
+
continue;
|
|
99
|
+
const date = typeof instant === 'string' ? new Date(instant) : instant;
|
|
100
|
+
if (Number.isNaN(date.getTime()))
|
|
101
|
+
continue;
|
|
102
|
+
const index = indexByDate.get(dateKeyInTimeZone(date, timeZone));
|
|
103
|
+
if (index !== undefined)
|
|
104
|
+
values[index] = (values[index] ?? 0) + 1;
|
|
105
|
+
}
|
|
106
|
+
return dates.map((date, index) => ({ date, v: values[index] ?? 0 }));
|
|
107
|
+
}
|
|
108
|
+
export function totalPoints(points) {
|
|
109
|
+
return points ? points.reduce((sum, point) => sum + point.v, 0) : null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/stats/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH,MAAM,QAAQ,GAAG,qBAAqB,CAAA;AACtC,MAAM,MAAM,GAAG,UAAU,CAAA;AAEzB,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAA;IACjD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,0CAA0C;IAC1C,OAAO,gBAAgB,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAA;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAW;IACtD,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAC7B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,GAAW;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACtC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,IAA0B,EAC1B,KAAa,EACb,GAAW;IAEX,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAChC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACvC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAA;QACpD,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAA;IAC/E,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACtC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1B,OAAO;QACL,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;QACnC,GAAG,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAC/B,CAAA;AACH,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAA;AAE7D,MAAM,UAAU,iBAAiB,CAAC,OAAa,EAAE,QAAgB;IAC/D,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YAC3C,QAAQ;YACR,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;SACf,CAAC,CAAA;QACF,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACzC,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,CAAA;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK,CAAA;IAChE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,KAAK,CAAA;IAC5D,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAe,EACf,QAAiD,EACjD,QAAgB;IAEhB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,SAAQ;QACtB,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QACtE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAE,SAAQ;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChE,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACxE,CAAC"}
|