@actuate-media/cms-core 0.30.0 → 0.32.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/dist/__tests__/api/admin-contracts.test.js +10 -2
- package/dist/__tests__/api/admin-contracts.test.js.map +1 -1
- package/dist/__tests__/api/public-forms.test.d.ts +2 -0
- package/dist/__tests__/api/public-forms.test.d.ts.map +1 -0
- package/dist/__tests__/api/public-forms.test.js +125 -0
- package/dist/__tests__/api/public-forms.test.js.map +1 -0
- package/dist/__tests__/api/public-seo.test.js +2 -0
- package/dist/__tests__/api/public-seo.test.js.map +1 -1
- package/dist/__tests__/forms/forms-service.test.d.ts +2 -0
- package/dist/__tests__/forms/forms-service.test.d.ts.map +1 -0
- package/dist/__tests__/forms/forms-service.test.js +193 -0
- package/dist/__tests__/forms/forms-service.test.js.map +1 -0
- package/dist/__tests__/forms/spam.test.d.ts +2 -0
- package/dist/__tests__/forms/spam.test.d.ts.map +1 -0
- package/dist/__tests__/forms/spam.test.js +115 -0
- package/dist/__tests__/forms/spam.test.js.map +1 -0
- package/dist/__tests__/forms/submission-files.test.d.ts +2 -0
- package/dist/__tests__/forms/submission-files.test.d.ts.map +1 -0
- package/dist/__tests__/forms/submission-files.test.js +65 -0
- package/dist/__tests__/forms/submission-files.test.js.map +1 -0
- package/dist/__tests__/forms/submission-pipeline.test.d.ts +2 -0
- package/dist/__tests__/forms/submission-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/forms/submission-pipeline.test.js +131 -0
- package/dist/__tests__/forms/submission-pipeline.test.js.map +1 -0
- package/dist/__tests__/forms/submission-validation.test.d.ts +2 -0
- package/dist/__tests__/forms/submission-validation.test.d.ts.map +1 -0
- package/dist/__tests__/forms/submission-validation.test.js +108 -0
- package/dist/__tests__/forms/submission-validation.test.js.map +1 -0
- package/dist/__tests__/seo/audit-runner.test.js +54 -1
- package/dist/__tests__/seo/audit-runner.test.js.map +1 -1
- package/dist/api/handler-factory.d.ts.map +1 -1
- package/dist/api/handler-factory.js +2 -2
- package/dist/api/handler-factory.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +724 -155
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/router.d.ts +2 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +3 -0
- package/dist/api/router.js.map +1 -1
- package/dist/config/types.d.ts +42 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/cron/index.d.ts +1 -0
- package/dist/cron/index.d.ts.map +1 -1
- package/dist/cron/index.js +10 -1
- package/dist/cron/index.js.map +1 -1
- package/dist/forms/entries.d.ts +45 -0
- package/dist/forms/entries.d.ts.map +1 -0
- package/dist/forms/entries.js +348 -0
- package/dist/forms/entries.js.map +1 -0
- package/dist/forms/files.d.ts +38 -0
- package/dist/forms/files.d.ts.map +1 -0
- package/dist/forms/files.js +134 -0
- package/dist/forms/files.js.map +1 -0
- package/dist/forms/index.d.ts +8 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +7 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/service.d.ts +92 -0
- package/dist/forms/service.d.ts.map +1 -0
- package/dist/forms/service.js +579 -0
- package/dist/forms/service.js.map +1 -0
- package/dist/forms/spam.d.ts +33 -0
- package/dist/forms/spam.d.ts.map +1 -0
- package/dist/forms/spam.js +93 -0
- package/dist/forms/spam.js.map +1 -0
- package/dist/forms/submission.d.ts +95 -0
- package/dist/forms/submission.d.ts.map +1 -0
- package/dist/forms/submission.js +282 -0
- package/dist/forms/submission.js.map +1 -0
- package/dist/forms/types.d.ts +244 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +36 -0
- package/dist/forms/types.js.map +1 -0
- package/dist/forms/validation.d.ts +19 -0
- package/dist/forms/validation.d.ts.map +1 -0
- package/dist/forms/validation.js +235 -0
- package/dist/forms/validation.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/security/client-ip.d.ts +11 -21
- package/dist/security/client-ip.d.ts.map +1 -1
- package/dist/security/client-ip.js +38 -0
- package/dist/security/client-ip.js.map +1 -1
- package/dist/seo/audit-runner.d.ts +37 -2
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +56 -6
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/index.d.ts +2 -1
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +1 -1
- package/dist/seo/index.js.map +1 -1
- package/package.json +1 -1
- package/prisma/cms-schema.prisma +81 -7
- package/prisma/migrations/0010_forms/migration.sql +130 -0
- package/prisma/schema.prisma +130 -35
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA0BhD,cAAc;AACd,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAA;AAG/B,SAAS;AACT,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAQ1B,OAAO;AACP,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAWxB,WAAW;AACX,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAE5B,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGnD,WAAW;AACX,OAAO,EACL,QAAQ,IAAI,eAAe,EAC3B,cAAc,IAAI,qBAAqB,EACvC,aAAa,IAAI,oBAAoB,EACrC,cAAc,IAAI,qBAAqB,EACvC,cAAc,IAAI,qBAAqB,EACvC,aAAa,IAAI,oBAAoB,EACrC,cAAc,IAAI,qBAAqB,EACvC,WAAW,EACX,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAG5B,OAAO;AACP,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAA;AAExB,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAIxB,UAAU;AACV,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAW3B,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAA;AAGrB,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExD,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGrD,uBAAuB;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAExD,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,cAAc,GACf,MAAM,wBAAwB,CAAA;AAG/B,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAS1E,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,UAAU;AACV,OAAO,EACL,eAAe,EACf,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAQ3B,gBAAgB;AAChB,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAG3F,gBAAgB;AAChB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAGrE,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAG1F,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAG5F,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGhG,WAAW;AACX,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAG9D,OAAO,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAW5F,aAAa;AACb,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,uBAAuB,CAAA;AAG9B,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGxF,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAGhG,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9D,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGxD,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGzF,UAAU;AACV,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAGzD,oBAAoB;AACpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGxF,QAAQ;AACR,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Trusted client-IP extraction.
|
|
3
|
-
*
|
|
4
|
-
* The `X-Forwarded-For` header is fully attacker-controlled when the server is
|
|
5
|
-
* directly reachable from the Internet — anyone can send `X-Forwarded-For: 1.2.3.4`
|
|
6
|
-
* to bypass per-IP rate limits and poison audit logs.
|
|
7
|
-
*
|
|
8
|
-
* This helper resolves the real client IP using the most trustworthy header
|
|
9
|
-
* available, in this order:
|
|
10
|
-
*
|
|
11
|
-
* 1. Vercel — `x-vercel-forwarded-for` is set by the Vercel edge and cannot
|
|
12
|
-
* be spoofed by clients (Vercel strips inbound copies).
|
|
13
|
-
* 2. Common reverse proxies — `x-real-ip` is typically set by nginx/Caddy
|
|
14
|
-
* to the directly-connected client IP.
|
|
15
|
-
* 3. `x-forwarded-for` — only honoured when the integrator opts in via
|
|
16
|
-
* `trustProxy: true`. In that mode we use the **last** entry (closest to
|
|
17
|
-
* the proxy) rather than the first (closest to the client / spoofable).
|
|
18
|
-
*
|
|
19
|
-
* Returns the literal string `'unknown'` when no trusted source is available;
|
|
20
|
-
* callers should treat that as a hard failure for security-sensitive decisions.
|
|
21
|
-
*/
|
|
22
1
|
export interface TrustedIpOptions {
|
|
23
2
|
/** When true, fall back to parsing X-Forwarded-For. Defaults to false. */
|
|
24
3
|
trustProxy?: boolean;
|
|
@@ -30,4 +9,15 @@ export declare function getClientIp(request: Request, options?: TrustedIpOptions
|
|
|
30
9
|
* `'unknown'` sentinel.
|
|
31
10
|
*/
|
|
32
11
|
export declare function isResolvedIp(ip: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* One-way hash of a client IP for storage alongside form submissions.
|
|
14
|
+
*
|
|
15
|
+
* We never persist raw IPs — they are PII and a liability. Hashing with the
|
|
16
|
+
* instance secret as salt lets operators correlate repeat submitters / abuse
|
|
17
|
+
* within a single deployment while making the stored value useless to anyone
|
|
18
|
+
* who exfiltrates the table without also having `CMS_SECRET`. Returns `null`
|
|
19
|
+
* for the `'unknown'` sentinel so callers store SQL NULL rather than a hash of
|
|
20
|
+
* the literal string `'unknown'`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function hashClientIp(ip: string): string | null;
|
|
33
23
|
//# sourceMappingURL=client-ip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../../src/security/client-ip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../../src/security/client-ip.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA8BpF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItD"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trusted client-IP extraction.
|
|
3
|
+
*
|
|
4
|
+
* The `X-Forwarded-For` header is fully attacker-controlled when the server is
|
|
5
|
+
* directly reachable from the Internet — anyone can send `X-Forwarded-For: 1.2.3.4`
|
|
6
|
+
* to bypass per-IP rate limits and poison audit logs.
|
|
7
|
+
*
|
|
8
|
+
* This helper resolves the real client IP using the most trustworthy header
|
|
9
|
+
* available, in this order:
|
|
10
|
+
*
|
|
11
|
+
* 1. Vercel — `x-vercel-forwarded-for` is set by the Vercel edge and cannot
|
|
12
|
+
* be spoofed by clients (Vercel strips inbound copies).
|
|
13
|
+
* 2. Common reverse proxies — `x-real-ip` is typically set by nginx/Caddy
|
|
14
|
+
* to the directly-connected client IP.
|
|
15
|
+
* 3. `x-forwarded-for` — only honoured when the integrator opts in via
|
|
16
|
+
* `trustProxy: true`. In that mode we use the **last** entry (closest to
|
|
17
|
+
* the proxy) rather than the first (closest to the client / spoofable).
|
|
18
|
+
*
|
|
19
|
+
* Returns the literal string `'unknown'` when no trusted source is available;
|
|
20
|
+
* callers should treat that as a hard failure for security-sensitive decisions.
|
|
21
|
+
*/
|
|
22
|
+
import { createHash } from 'node:crypto';
|
|
1
23
|
const VERCEL_HEADER = 'x-vercel-forwarded-for';
|
|
2
24
|
const REAL_IP_HEADER = 'x-real-ip';
|
|
3
25
|
const FORWARDED_HEADER = 'x-forwarded-for';
|
|
@@ -39,4 +61,20 @@ export function getClientIp(request, options = {}) {
|
|
|
39
61
|
export function isResolvedIp(ip) {
|
|
40
62
|
return ip !== 'unknown' && ip.length > 0;
|
|
41
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* One-way hash of a client IP for storage alongside form submissions.
|
|
66
|
+
*
|
|
67
|
+
* We never persist raw IPs — they are PII and a liability. Hashing with the
|
|
68
|
+
* instance secret as salt lets operators correlate repeat submitters / abuse
|
|
69
|
+
* within a single deployment while making the stored value useless to anyone
|
|
70
|
+
* who exfiltrates the table without also having `CMS_SECRET`. Returns `null`
|
|
71
|
+
* for the `'unknown'` sentinel so callers store SQL NULL rather than a hash of
|
|
72
|
+
* the literal string `'unknown'`.
|
|
73
|
+
*/
|
|
74
|
+
export function hashClientIp(ip) {
|
|
75
|
+
if (!isResolvedIp(ip))
|
|
76
|
+
return null;
|
|
77
|
+
const salt = process.env.CMS_SECRET ?? 'actuate-fallback-salt';
|
|
78
|
+
return createHash('sha256').update(`${salt}:${ip}`).digest('hex').slice(0, 32);
|
|
79
|
+
}
|
|
42
80
|
//# sourceMappingURL=client-ip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../../src/security/client-ip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client-ip.js","sourceRoot":"","sources":["../../src/security/client-ip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AAC9C,MAAM,cAAc,GAAG,WAAW,CAAA;AAClC,MAAM,gBAAgB,GAAG,iBAAiB,CAAA;AAE1C,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,UAA4B,EAAE;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAA;IAEhF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;QAC1C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;IAC7B,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACjD,IAAI,GAAG,EAAE,CAAC;YACR,oEAAoE;YACpE,yDAAyD;YACzD,MAAM,KAAK,GAAG,GAAG;iBACd,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAA;YAClB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACpC,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAA;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAChF,CAAC"}
|
|
@@ -20,14 +20,49 @@ import { type AuditEntityInput, type AuditExtraSignals } from './audit-engine.js
|
|
|
20
20
|
* any `__`-prefixed convention collection (e.g. `__seo_config__`, `__seo_perf__`).
|
|
21
21
|
*/
|
|
22
22
|
export declare function isInternalCollection(collection: string): boolean;
|
|
23
|
+
/** Map of front-end content collection slug -> its page/post entity type. */
|
|
24
|
+
export type ContentCollectionTypes = Record<string, 'page' | 'post'>;
|
|
25
|
+
/**
|
|
26
|
+
* Derive the set of front-end **content** collections (and each one's page/post
|
|
27
|
+
* type) from the resolved CMS config. These are the only collections the SEO
|
|
28
|
+
* tools (Content SEO list, audit, scan, internal-link candidates) operate on.
|
|
29
|
+
*
|
|
30
|
+
* A collection qualifies only when it is:
|
|
31
|
+
* - explicitly typed `page` or `post` (i.e. a publicly-rendered content type),
|
|
32
|
+
* - not hidden from the admin (`admin.hidden`),
|
|
33
|
+
* - not excluded from the sitemap (collection- or site-level).
|
|
34
|
+
*
|
|
35
|
+
* This deliberately excludes structural/utility collections (navigation menus,
|
|
36
|
+
* footers, tags, templates, redirects) — which have no `type` — as well as any
|
|
37
|
+
* document whose collection isn't declared in the config at all (e.g. benchmark
|
|
38
|
+
* or other ad-hoc rows that only exist in the database). The result is that the
|
|
39
|
+
* SEO surfaces show real front-end pages/posts/landing pages and nothing else.
|
|
40
|
+
*/
|
|
41
|
+
export declare function frontEndContentCollectionTypes(cfg: unknown): ContentCollectionTypes;
|
|
23
42
|
/** Map a published document row into the audit engine's entity shape. */
|
|
24
|
-
export declare function documentToAuditEntity(doc: any): AuditEntityInput;
|
|
25
|
-
export
|
|
43
|
+
export declare function documentToAuditEntity(doc: any, collectionTypes?: ContentCollectionTypes): AuditEntityInput;
|
|
44
|
+
export interface GatherAuditOptions {
|
|
45
|
+
/**
|
|
46
|
+
* Restrict the gather to these front-end content collections (slug -> type),
|
|
47
|
+
* as produced by `frontEndContentCollectionTypes(config)`. When supplied, only
|
|
48
|
+
* documents in these collections are loaded and their entity type is taken
|
|
49
|
+
* from the map. When omitted, the legacy `isInternalCollection` filter applies
|
|
50
|
+
* (used by callers without access to the resolved config, e.g. some tests).
|
|
51
|
+
*/
|
|
52
|
+
collectionTypes?: ContentCollectionTypes;
|
|
53
|
+
}
|
|
54
|
+
export declare function gatherAuditEntities(db: any, options?: GatherAuditOptions): Promise<AuditEntityInput[]>;
|
|
26
55
|
export interface RunAuditOptions {
|
|
27
56
|
scope?: string;
|
|
28
57
|
startedById?: string | null;
|
|
29
58
|
/** Cross-cutting signals (broken links, redirect chains/loops) from callers. */
|
|
30
59
|
signals?: AuditExtraSignals;
|
|
60
|
+
/**
|
|
61
|
+
* Front-end content collections to audit (slug -> type). Forwarded to
|
|
62
|
+
* `gatherAuditEntities` so the audit only covers real pages/posts and never
|
|
63
|
+
* structural or benchmark documents. See `frontEndContentCollectionTypes`.
|
|
64
|
+
*/
|
|
65
|
+
collectionTypes?: ContentCollectionTypes;
|
|
31
66
|
}
|
|
32
67
|
export interface PersistedAuditRun {
|
|
33
68
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-runner.d.ts","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAW1B;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEhE;AAsBD,yEAAyE;AACzE,wBAAgB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"audit-runner.d.ts","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAW1B;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAgBnF;AAsBD,yEAAyE;AACzE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,EACR,eAAe,CAAC,EAAE,sBAAsB,GACvC,gBAAgB,CAmClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAA;CACzC;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,GAAG,EACP,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+B7B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gFAAgF;IAChF,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B;;;;OAIG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAA;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,GAAG,EACP,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA4F5B"}
|
package/dist/seo/audit-runner.js
CHANGED
|
@@ -30,6 +30,40 @@ const EXCLUDED_COLLECTIONS = new Set([
|
|
|
30
30
|
export function isInternalCollection(collection) {
|
|
31
31
|
return EXCLUDED_COLLECTIONS.has(collection) || String(collection).startsWith('__');
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Derive the set of front-end **content** collections (and each one's page/post
|
|
35
|
+
* type) from the resolved CMS config. These are the only collections the SEO
|
|
36
|
+
* tools (Content SEO list, audit, scan, internal-link candidates) operate on.
|
|
37
|
+
*
|
|
38
|
+
* A collection qualifies only when it is:
|
|
39
|
+
* - explicitly typed `page` or `post` (i.e. a publicly-rendered content type),
|
|
40
|
+
* - not hidden from the admin (`admin.hidden`),
|
|
41
|
+
* - not excluded from the sitemap (collection- or site-level).
|
|
42
|
+
*
|
|
43
|
+
* This deliberately excludes structural/utility collections (navigation menus,
|
|
44
|
+
* footers, tags, templates, redirects) — which have no `type` — as well as any
|
|
45
|
+
* document whose collection isn't declared in the config at all (e.g. benchmark
|
|
46
|
+
* or other ad-hoc rows that only exist in the database). The result is that the
|
|
47
|
+
* SEO surfaces show real front-end pages/posts/landing pages and nothing else.
|
|
48
|
+
*/
|
|
49
|
+
export function frontEndContentCollectionTypes(cfg) {
|
|
50
|
+
const out = {};
|
|
51
|
+
const config = (cfg ?? {});
|
|
52
|
+
const collections = config.collections ?? {};
|
|
53
|
+
const excluded = new Set(config.seo?.sitemap?.excludeCollections ?? []);
|
|
54
|
+
for (const [slug, col] of Object.entries(collections)) {
|
|
55
|
+
if (col?.type !== 'page' && col?.type !== 'post')
|
|
56
|
+
continue;
|
|
57
|
+
if (col?.admin?.hidden)
|
|
58
|
+
continue;
|
|
59
|
+
if (excluded.has(slug))
|
|
60
|
+
continue;
|
|
61
|
+
if (col?.seo?.excludeFromSitemap)
|
|
62
|
+
continue;
|
|
63
|
+
out[slug] = col.type;
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
33
67
|
/**
|
|
34
68
|
* Upper bound on documents loaded into a single audit pass. Audits hold the
|
|
35
69
|
* full entity set in memory and rescore each one, so an unbounded `findMany`
|
|
@@ -47,7 +81,7 @@ function bool(v) {
|
|
|
47
81
|
return v === true || v === 'true';
|
|
48
82
|
}
|
|
49
83
|
/** Map a published document row into the audit engine's entity shape. */
|
|
50
|
-
export function documentToAuditEntity(doc) {
|
|
84
|
+
export function documentToAuditEntity(doc, collectionTypes) {
|
|
51
85
|
const data = asRecord(doc.data);
|
|
52
86
|
const structured = asRecord(doc.structuredData);
|
|
53
87
|
const slug = str(data.slug) ?? doc.slug ?? doc.id;
|
|
@@ -56,8 +90,11 @@ export function documentToAuditEntity(doc) {
|
|
|
56
90
|
str(data.content) ??
|
|
57
91
|
(typeof doc.plainText === 'string' ? doc.plainText : '') ??
|
|
58
92
|
'';
|
|
93
|
+
// Prefer the configured collection type; fall back to the legacy heuristic
|
|
94
|
+
// (only `pages` is a page) when no config map is supplied.
|
|
95
|
+
const entityType = collectionTypes?.[doc.collection] ?? (doc.collection === 'pages' ? 'page' : 'post');
|
|
59
96
|
return {
|
|
60
|
-
entityType
|
|
97
|
+
entityType,
|
|
61
98
|
entityId: doc.id,
|
|
62
99
|
title: str(data.title) ?? doc.title ?? 'Untitled',
|
|
63
100
|
url,
|
|
@@ -75,9 +112,20 @@ export function documentToAuditEntity(doc) {
|
|
|
75
112
|
wordCount: typeof data.wordCount === 'number' ? data.wordCount : null,
|
|
76
113
|
};
|
|
77
114
|
}
|
|
78
|
-
export async function gatherAuditEntities(db) {
|
|
115
|
+
export async function gatherAuditEntities(db, options = {}) {
|
|
116
|
+
const { collectionTypes } = options;
|
|
117
|
+
// When the caller knows the front-end content collections, scope the query to
|
|
118
|
+
// them at the DB level so structural/benchmark rows never even count against
|
|
119
|
+
// the entity cap.
|
|
120
|
+
const where = { deletedAt: null, status: 'PUBLISHED' };
|
|
121
|
+
if (collectionTypes) {
|
|
122
|
+
const slugs = Object.keys(collectionTypes);
|
|
123
|
+
if (slugs.length === 0)
|
|
124
|
+
return [];
|
|
125
|
+
where.collection = { in: slugs };
|
|
126
|
+
}
|
|
79
127
|
const docs = await db.document.findMany({
|
|
80
|
-
where
|
|
128
|
+
where,
|
|
81
129
|
select: {
|
|
82
130
|
id: true,
|
|
83
131
|
collection: true,
|
|
@@ -90,7 +138,9 @@ export async function gatherAuditEntities(db) {
|
|
|
90
138
|
orderBy: { updatedAt: 'desc' },
|
|
91
139
|
take: AUDIT_MAX_ENTITIES,
|
|
92
140
|
});
|
|
93
|
-
return docs
|
|
141
|
+
return docs
|
|
142
|
+
.filter((d) => (collectionTypes ? true : !isInternalCollection(d.collection)))
|
|
143
|
+
.map((d) => documentToAuditEntity(d, collectionTypes));
|
|
94
144
|
}
|
|
95
145
|
/**
|
|
96
146
|
* Run an audit and persist the run + issue snapshot. Returns the run summary.
|
|
@@ -139,7 +189,7 @@ export async function runAndPersistAudit(db, options = {}) {
|
|
|
139
189
|
},
|
|
140
190
|
});
|
|
141
191
|
try {
|
|
142
|
-
const entities = await gatherAuditEntities(db);
|
|
192
|
+
const entities = await gatherAuditEntities(db, { collectionTypes: options.collectionTypes });
|
|
143
193
|
const result = runSeoAuditAnalysis(entities, signals);
|
|
144
194
|
await persistIssues(db, run.id, result.issues);
|
|
145
195
|
await db.seoAuditRun.update({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEpG,iEAAiE;AACjE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,qBAAqB;IACrB,WAAW;IACX,WAAW;IACX,gBAAgB;CACjB,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,OAAO,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAE/B,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9F,CAAC;AAED,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AAED,SAAS,IAAI,CAAC,CAAU;IACtB,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,CAAA;AACnC,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,
|
|
1
|
+
{"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/seo/index.d.ts
CHANGED
|
@@ -16,5 +16,6 @@ export { calculatePageSeoScore, calculateSiteSeoScore, gradeForSeoScore, countH1
|
|
|
16
16
|
export type { SeoGrade, SeoCheckStatus, SeoScoreCheck, PageSeoScoreResult, PageSeoScoreInput, SiteSeoScoreInput, SiteSeoScoreResult, SiteSeoScoreBreakdownItem, } from './score.js';
|
|
17
17
|
export { runSeoAuditAnalysis, buildQuickWins, issueKeyFor } from './audit-engine.js';
|
|
18
18
|
export type { AuditEntityInput, AuditExtraSignals, DetectedIssue, AuditPageRecord, QuickWin, SeoAuditResult, } from './audit-engine.js';
|
|
19
|
-
export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity } from './audit-runner.js';
|
|
19
|
+
export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, } from './audit-runner.js';
|
|
20
|
+
export type { ContentCollectionTypes } from './audit-runner.js';
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/seo/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAElG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE3F,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE5E,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAErE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAElE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAElG,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpF,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,GACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAElG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE3F,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE5E,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAErE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAElE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAElG,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpF,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,GACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/seo/index.js
CHANGED
|
@@ -7,5 +7,5 @@ export { composePageMeta, detectSchemaType } from './page-meta.js';
|
|
|
7
7
|
export { SEO_CONFIG_COLLECTION, getSeoOverrides, putSeoOverrides, applySeoOverrides, mergeSiteSeoConfig, mergeCollectionSeoConfig, DEFAULT_SEO_MODULE_SETTINGS, resolveSeoModuleSettings, } from './config-store.js';
|
|
8
8
|
export { calculatePageSeoScore, calculateSiteSeoScore, gradeForSeoScore, countH1, PAGE_SEO_WEIGHTS, SITE_SEO_WEIGHTS, } from './score.js';
|
|
9
9
|
export { runSeoAuditAnalysis, buildQuickWins, issueKeyFor } from './audit-engine.js';
|
|
10
|
-
export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity } from './audit-runner.js';
|
|
10
|
+
export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, } from './audit-runner.js';
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/seo/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAI3F,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAI5E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAI/C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAIlE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAanB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAWpF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAI3F,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAI5E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAI/C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAIlE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAanB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAWpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,mBAAmB,CAAA"}
|
package/package.json
CHANGED
package/prisma/cms-schema.prisma
CHANGED
|
@@ -209,18 +209,92 @@ model Redirect {
|
|
|
209
209
|
@@index([createdAt])
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
model FormSchemaVersion {
|
|
213
|
+
id String @id @default(cuid())
|
|
214
|
+
formId String
|
|
215
|
+
version Int
|
|
216
|
+
fields Json
|
|
217
|
+
notes String?
|
|
218
|
+
createdById String?
|
|
219
|
+
createdAt DateTime @default(now())
|
|
220
|
+
|
|
221
|
+
@@unique([formId, version])
|
|
222
|
+
@@index([formId])
|
|
223
|
+
}
|
|
224
|
+
|
|
212
225
|
model FormSubmission {
|
|
213
|
-
id
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
226
|
+
id String @id @default(cuid())
|
|
227
|
+
entryNumber Int?
|
|
228
|
+
formId String
|
|
229
|
+
form Document @relation(fields: [formId], references: [id], onDelete: Cascade)
|
|
230
|
+
schemaVersionId String?
|
|
231
|
+
data Json
|
|
232
|
+
normalizedData Json?
|
|
233
|
+
attribution Json?
|
|
234
|
+
senderName String?
|
|
235
|
+
senderEmail String?
|
|
236
|
+
senderPhone String?
|
|
237
|
+
preview String?
|
|
238
|
+
status String @default("new")
|
|
239
|
+
unread Boolean @default(true)
|
|
240
|
+
starred Boolean @default(false)
|
|
241
|
+
archived Boolean @default(false)
|
|
242
|
+
spamStatus String @default("clean")
|
|
243
|
+
ipAddressHash String?
|
|
244
|
+
userAgent String?
|
|
245
|
+
referrer String?
|
|
246
|
+
pageUrl String?
|
|
247
|
+
utmSource String?
|
|
248
|
+
utmMedium String?
|
|
249
|
+
utmCampaign String?
|
|
250
|
+
submittedAt DateTime @default(now())
|
|
251
|
+
readAt DateTime?
|
|
252
|
+
archivedAt DateTime?
|
|
253
|
+
createdAt DateTime @default(now())
|
|
254
|
+
updatedAt DateTime @updatedAt
|
|
255
|
+
|
|
256
|
+
files FormSubmissionFile[]
|
|
220
257
|
|
|
221
258
|
@@index([formId])
|
|
222
259
|
@@index([submittedAt])
|
|
223
260
|
@@index([createdAt])
|
|
261
|
+
@@index([unread])
|
|
262
|
+
@@index([starred])
|
|
263
|
+
@@index([archived])
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
model FormSubmissionFile {
|
|
267
|
+
id String @id @default(cuid())
|
|
268
|
+
submissionId String
|
|
269
|
+
fieldKey String
|
|
270
|
+
mediaAssetId String?
|
|
271
|
+
fileName String
|
|
272
|
+
mimeType String
|
|
273
|
+
sizeBytes Int
|
|
274
|
+
storageKey String
|
|
275
|
+
publicUrl String?
|
|
276
|
+
secureDownloadUrl String?
|
|
277
|
+
createdAt DateTime @default(now())
|
|
278
|
+
|
|
279
|
+
submission FormSubmission @relation(fields: [submissionId], references: [id], onDelete: Cascade)
|
|
280
|
+
|
|
281
|
+
@@index([submissionId])
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
model FormWebhook {
|
|
285
|
+
id String @id @default(cuid())
|
|
286
|
+
formId String
|
|
287
|
+
url String
|
|
288
|
+
secret String
|
|
289
|
+
enabled Boolean @default(true)
|
|
290
|
+
events Json
|
|
291
|
+
retryCount Int @default(0)
|
|
292
|
+
lastDeliveryAt DateTime?
|
|
293
|
+
lastDeliveryStatus String?
|
|
294
|
+
createdAt DateTime @default(now())
|
|
295
|
+
updatedAt DateTime @updatedAt
|
|
296
|
+
|
|
297
|
+
@@index([formId])
|
|
224
298
|
}
|
|
225
299
|
|
|
226
300
|
model AuditLog {
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
-- Forms system
|
|
2
|
+
--
|
|
3
|
+
-- Expands the Forms feature from a single flat submissions table into a real
|
|
4
|
+
-- submission workflow with schema versioning, per-submission file attachments,
|
|
5
|
+
-- and per-form webhooks.
|
|
6
|
+
--
|
|
7
|
+
-- * actuate_form_submissions: new workflow columns (entryNumber, sender*,
|
|
8
|
+
-- unread/starred/archived, spamStatus, attribution metadata, schema version
|
|
9
|
+
-- link, normalizedData, read/archived timestamps, updatedAt).
|
|
10
|
+
-- * actuate_form_schema_versions: versioned field-schema snapshots so old
|
|
11
|
+
-- submissions always render against the schema they were captured with.
|
|
12
|
+
-- * actuate_form_submission_files: file-upload metadata (storage keys, not
|
|
13
|
+
-- blobs) with cascade delete from its submission.
|
|
14
|
+
-- * actuate_form_webhooks: per-form signed outbound webhooks.
|
|
15
|
+
--
|
|
16
|
+
-- Safe to apply to a populated database:
|
|
17
|
+
-- * Every new column on actuate_form_submissions is nullable or has a default.
|
|
18
|
+
-- * updatedAt is backfilled from createdAt for existing rows before the NOT
|
|
19
|
+
-- NULL default takes over for new rows.
|
|
20
|
+
-- * No existing column is dropped or retyped. formId stays a loose string
|
|
21
|
+
-- (no new FK) so historical rows with orphaned formIds are not rejected.
|
|
22
|
+
|
|
23
|
+
-- ---------------------------------------------------------------------------
|
|
24
|
+
-- actuate_form_submissions new columns
|
|
25
|
+
-- ---------------------------------------------------------------------------
|
|
26
|
+
ALTER TABLE "actuate_form_submissions"
|
|
27
|
+
ADD COLUMN "entryNumber" INTEGER,
|
|
28
|
+
ADD COLUMN "schemaVersionId" TEXT,
|
|
29
|
+
ADD COLUMN "normalizedData" JSONB,
|
|
30
|
+
ADD COLUMN "senderName" TEXT,
|
|
31
|
+
ADD COLUMN "senderEmail" TEXT,
|
|
32
|
+
ADD COLUMN "senderPhone" TEXT,
|
|
33
|
+
ADD COLUMN "preview" TEXT,
|
|
34
|
+
ADD COLUMN "unread" BOOLEAN NOT NULL DEFAULT true,
|
|
35
|
+
ADD COLUMN "starred" BOOLEAN NOT NULL DEFAULT false,
|
|
36
|
+
ADD COLUMN "archived" BOOLEAN NOT NULL DEFAULT false,
|
|
37
|
+
ADD COLUMN "spamStatus" TEXT NOT NULL DEFAULT 'clean',
|
|
38
|
+
ADD COLUMN "ipAddressHash" TEXT,
|
|
39
|
+
ADD COLUMN "userAgent" TEXT,
|
|
40
|
+
ADD COLUMN "referrer" TEXT,
|
|
41
|
+
ADD COLUMN "pageUrl" TEXT,
|
|
42
|
+
ADD COLUMN "utmSource" TEXT,
|
|
43
|
+
ADD COLUMN "utmMedium" TEXT,
|
|
44
|
+
ADD COLUMN "utmCampaign" TEXT,
|
|
45
|
+
ADD COLUMN "readAt" TIMESTAMP(3),
|
|
46
|
+
ADD COLUMN "archivedAt" TIMESTAMP(3),
|
|
47
|
+
ADD COLUMN "updatedAt" TIMESTAMP(3);
|
|
48
|
+
|
|
49
|
+
-- Backfill updatedAt for existing rows, then enforce NOT NULL with a default
|
|
50
|
+
-- so new inserts (and Prisma's @updatedAt) always have a value.
|
|
51
|
+
UPDATE "actuate_form_submissions" SET "updatedAt" = "createdAt" WHERE "updatedAt" IS NULL;
|
|
52
|
+
ALTER TABLE "actuate_form_submissions"
|
|
53
|
+
ALTER COLUMN "updatedAt" SET NOT NULL,
|
|
54
|
+
ALTER COLUMN "updatedAt" SET DEFAULT CURRENT_TIMESTAMP;
|
|
55
|
+
|
|
56
|
+
-- Existing rows predate the read/unread workflow; treat them as already read so
|
|
57
|
+
-- they don't all light up as unread in the new inbox.
|
|
58
|
+
UPDATE "actuate_form_submissions" SET "unread" = false WHERE "status" <> 'new';
|
|
59
|
+
|
|
60
|
+
CREATE INDEX "actuate_form_submissions_unread_idx" ON "actuate_form_submissions" ("unread");
|
|
61
|
+
CREATE INDEX "actuate_form_submissions_starred_idx" ON "actuate_form_submissions" ("starred");
|
|
62
|
+
CREATE INDEX "actuate_form_submissions_archived_idx" ON "actuate_form_submissions" ("archived");
|
|
63
|
+
CREATE INDEX "actuate_form_submissions_spamStatus_idx" ON "actuate_form_submissions" ("spamStatus");
|
|
64
|
+
CREATE INDEX "actuate_form_submissions_submittedAt_idx" ON "actuate_form_submissions" ("submittedAt");
|
|
65
|
+
CREATE INDEX "actuate_form_submissions_senderEmail_idx" ON "actuate_form_submissions" ("senderEmail");
|
|
66
|
+
|
|
67
|
+
-- ---------------------------------------------------------------------------
|
|
68
|
+
-- actuate_form_schema_versions
|
|
69
|
+
-- ---------------------------------------------------------------------------
|
|
70
|
+
CREATE TABLE "actuate_form_schema_versions" (
|
|
71
|
+
"id" TEXT NOT NULL,
|
|
72
|
+
"formId" TEXT NOT NULL,
|
|
73
|
+
"version" INTEGER NOT NULL,
|
|
74
|
+
"fields" JSONB NOT NULL,
|
|
75
|
+
"notes" TEXT,
|
|
76
|
+
"createdById" TEXT,
|
|
77
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
78
|
+
CONSTRAINT "actuate_form_schema_versions_pkey" PRIMARY KEY ("id")
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE UNIQUE INDEX "actuate_form_schema_versions_formId_version_key"
|
|
82
|
+
ON "actuate_form_schema_versions" ("formId", "version");
|
|
83
|
+
CREATE INDEX "actuate_form_schema_versions_formId_idx"
|
|
84
|
+
ON "actuate_form_schema_versions" ("formId");
|
|
85
|
+
|
|
86
|
+
-- ---------------------------------------------------------------------------
|
|
87
|
+
-- actuate_form_submission_files
|
|
88
|
+
-- ---------------------------------------------------------------------------
|
|
89
|
+
CREATE TABLE "actuate_form_submission_files" (
|
|
90
|
+
"id" TEXT NOT NULL,
|
|
91
|
+
"submissionId" TEXT NOT NULL,
|
|
92
|
+
"fieldKey" TEXT NOT NULL,
|
|
93
|
+
"mediaAssetId" TEXT,
|
|
94
|
+
"fileName" TEXT NOT NULL,
|
|
95
|
+
"mimeType" TEXT NOT NULL,
|
|
96
|
+
"sizeBytes" INTEGER NOT NULL,
|
|
97
|
+
"storageKey" TEXT NOT NULL,
|
|
98
|
+
"publicUrl" TEXT,
|
|
99
|
+
"secureDownloadUrl" TEXT,
|
|
100
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
101
|
+
CONSTRAINT "actuate_form_submission_files_pkey" PRIMARY KEY ("id")
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE INDEX "actuate_form_submission_files_submissionId_idx"
|
|
105
|
+
ON "actuate_form_submission_files" ("submissionId");
|
|
106
|
+
|
|
107
|
+
ALTER TABLE "actuate_form_submission_files"
|
|
108
|
+
ADD CONSTRAINT "actuate_form_submission_files_submissionId_fkey"
|
|
109
|
+
FOREIGN KEY ("submissionId") REFERENCES "actuate_form_submissions"("id")
|
|
110
|
+
ON DELETE CASCADE ON UPDATE CASCADE;
|
|
111
|
+
|
|
112
|
+
-- ---------------------------------------------------------------------------
|
|
113
|
+
-- actuate_form_webhooks
|
|
114
|
+
-- ---------------------------------------------------------------------------
|
|
115
|
+
CREATE TABLE "actuate_form_webhooks" (
|
|
116
|
+
"id" TEXT NOT NULL,
|
|
117
|
+
"formId" TEXT NOT NULL,
|
|
118
|
+
"url" TEXT NOT NULL,
|
|
119
|
+
"secret" TEXT NOT NULL,
|
|
120
|
+
"enabled" BOOLEAN NOT NULL DEFAULT true,
|
|
121
|
+
"events" JSONB NOT NULL,
|
|
122
|
+
"retryCount" INTEGER NOT NULL DEFAULT 0,
|
|
123
|
+
"lastDeliveryAt" TIMESTAMP(3),
|
|
124
|
+
"lastDeliveryStatus" TEXT,
|
|
125
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
126
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
127
|
+
CONSTRAINT "actuate_form_webhooks_pkey" PRIMARY KEY ("id")
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
CREATE INDEX "actuate_form_webhooks_formId_idx" ON "actuate_form_webhooks" ("formId");
|