@prenta/core 7.6.0 → 7.6.4

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 (37) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/actions.d.ts +12 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +33 -0
  5. package/dist/actions.js.map +1 -1
  6. package/dist/api/handler-factory.d.ts.map +1 -1
  7. package/dist/api/handler-factory.js +2 -1
  8. package/dist/api/handler-factory.js.map +1 -1
  9. package/dist/api/openapi.d.ts.map +1 -1
  10. package/dist/api/openapi.js +36 -0
  11. package/dist/api/openapi.js.map +1 -1
  12. package/dist/api/routes/documents.d.ts.map +1 -1
  13. package/dist/api/routes/documents.js +44 -1
  14. package/dist/api/routes/documents.js.map +1 -1
  15. package/dist/api/routes/meta.d.ts +5 -0
  16. package/dist/api/routes/meta.d.ts.map +1 -1
  17. package/dist/api/routes/meta.js +29 -16
  18. package/dist/api/routes/meta.js.map +1 -1
  19. package/dist/api/routes/security-center.d.ts.map +1 -1
  20. package/dist/api/routes/security-center.js +54 -1
  21. package/dist/api/routes/security-center.js.map +1 -1
  22. package/dist/api/security-headers.d.ts +7 -5
  23. package/dist/api/security-headers.d.ts.map +1 -1
  24. package/dist/api/security-headers.js +25 -7
  25. package/dist/api/security-headers.js.map +1 -1
  26. package/dist/security/audit-export.d.ts +42 -0
  27. package/dist/security/audit-export.d.ts.map +1 -0
  28. package/dist/security/audit-export.js +93 -0
  29. package/dist/security/audit-export.js.map +1 -0
  30. package/dist/seo/page-meta.d.ts.map +1 -1
  31. package/dist/seo/page-meta.js +22 -5
  32. package/dist/seo/page-meta.js.map +1 -1
  33. package/dist/seo/title-templates.d.ts +4 -3
  34. package/dist/seo/title-templates.d.ts.map +1 -1
  35. package/dist/seo/title-templates.js +8 -6
  36. package/dist/seo/title-templates.js.map +1 -1
  37. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { listDocuments, getDocument, createDocument, updateDocument, deleteDocument, restoreDocument, duplicateDocument, assertCollectionAccess, } from '../../actions.js';
1
+ import { listDocuments, getDocument, createDocument, updateDocument, deleteDocument, restoreDocument, purgeDocument, duplicateDocument, assertCollectionAccess, } from '../../actions.js';
2
2
  import { logEvent } from '../../security/audit.js';
3
3
  import { PRENTA_TAG_ROOT, prentaTag, cachedRead } from '../../cache/http.js';
4
4
  import { notifyPreviewUpdate } from '../../preview/event-bus.js';
@@ -20,6 +20,24 @@ export function flattenDocumentWriteBody(body) {
20
20
  const { data: _data, ...rest } = body;
21
21
  return { ...nested, ...rest };
22
22
  }
23
+ const PICK_KEY = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
24
+ const PICK_MAX = 32;
25
+ /** Comma-separated `data` keys. Empty means the full document payload. */
26
+ function parseListPick(raw) {
27
+ if (!raw || raw.trim() === '')
28
+ return {};
29
+ const keys = [
30
+ ...new Set(raw
31
+ .split(',')
32
+ .map((part) => part.trim())
33
+ .filter((part) => part.length > 0)),
34
+ ];
35
+ if (keys.length > PICK_MAX)
36
+ return { error: `pick accepts at most ${PICK_MAX} fields` };
37
+ if (keys.some((key) => !PICK_KEY.test(key)))
38
+ return { error: 'pick fields must be identifiers' };
39
+ return { pick: keys };
40
+ }
23
41
  /**
24
42
  * Parse `?filter.<field>=<value>` query params into validated data-field
25
43
  * filters (admin facet filters, taxonomy Phase B). Only fields declared in the
@@ -79,6 +97,9 @@ export function registerDocumentRoutes(router) {
79
97
  build: async () => {
80
98
  const url = new URL(request.url);
81
99
  const ctx = buildActionContext(auth.session, db(), url.searchParams.get('locale') ?? undefined);
100
+ const picked = parseListPick(url.searchParams.get('pick'));
101
+ if (picked.error)
102
+ return errorResponse(picked.error, 400);
82
103
  const result = await listDocuments({
83
104
  collection: params.slug,
84
105
  page: clampPage(url.searchParams.get('page')),
@@ -94,6 +115,7 @@ export function registerDocumentRoutes(router) {
94
115
  includeDeleted: url.searchParams.get('includeDeleted') === 'true',
95
116
  dataFilters: parseDataFilters(url, params.slug),
96
117
  cursor: url.searchParams.get('cursor') ?? undefined,
118
+ pick: picked.pick,
97
119
  }, ctx);
98
120
  // listDocuments already applies field-level read access
99
121
  // (actions.ts). Do not call applyFieldAccess again here.
@@ -251,6 +273,27 @@ export function registerDocumentRoutes(router) {
251
273
  return actionError(err, 'restore document');
252
274
  }
253
275
  });
276
+ router.post('/collections/:slug/:id/purge', async (request, params) => {
277
+ try {
278
+ const auth = await requireAuth(request);
279
+ if (auth.error)
280
+ return auth.error;
281
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'delete');
282
+ if (scopeErr)
283
+ return scopeErr;
284
+ const ctx = buildActionContext(auth.session, db());
285
+ await purgeDocument(params.slug, params.id, ctx);
286
+ await logEvent({
287
+ event: 'document_purged',
288
+ userId: auth.session.userId,
289
+ details: { collection: params.slug, documentId: params.id },
290
+ });
291
+ return json({ data: { success: true } });
292
+ }
293
+ catch (err) {
294
+ return actionError(err, 'purge document');
295
+ }
296
+ });
254
297
  router.post('/collections/:slug/:id/duplicate', async (request, params) => {
255
298
  try {
256
299
  const auth = await requireAuth(request);
@@ -1 +1 @@
1
- {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/api/routes/documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/api/routes/documents.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  import type { ApiRouter } from '../router.js';
2
+ /** API reference page. The inline loader and the CDN script share one CSP nonce. */
3
+ export declare function renderApiReferencePage(): {
4
+ html: string;
5
+ headers: Record<string, string>;
6
+ };
2
7
  export declare function registerMetaRoutes(router: ApiRouter): void;
3
8
  //# sourceMappingURL=meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/api/routes/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAO7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6F1D"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/api/routes/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAQ7C,oFAAoF;AACpF,wBAAgB,sBAAsB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAwB1F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+E1D"}
@@ -1,8 +1,35 @@
1
1
  import { summarizeCollectionFields } from '../collection-introspection.js';
2
2
  import { generateToken as generateCsrfToken } from '../../security/csrf.js';
3
+ import { buildCspHeader, generateCspNonce } from '../../security/csp-nonces.js';
3
4
  import { generateOpenAPISpec } from '../openapi.js';
4
5
  import { getPrentaConfig } from '../../config/runtime.js';
5
6
  import { json, errorResponse } from '../route-helpers.js';
7
+ /** API reference page. The inline loader and the CDN script share one CSP nonce. */
8
+ export function renderApiReferencePage() {
9
+ const nonce = generateCspNonce();
10
+ const html = `<!DOCTYPE html>
11
+ <html>
12
+ <head>
13
+ <title>Prenta CMS API Reference</title>
14
+ <meta charset="utf-8" />
15
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
16
+ </head>
17
+ <body>
18
+ <script nonce="${nonce}" id="api-reference" data-url="/api/cms/openapi.json"></script>
19
+ <script nonce="${nonce}" src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
20
+ </body>
21
+ </html>`;
22
+ return {
23
+ html,
24
+ headers: {
25
+ 'Content-Type': 'text/html; charset=utf-8',
26
+ 'Content-Security-Policy': buildCspHeader(nonce, {
27
+ 'script-src': ["'self'", `'nonce-${nonce}'`, 'https://cdn.jsdelivr.net'],
28
+ 'connect-src': ["'self'"],
29
+ }),
30
+ },
31
+ };
32
+ }
6
33
  export function registerMetaRoutes(router) {
7
34
  // ---------------------------------------------------------------------------
8
35
  // CSRF token endpoint
@@ -76,22 +103,8 @@ export function registerMetaRoutes(router) {
76
103
  return json({ data: collections });
77
104
  });
78
105
  router.get('/docs', async () => {
79
- const html = `<!DOCTYPE html>
80
- <html>
81
- <head>
82
- <title>Prenta CMS API Reference</title>
83
- <meta charset="utf-8" />
84
- <meta name="viewport" content="width=device-width, initial-scale=1" />
85
- </head>
86
- <body>
87
- <script id="api-reference" data-url="/api/cms/openapi.json"></script>
88
- <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
89
- </body>
90
- </html>`;
91
- return new Response(html, {
92
- status: 200,
93
- headers: { 'Content-Type': 'text/html; charset=utf-8' },
94
- });
106
+ const page = renderApiReferencePage();
107
+ return new Response(page.html, { status: 200, headers: page.headers });
95
108
  });
96
109
  }
97
110
  //# sourceMappingURL=meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/api/routes/meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/api/routes/meta.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEzD,oFAAoF;AACpF,MAAM,UAAU,sBAAsB;IACpC,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,MAAM,IAAI,GAAG;;;;;;;;mBAQI,KAAK;mBACL,KAAK;;QAEhB,CAAA;IACN,OAAO;QACL,IAAI;QACJ,OAAO,EAAE;YACP,cAAc,EAAE,0BAA0B;YAC1C,yBAAyB,EAAE,cAAc,CAAC,KAAK,EAAE;gBAC/C,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,0BAA0B,CAAC;gBACxE,aAAa,EAAE,CAAC,QAAQ,CAAC;aAC1B,CAAC;SACH;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,8EAA8E;IAE9E,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACvC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;QAC1D,MAAM,WAAW,GAAG,CAAC,eAAe,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAA;QACxF,IAAI,YAAY;YAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QAC1C,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1D,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,8EAA8E;IAC9E,eAAe;IACf,8EAA8E;IAE9E,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,aAAa,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YACjD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,EAAE;SACpF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,8EAA8E;IAC9E,sCAAsC;IACtC,EAAE;IACF,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,oEAAoE;IACpE,qEAAqE;IACrE,iEAAiE;IACjE,EAAE;IACF,oEAAoE;IACpE,iEAAiE;IACjE,8EAA8E;IAE9E,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,aAAa,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE;YAC/E,uEAAuE;YACvE,sEAAsE;YACtE,mEAAmE;YACnE,kEAAkE;YAClE,uEAAuE;YACvE,MAAM,YAAY,GAAG,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC3D,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;gBACvD,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,MAAM;gBACzB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI;gBACnC,4DAA4D;gBAC5D,8DAA8D;gBAC9D,2DAA2D;gBAC3D,6DAA6D;gBAC7D,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;gBAC5C,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;gBAC9B,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;gBAChC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;gBAChC,yBAAyB,EAAE,GAAG,EAAE,KAAK,EAAE,yBAAyB,KAAK,IAAI;gBACzE,UAAU,EAAE,YAAY,CAAC,MAAM;gBAC/B,MAAM,EAAE,YAAY;aACrB,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAA;QACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"security-center.d.ts","sourceRoot":"","sources":["../../../src/api/routes/security-center.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAK7C,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+BpE"}
1
+ {"version":3,"file":"security-center.d.ts","sourceRoot":"","sources":["../../../src/api/routes/security-center.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAmB7C,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqFpE"}
@@ -1,11 +1,14 @@
1
1
  import { getClientIp } from '../../security/client-ip.js';
2
+ import { logEvent } from '../../security/audit.js';
3
+ import { auditLogToCsv, auditLogToJson, loadAuditLogForExport, parseAuditLogRange, } from '../../security/audit-export.js';
2
4
  import { guardedDb } from '../guarded-db.js';
3
- import { json, internalError, requireAuth, requireAdminScope } from '../route-helpers.js';
5
+ import { errorResponse, hasModel, json, internalError, requireAuth, requireAdminScope, } from '../route-helpers.js';
4
6
  export function registerSecurityCenterRoutes(router) {
5
7
  const db = guardedDb;
6
8
  // ---------------------------------------------------------------------------
7
9
  // Security Center
8
10
  // GET /security — computed posture + summaries
11
+ // GET /security/audit-log/export — admin CSV/JSON download, optional date range
9
12
  // PUT /security — persist enforced policy (lockout-safe)
10
13
  // POST /security/sessions/revoke-all — revoke the caller's other sessions
11
14
  //
@@ -33,5 +36,55 @@ export function registerSecurityCenterRoutes(router) {
33
36
  return internalError(err, 'security GET');
34
37
  }
35
38
  });
39
+ router.get('/security/audit-log/export', async (request) => {
40
+ try {
41
+ const auth = await requireAuth(request);
42
+ if (auth.error)
43
+ return auth.error;
44
+ const adminErr = requireAdminScope(auth.session);
45
+ if (adminErr)
46
+ return adminErr;
47
+ const url = new URL(request.url);
48
+ const format = url.searchParams.get('format') ?? 'csv';
49
+ if (format !== 'csv' && format !== 'json') {
50
+ return errorResponse('"format" must be "csv" or "json"', 400);
51
+ }
52
+ const range = parseAuditLogRange(url.searchParams.get('from'), url.searchParams.get('to'));
53
+ if (!range.ok)
54
+ return errorResponse(range.error, 400);
55
+ const database = db();
56
+ const loaded = hasModel(database, 'auditLog')
57
+ ? await loadAuditLogForExport(database, range)
58
+ : { rows: [], truncated: false };
59
+ const body = format === 'json'
60
+ ? auditLogToJson(loaded.rows, loaded.truncated)
61
+ : auditLogToCsv(loaded.rows);
62
+ const filename = `audit-log.${format}`;
63
+ void logEvent({
64
+ event: 'audit_log_exported',
65
+ userId: auth.session.userId,
66
+ ipAddress: getClientIp(request),
67
+ details: {
68
+ format,
69
+ count: loaded.rows.length,
70
+ truncated: loaded.truncated,
71
+ from: range.from?.toISOString() ?? null,
72
+ to: range.to?.toISOString() ?? null,
73
+ },
74
+ });
75
+ return new Response(body, {
76
+ status: 200,
77
+ headers: {
78
+ 'Content-Type': format === 'json' ? 'application/json; charset=utf-8' : 'text/csv; charset=utf-8',
79
+ 'Content-Disposition': `attachment; filename="${filename}"`,
80
+ 'X-Audit-Export-Count': String(loaded.rows.length),
81
+ 'X-Audit-Export-Truncated': loaded.truncated ? 'true' : 'false',
82
+ },
83
+ });
84
+ }
85
+ catch (err) {
86
+ return internalError(err, 'security/audit-log/export');
87
+ }
88
+ });
36
89
  }
37
90
  //# sourceMappingURL=security-center.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-center.js","sourceRoot":"","sources":["../../../src/api/routes/security-center.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEzF,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,EAAE,GAAG,SAAS,CAAA;IACpB,8EAA8E;IAC9E,kBAAkB;IAClB,wEAAwE;IACxE,mFAAmF;IACnF,+EAA+E;IAC/E,EAAE;IACF,qEAAqE;IACrE,4EAA4E;IAC5E,uEAAuE;IACvE,8EAA8E;IAE9E,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAChD,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAA;YAE7B,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACjF,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC;gBACvC,EAAE,EAAE,EAAE,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;gBAC3B,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC;aAChC,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"security-center.js","sourceRoot":"","sources":["../../../src/api/routes/security-center.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
+ /** CSP for JSON and script-free HTML. No nonce — nothing is allowed to run. */
2
+ export declare const API_CONTENT_SECURITY_POLICY = "default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
3
+ export declare const SECURITY_HEADERS: Record<string, string>;
1
4
  /**
2
- * Headers every JSON API response carries. Lives in a leaf module (no imports)
3
- * so helpers outside `api/` — e.g. `ai/runtime-response.ts` — can emit
4
- * responses byte-for-byte consistent with `json()` / `errorResponse()` in
5
- * `route-helpers.ts` without importing the whole route-helper graph.
5
+ * Attach the API security header set to any response that left a route
6
+ * without it. Headers already on the response win, so a route can set a
7
+ * nonce CSP or a download disposition without being overwritten.
6
8
  */
7
- export declare const SECURITY_HEADERS: Record<string, string>;
9
+ export declare function applyApiSecurityHeaders(response: Response): Response;
8
10
  //# sourceMappingURL=security-headers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-headers.d.ts","sourceRoot":"","sources":["../../src/api/security-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKnD,CAAA"}
1
+ {"version":3,"file":"security-headers.d.ts","sourceRoot":"","sources":["../../src/api/security-headers.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,oFAC2C,CAAA;AAEnF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGnD,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAYpE"}
@@ -1,13 +1,31 @@
1
1
  /**
2
- * Headers every JSON API response carries. Lives in a leaf module (no imports)
3
- * so helpers outside `api/` — e.g. `ai/runtime-response.ts` — can emit
4
- * responses byte-for-byte consistent with `json()` / `errorResponse()` in
5
- * `route-helpers.ts` without importing the whole route-helper graph.
2
+ * Headers every JSON API response carries. `getSecurityHeaders` is the single
3
+ * baseline (HSTS, framing, nosniff, referrer, permissions). A locked CSP is
4
+ * added because these payloads are not documents: there is no inline script
5
+ * to nonce. HTML routes that do need a script set their own CSP first.
6
6
  */
7
+ import { getSecurityHeaders } from '../security/headers.js';
8
+ /** CSP for JSON and script-free HTML. No nonce — nothing is allowed to run. */
9
+ export const API_CONTENT_SECURITY_POLICY = "default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
7
10
  export const SECURITY_HEADERS = {
8
11
  'Content-Type': 'application/json',
9
- 'X-Content-Type-Options': 'nosniff',
10
- 'X-Frame-Options': 'DENY',
11
- 'Referrer-Policy': 'strict-origin-when-cross-origin',
12
+ ...getSecurityHeaders({ contentSecurityPolicy: API_CONTENT_SECURITY_POLICY }),
12
13
  };
14
+ /**
15
+ * Attach the API security header set to any response that left a route
16
+ * without it. Headers already on the response win, so a route can set a
17
+ * nonce CSP or a download disposition without being overwritten.
18
+ */
19
+ export function applyApiSecurityHeaders(response) {
20
+ const headers = new Headers(response.headers);
21
+ for (const [key, value] of Object.entries(getSecurityHeaders({ contentSecurityPolicy: API_CONTENT_SECURITY_POLICY }))) {
22
+ if (!headers.has(key))
23
+ headers.set(key, value);
24
+ }
25
+ return new Response(response.body, {
26
+ status: response.status,
27
+ statusText: response.statusText,
28
+ headers,
29
+ });
30
+ }
13
31
  //# sourceMappingURL=security-headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-headers.js","sourceRoot":"","sources":["../../src/api/security-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,cAAc,EAAE,kBAAkB;IAClC,wBAAwB,EAAE,SAAS;IACnC,iBAAiB,EAAE,MAAM;IACzB,iBAAiB,EAAE,iCAAiC;CACrD,CAAA"}
1
+ {"version":3,"file":"security-headers.js","sourceRoot":"","sources":["../../src/api/security-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GACtC,iFAAiF,CAAA;AAEnF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,cAAc,EAAE,kBAAkB;IAClC,GAAG,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,CAAC;CAC9E,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACvC,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,CAAC,CAC3E,EAAE,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /** Hard cap so an export cannot load the whole audit table in one response. */
2
+ export declare const AUDIT_LOG_EXPORT_MAX = 10000;
3
+ export interface AuditLogExportRow {
4
+ id: string;
5
+ event: string;
6
+ userId: string | null;
7
+ ipAddress: string | null;
8
+ userAgent: string | null;
9
+ details: unknown;
10
+ timestamp: Date | string;
11
+ }
12
+ export interface AuditLogExportDb {
13
+ auditLog: {
14
+ findMany: (args: {
15
+ where?: Record<string, unknown>;
16
+ orderBy?: {
17
+ timestamp: 'desc';
18
+ };
19
+ take?: number;
20
+ }) => Promise<AuditLogExportRow[]>;
21
+ };
22
+ }
23
+ export type AuditLogRange = {
24
+ ok: true;
25
+ from?: Date;
26
+ to?: Date;
27
+ } | {
28
+ ok: false;
29
+ error: string;
30
+ };
31
+ /** `from` / `to` are optional ISO timestamps or `YYYY-MM-DD` (UTC, inclusive). */
32
+ export declare function parseAuditLogRange(fromRaw: string | null, toRaw: string | null): AuditLogRange;
33
+ export declare function loadAuditLogForExport(db: AuditLogExportDb, range: {
34
+ from?: Date;
35
+ to?: Date;
36
+ }, max?: number): Promise<{
37
+ rows: AuditLogExportRow[];
38
+ truncated: boolean;
39
+ }>;
40
+ export declare function auditLogToCsv(rows: AuditLogExportRow[]): string;
41
+ export declare function auditLogToJson(rows: AuditLogExportRow[], truncated: boolean): string;
42
+ //# sourceMappingURL=audit-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-export.d.ts","sourceRoot":"","sources":["../../src/security/audit-export.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,QAAQ,EAAE,CAAC,IAAI,EAAE;YACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC/B,OAAO,CAAC,EAAE;gBAAE,SAAS,EAAE,MAAM,CAAA;aAAE,CAAA;YAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;SACd,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;KACnC,CAAA;CACF;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAgB/F,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAiB9F;AASD,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,IAAI,CAAA;CAAE,EACjC,GAAG,SAAuB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAQ5D;AAcD,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAe/D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAcpF"}
@@ -0,0 +1,93 @@
1
+ /** Hard cap so an export cannot load the whole audit table in one response. */
2
+ export const AUDIT_LOG_EXPORT_MAX = 10_000;
3
+ const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
4
+ function parseBound(value, endOfDay) {
5
+ const trimmed = value.trim();
6
+ if (!trimmed)
7
+ return null;
8
+ if (DATE_ONLY.test(trimmed)) {
9
+ const iso = endOfDay ? `${trimmed}T23:59:59.999Z` : `${trimmed}T00:00:00.000Z`;
10
+ const date = new Date(iso);
11
+ return Number.isNaN(date.getTime()) ? null : date;
12
+ }
13
+ const date = new Date(trimmed);
14
+ return Number.isNaN(date.getTime()) ? null : date;
15
+ }
16
+ /** `from` / `to` are optional ISO timestamps or `YYYY-MM-DD` (UTC, inclusive). */
17
+ export function parseAuditLogRange(fromRaw, toRaw) {
18
+ let from;
19
+ let to;
20
+ if (fromRaw?.trim()) {
21
+ const parsed = parseBound(fromRaw, false);
22
+ if (!parsed)
23
+ return { ok: false, error: '"from" must be an ISO date or YYYY-MM-DD' };
24
+ from = parsed;
25
+ }
26
+ if (toRaw?.trim()) {
27
+ const parsed = parseBound(toRaw, DATE_ONLY.test(toRaw.trim()));
28
+ if (!parsed)
29
+ return { ok: false, error: '"to" must be an ISO date or YYYY-MM-DD' };
30
+ to = parsed;
31
+ }
32
+ if (from && to && from.getTime() > to.getTime()) {
33
+ return { ok: false, error: '"from" must be on or before "to"' };
34
+ }
35
+ return { ok: true, from, to };
36
+ }
37
+ function auditLogWhere(range) {
38
+ const timestamp = {};
39
+ if (range.from)
40
+ timestamp.gte = range.from;
41
+ if (range.to)
42
+ timestamp.lte = range.to;
43
+ return Object.keys(timestamp).length > 0 ? { timestamp } : {};
44
+ }
45
+ export async function loadAuditLogForExport(db, range, max = AUDIT_LOG_EXPORT_MAX) {
46
+ const rows = await db.auditLog.findMany({
47
+ where: auditLogWhere(range),
48
+ orderBy: { timestamp: 'desc' },
49
+ take: max + 1,
50
+ });
51
+ const truncated = rows.length > max;
52
+ return { rows: truncated ? rows.slice(0, max) : rows, truncated };
53
+ }
54
+ function isoTimestamp(value) {
55
+ const date = value instanceof Date ? value : new Date(value);
56
+ return Number.isNaN(date.getTime()) ? String(value) : date.toISOString();
57
+ }
58
+ function csvCell(value) {
59
+ const text = value == null ? '' : typeof value === 'string' ? value : (JSON.stringify(value) ?? '');
60
+ if (/[",\n\r]/.test(text))
61
+ return `"${text.replace(/"/g, '""')}"`;
62
+ return text;
63
+ }
64
+ export function auditLogToCsv(rows) {
65
+ const header = 'timestamp,event,userId,ipAddress,userAgent,details';
66
+ const lines = rows.map((row) => [
67
+ isoTimestamp(row.timestamp),
68
+ row.event,
69
+ row.userId,
70
+ row.ipAddress,
71
+ row.userAgent,
72
+ row.details ?? '',
73
+ ]
74
+ .map(csvCell)
75
+ .join(','));
76
+ return [header, ...lines].join('\n');
77
+ }
78
+ export function auditLogToJson(rows, truncated) {
79
+ return JSON.stringify({
80
+ count: rows.length,
81
+ truncated,
82
+ entries: rows.map((row) => ({
83
+ id: row.id,
84
+ timestamp: isoTimestamp(row.timestamp),
85
+ event: row.event,
86
+ userId: row.userId,
87
+ ipAddress: row.ipAddress,
88
+ userAgent: row.userAgent,
89
+ details: row.details ?? null,
90
+ })),
91
+ });
92
+ }
93
+ //# sourceMappingURL=audit-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-export.js","sourceRoot":"","sources":["../../src/security/audit-export.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"page-meta.d.ts","sourceRoot":"","sources":["../../src/seo/page-meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page-meta.d.ts","sourceRoot":"","sources":["../../src/seo/page-meta.ts"],"names":[],"mappings":"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"}
@@ -203,7 +203,7 @@ export function resolveEffectiveMeta(params) {
203
203
  }),
204
204
  }) || null;
205
205
  const metaDescription = pickString(page.metaDescription, data.metaDescription, data.seoDescription, page.keyTakeaway, data.keyTakeaway, data.excerpt, data.description, site?.defaultMetaDescription) ?? null;
206
- const realImageUrl = pickString(page.ogImage, data.ogImage, asImageUrl(data.featuredImage), asImageUrl(data.heroImage), asImageUrl(data.coverImage), asImageUrl(data.image), site?.defaultOgImage);
206
+ const realImageUrl = pickString(asImageUrl(page.ogImage), asImageUrl(data.ogImage), asImageUrl(data.featuredImage), asImageUrl(data.heroImage), asImageUrl(data.coverImage), asImageUrl(data.image), site?.defaultOgImage);
207
207
  const cmsOrigin = resolveCmsOrigin({ site, cmsOrigin: params.cmsOrigin, siteUrl });
208
208
  const ogImage = realImageUrl ?? (metaTitle ? dynamicOgCardUrl(cmsOrigin, metaTitle) : null) ?? null;
209
209
  const robots = resolveDocumentRobotsDirectives({
@@ -237,6 +237,21 @@ function siteTitleTemplateVars(params) {
237
237
  * media object (`{ url }` / `{ src }` / `{ publicUrl }`); rejects bare media
238
238
  * IDs and other non-URL strings so JSON-LD never emits a cuid as `image`.
239
239
  */
240
+ /** Alt text from a media object. A bare URL has none. */
241
+ function asImageAlt(value) {
242
+ if (!value || typeof value !== 'object')
243
+ return undefined;
244
+ const alt = value.alt;
245
+ return typeof alt === 'string' && alt.trim() ? alt.trim() : undefined;
246
+ }
247
+ /** URL plus alt from one field, so a later fallback cannot donate the alt. */
248
+ function imageField(value) {
249
+ const url = asImageUrl(value);
250
+ if (!url)
251
+ return undefined;
252
+ const alt = asImageAlt(value);
253
+ return alt ? { url, alt } : { url };
254
+ }
240
255
  function asImageUrl(value) {
241
256
  if (typeof value === 'string') {
242
257
  const v = value.trim();
@@ -727,7 +742,9 @@ export function composePageMeta(input) {
727
742
  // want the dynamic OG generator URL polluting structured data). Falls back to
728
743
  // the page's hero / featured / cover image (string or `{ url }`) before the
729
744
  // site default, so social cards use the page's own visual when set.
730
- const realImageUrl = pickString(page.ogImage, data.ogImage, asImageUrl(data.featuredImage), asImageUrl(data.heroImage), asImageUrl(data.coverImage), asImageUrl(data.image), site?.defaultOgImage) ?? undefined;
745
+ const ogFromField = imageField(page.ogImage) ?? imageField(data.ogImage);
746
+ const realImageUrl = ogFromField?.url ??
747
+ pickString(asImageUrl(data.featuredImage), asImageUrl(data.heroImage), asImageUrl(data.coverImage), asImageUrl(data.image), site?.defaultOgImage);
731
748
  // The dynamic OG endpoint is served by the CMS API router, mounted under
732
749
  // /api/cms on the CMS origin — not the public site root — so the default is
733
750
  // composed against the CMS origin (seo.cmsUrl → request origin → siteUrl) or
@@ -741,8 +758,8 @@ export function composePageMeta(input) {
741
758
  : 'website';
742
759
  const profileName = ogType === 'profile' ? resolvePersonNameParts(data, rawTitle) : undefined;
743
760
  // The generated /og.png fallback is a known fixed 1200x630 card; declare its
744
- // dimensions so social crawlers don't skip/slow-render it. All OG images get
745
- // alt text (the page title) for card accessibility.
761
+ // dimensions so social crawlers don't skip/slow-render it. A generated card
762
+ // uses the page title as alt. An uploaded media object's own alt wins.
746
763
  const usingGeneratedOg = !realImageUrl && !!ogImageUrl;
747
764
  const metaInput = {
748
765
  title,
@@ -773,7 +790,7 @@ export function composePageMeta(input) {
773
790
  ogImage: ogImageUrl
774
791
  ? {
775
792
  url: ogImageUrl,
776
- alt: title,
793
+ alt: ogFromField?.alt ?? title,
777
794
  ...(usingGeneratedOg ? { width: 1200, height: 630 } : {}),
778
795
  }
779
796
  : undefined,