@prenta/core 8.9.2 → 8.11.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 +105 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +51 -4
- package/dist/actions.js.map +1 -1
- package/dist/ai/batch-links.d.ts +105 -0
- package/dist/ai/batch-links.d.ts.map +1 -0
- package/dist/ai/batch-links.js +667 -0
- package/dist/ai/batch-links.js.map +1 -0
- package/dist/ai/batch-list.d.ts +127 -4
- package/dist/ai/batch-list.d.ts.map +1 -1
- package/dist/ai/batch-list.js +250 -14
- package/dist/ai/batch-list.js.map +1 -1
- package/dist/ai/providers/http.d.ts +4 -0
- package/dist/ai/providers/http.d.ts.map +1 -1
- package/dist/ai/providers/http.js +9 -8
- package/dist/ai/providers/http.js.map +1 -1
- package/dist/ai/tasks/editor-text.d.ts +39 -0
- package/dist/ai/tasks/editor-text.d.ts.map +1 -0
- package/dist/ai/tasks/editor-text.js +45 -0
- package/dist/ai/tasks/editor-text.js.map +1 -0
- package/dist/ai/tasks/link-embeddings.d.ts +22 -0
- package/dist/ai/tasks/link-embeddings.d.ts.map +1 -1
- package/dist/ai/tasks/link-embeddings.js +24 -10
- package/dist/ai/tasks/link-embeddings.js.map +1 -1
- package/dist/ai/usage.d.ts +7 -0
- package/dist/ai/usage.d.ts.map +1 -1
- package/dist/ai/usage.js +11 -0
- package/dist/ai/usage.js.map +1 -1
- package/dist/api/guarded-db.d.ts +6 -0
- package/dist/api/guarded-db.d.ts.map +1 -1
- package/dist/api/guarded-db.js +13 -1
- package/dist/api/guarded-db.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +2 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +103 -0
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/route-helpers/forms.d.ts.map +1 -1
- package/dist/api/route-helpers/forms.js +7 -1
- package/dist/api/route-helpers/forms.js.map +1 -1
- package/dist/api/routes/ai-authoring.d.ts.map +1 -1
- package/dist/api/routes/ai-authoring.js +1 -0
- package/dist/api/routes/ai-authoring.js.map +1 -1
- package/dist/api/routes/ai-seo.d.ts.map +1 -1
- package/dist/api/routes/ai-seo.js +20 -18
- package/dist/api/routes/ai-seo.js.map +1 -1
- package/dist/api/routes/media.d.ts.map +1 -1
- package/dist/api/routes/media.js +3 -1
- package/dist/api/routes/media.js.map +1 -1
- package/dist/api/routes/scheduling.d.ts.map +1 -1
- package/dist/api/routes/scheduling.js +33 -2
- package/dist/api/routes/scheduling.js.map +1 -1
- package/dist/appearance/color.d.ts +17 -0
- package/dist/appearance/color.d.ts.map +1 -1
- package/dist/appearance/color.js +162 -1
- package/dist/appearance/color.js.map +1 -1
- package/dist/appearance/index.d.ts +3 -3
- package/dist/appearance/index.d.ts.map +1 -1
- package/dist/appearance/index.js +2 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/appearance/resolve.d.ts.map +1 -1
- package/dist/appearance/resolve.js +4 -2
- package/dist/appearance/resolve.js.map +1 -1
- package/dist/appearance/theme-tokens.d.ts +60 -11
- package/dist/appearance/theme-tokens.d.ts.map +1 -1
- package/dist/appearance/theme-tokens.js +184 -175
- package/dist/appearance/theme-tokens.js.map +1 -1
- package/dist/appearance/types.d.ts +16 -2
- package/dist/appearance/types.d.ts.map +1 -1
- package/dist/astro-site.d.ts +1 -11
- package/dist/astro-site.d.ts.map +1 -1
- package/dist/astro-site.js +4 -0
- package/dist/astro-site.js.map +1 -1
- package/dist/auth/team.d.ts +1 -0
- package/dist/auth/team.d.ts.map +1 -1
- package/dist/auth/team.js +1 -1
- package/dist/auth/team.js.map +1 -1
- package/dist/cache/http.d.ts +20 -0
- package/dist/cache/http.d.ts.map +1 -1
- package/dist/cache/http.js +42 -0
- package/dist/cache/http.js.map +1 -1
- package/dist/chrome/announcement.d.ts +30 -0
- package/dist/chrome/announcement.d.ts.map +1 -0
- package/dist/chrome/announcement.js +190 -0
- package/dist/chrome/announcement.js.map +1 -0
- package/dist/chrome/codegen.d.ts +17 -0
- package/dist/chrome/codegen.d.ts.map +1 -0
- package/dist/chrome/codegen.js +96 -0
- package/dist/chrome/codegen.js.map +1 -0
- package/dist/chrome/contract.d.ts +161 -0
- package/dist/chrome/contract.d.ts.map +1 -0
- package/dist/chrome/contract.js +2 -0
- package/dist/chrome/contract.js.map +1 -0
- package/dist/chrome/memory-store.d.ts +15 -0
- package/dist/chrome/memory-store.d.ts.map +1 -0
- package/dist/chrome/memory-store.js +54 -0
- package/dist/chrome/memory-store.js.map +1 -0
- package/dist/chrome/overrides.d.ts +25 -0
- package/dist/chrome/overrides.d.ts.map +1 -0
- package/dist/chrome/overrides.js +180 -0
- package/dist/chrome/overrides.js.map +1 -0
- package/dist/chrome/parse.d.ts +36 -0
- package/dist/chrome/parse.d.ts.map +1 -0
- package/dist/chrome/parse.js +277 -0
- package/dist/chrome/parse.js.map +1 -0
- package/dist/chrome/prisma-store.d.ts +11 -0
- package/dist/chrome/prisma-store.d.ts.map +1 -0
- package/dist/chrome/prisma-store.js +48 -0
- package/dist/chrome/prisma-store.js.map +1 -0
- package/dist/chrome/public.d.ts +22 -0
- package/dist/chrome/public.d.ts.map +1 -0
- package/dist/chrome/public.js +181 -0
- package/dist/chrome/public.js.map +1 -0
- package/dist/chrome/resolve.d.ts +36 -0
- package/dist/chrome/resolve.d.ts.map +1 -0
- package/dist/chrome/resolve.js +165 -0
- package/dist/chrome/resolve.js.map +1 -0
- package/dist/chrome/revalidate.d.ts +9 -0
- package/dist/chrome/revalidate.d.ts.map +1 -0
- package/dist/chrome/revalidate.js +51 -0
- package/dist/chrome/revalidate.js.map +1 -0
- package/dist/chrome/routes.d.ts +14 -0
- package/dist/chrome/routes.d.ts.map +1 -0
- package/dist/chrome/routes.js +349 -0
- package/dist/chrome/routes.js.map +1 -0
- package/dist/chrome/schema.d.ts +231 -0
- package/dist/chrome/schema.d.ts.map +1 -0
- package/dist/chrome/schema.js +73 -0
- package/dist/chrome/schema.js.map +1 -0
- package/dist/chrome/service.d.ts +76 -0
- package/dist/chrome/service.d.ts.map +1 -0
- package/dist/chrome/service.js +286 -0
- package/dist/chrome/service.js.map +1 -0
- package/dist/chrome/settings.d.ts +14 -0
- package/dist/chrome/settings.d.ts.map +1 -0
- package/dist/chrome/settings.js +142 -0
- package/dist/chrome/settings.js.map +1 -0
- package/dist/chrome/store.d.ts +48 -0
- package/dist/chrome/store.d.ts.map +1 -0
- package/dist/chrome/store.js +26 -0
- package/dist/chrome/store.js.map +1 -0
- package/dist/chrome/values.d.ts +98 -0
- package/dist/chrome/values.d.ts.map +1 -0
- package/dist/chrome/values.js +491 -0
- package/dist/chrome/values.js.map +1 -0
- package/dist/config/define.d.ts +2 -0
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/define.js +2 -0
- package/dist/config/define.js.map +1 -1
- package/dist/db/model-types.d.ts +62 -0
- package/dist/db/model-types.d.ts.map +1 -1
- package/dist/forms/attribution-settings.d.ts +23 -0
- package/dist/forms/attribution-settings.d.ts.map +1 -0
- package/dist/forms/attribution-settings.js +42 -0
- package/dist/forms/attribution-settings.js.map +1 -0
- package/dist/forms/attribution.d.ts +5 -1
- package/dist/forms/attribution.d.ts.map +1 -1
- package/dist/forms/attribution.js +6 -4
- package/dist/forms/attribution.js.map +1 -1
- package/dist/forms/client-validation.d.ts.map +1 -1
- package/dist/forms/client-validation.js +3 -0
- package/dist/forms/client-validation.js.map +1 -1
- package/dist/forms/form-model.d.ts +109 -0
- package/dist/forms/form-model.d.ts.map +1 -0
- package/dist/forms/form-model.js +192 -0
- package/dist/forms/form-model.js.map +1 -0
- package/dist/forms/index.d.ts +2 -2
- 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/service.d.ts +19 -1
- package/dist/forms/service.d.ts.map +1 -1
- package/dist/forms/service.js +152 -0
- package/dist/forms/service.js.map +1 -1
- package/dist/forms/spam.d.ts +0 -12
- package/dist/forms/spam.d.ts.map +1 -1
- package/dist/forms/spam.js +30 -0
- package/dist/forms/spam.js.map +1 -1
- package/dist/forms/submission.d.ts +7 -0
- package/dist/forms/submission.d.ts.map +1 -1
- package/dist/forms/submission.js +33 -0
- package/dist/forms/submission.js.map +1 -1
- package/dist/forms/types.d.ts +26 -1
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/types.js +9 -1
- package/dist/forms/types.js.map +1 -1
- package/dist/generated/browser.d.ts +35 -3
- package/dist/generated/client.d.ts +35 -3
- package/dist/generated/internal/class.d.ts +44 -0
- package/dist/generated/internal/class.js +4 -4
- package/dist/generated/internal/prismaNamespace.d.ts +403 -1
- package/dist/generated/internal/prismaNamespace.js +95 -1
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +102 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +95 -1
- package/dist/generated/models/ChromeRegion.d.ts +1203 -0
- package/dist/generated/models/ChromeRegion.js +1 -0
- package/dist/generated/models/Job.d.ts +732 -5
- package/dist/generated/models/JobEvent.d.ts +1339 -0
- package/dist/generated/models/JobEvent.js +1 -0
- package/dist/generated/models/JobReviewItem.d.ts +1470 -0
- package/dist/generated/models/JobReviewItem.js +1 -0
- package/dist/generated/models/SystemSetting.d.ts +952 -0
- package/dist/generated/models/SystemSetting.js +1 -0
- package/dist/generated/models.d.ts +4 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/jobs/batch-ai.d.ts +53 -0
- package/dist/jobs/batch-ai.d.ts.map +1 -0
- package/dist/jobs/batch-ai.js +314 -0
- package/dist/jobs/batch-ai.js.map +1 -0
- package/dist/jobs/contract.d.ts +193 -0
- package/dist/jobs/contract.d.ts.map +1 -0
- package/dist/jobs/contract.js +2 -0
- package/dist/jobs/contract.js.map +1 -0
- package/dist/jobs/error-text.d.ts +23 -0
- package/dist/jobs/error-text.d.ts.map +1 -0
- package/dist/jobs/error-text.js +110 -0
- package/dist/jobs/error-text.js.map +1 -0
- package/dist/jobs/handlers.d.ts.map +1 -1
- package/dist/jobs/handlers.js +48 -7
- package/dist/jobs/handlers.js.map +1 -1
- package/dist/jobs/memory-store.d.ts +26 -2
- package/dist/jobs/memory-store.d.ts.map +1 -1
- package/dist/jobs/memory-store.js +157 -3
- package/dist/jobs/memory-store.js.map +1 -1
- package/dist/jobs/outcomes.d.ts +46 -0
- package/dist/jobs/outcomes.d.ts.map +1 -0
- package/dist/jobs/outcomes.js +251 -0
- package/dist/jobs/outcomes.js.map +1 -0
- package/dist/jobs/prisma-store.d.ts +14 -2
- package/dist/jobs/prisma-store.d.ts.map +1 -1
- package/dist/jobs/prisma-store.js +257 -15
- package/dist/jobs/prisma-store.js.map +1 -1
- package/dist/jobs/queue.d.ts +62 -2
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jobs/queue.js +412 -36
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/retention.d.ts +11 -0
- package/dist/jobs/retention.d.ts.map +1 -0
- package/dist/jobs/retention.js +18 -0
- package/dist/jobs/retention.js.map +1 -0
- package/dist/jobs/review.d.ts +111 -0
- package/dist/jobs/review.d.ts.map +1 -0
- package/dist/jobs/review.js +461 -0
- package/dist/jobs/review.js.map +1 -0
- package/dist/jobs/routes.d.ts.map +1 -1
- package/dist/jobs/routes.js +491 -16
- package/dist/jobs/routes.js.map +1 -1
- package/dist/jobs/serialize.d.ts +40 -0
- package/dist/jobs/serialize.d.ts.map +1 -0
- package/dist/jobs/serialize.js +275 -0
- package/dist/jobs/serialize.js.map +1 -0
- package/dist/jobs/types.d.ts +141 -2
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/worker-status.d.ts +27 -0
- package/dist/jobs/worker-status.d.ts.map +1 -0
- package/dist/jobs/worker-status.js +66 -0
- package/dist/jobs/worker-status.js.map +1 -0
- package/dist/media/optimize.d.ts.map +1 -1
- package/dist/media/optimize.js +4 -2
- package/dist/media/optimize.js.map +1 -1
- package/dist/next-site.d.ts +1 -0
- package/dist/next-site.d.ts.map +1 -1
- package/dist/next-site.js +3 -0
- package/dist/next-site.js.map +1 -1
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +23 -2
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/issue-fix-link-insert.d.ts +11 -0
- package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
- package/dist/seo/issue-fix-link-insert.js +122 -8
- package/dist/seo/issue-fix-link-insert.js.map +1 -1
- package/dist/server-site.d.ts.map +1 -1
- package/dist/server-site.js +15 -0
- package/dist/server-site.js.map +1 -1
- package/dist/site.d.ts +8 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +6 -0
- package/dist/site.js.map +1 -1
- package/dist/webhooks/index.d.ts +3 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js.map +1 -1
- package/package.json +6 -1
- package/prisma/migrations/0025_job_cancel_review/down.sql +60 -0
- package/prisma/migrations/0025_job_cancel_review/migration.sql +56 -0
- package/prisma/migrations/0026_job_creator_system_settings/down.sql +30 -0
- package/prisma/migrations/0026_job_creator_system_settings/migration.sql +14 -0
- package/prisma/migrations/0027_chrome_regions/down.sql +24 -0
- package/prisma/migrations/0027_chrome_regions/migration.sql +16 -0
- package/prisma/schema.prisma +105 -15
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const PRELUDE = `export interface ChromeMenuItem {
|
|
2
|
+
label: string
|
|
3
|
+
url: string
|
|
4
|
+
target?: '_blank' | '_self'
|
|
5
|
+
children?: ChromeMenuItem[]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ChromeMenu {
|
|
9
|
+
id: string
|
|
10
|
+
name: string
|
|
11
|
+
items: ChromeMenuItem[]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ChromeLink {
|
|
15
|
+
label: string
|
|
16
|
+
url: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ChromeSocialLink {
|
|
20
|
+
platform: string
|
|
21
|
+
url: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ChromeLogo {
|
|
25
|
+
url: string
|
|
26
|
+
alt: string
|
|
27
|
+
shape: string
|
|
28
|
+
width?: number
|
|
29
|
+
height?: number
|
|
30
|
+
}`;
|
|
31
|
+
function fieldType(def) {
|
|
32
|
+
switch (def.type) {
|
|
33
|
+
case 'brand':
|
|
34
|
+
return def.key === 'logo' ? 'ChromeLogo | null' : 'string';
|
|
35
|
+
case 'menu':
|
|
36
|
+
return def.list ? 'ChromeMenu[]' : 'ChromeMenu | null';
|
|
37
|
+
case 'link':
|
|
38
|
+
return 'ChromeLink | null';
|
|
39
|
+
case 'text':
|
|
40
|
+
return def.optional ? 'string | null' : 'string';
|
|
41
|
+
case 'textarea':
|
|
42
|
+
return 'string';
|
|
43
|
+
case 'select':
|
|
44
|
+
return def.options.map((option) => JSON.stringify(option)).join(' | ') || 'string';
|
|
45
|
+
case 'boolean':
|
|
46
|
+
return 'boolean';
|
|
47
|
+
case 'social':
|
|
48
|
+
return 'ChromeSocialLink[]';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function comment(text, indent) {
|
|
52
|
+
return `${indent}/** ${text.replace(/\*\//g, '*\\/').replace(/\s+/g, ' ').trim()} */\n`;
|
|
53
|
+
}
|
|
54
|
+
function regionBody(schema, indent) {
|
|
55
|
+
let out = '';
|
|
56
|
+
for (const [key, def] of Object.entries(schema.fields)) {
|
|
57
|
+
const note = [def.label, def.help].filter(Boolean).join(': ');
|
|
58
|
+
if (note)
|
|
59
|
+
out += comment(note, indent);
|
|
60
|
+
out += `${indent}${key}: ${fieldType(def)}\n`;
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/** TypeScript source for `ChromeFields` and `ChromeVariants`. */
|
|
65
|
+
export function chromeTypesSource(regions) {
|
|
66
|
+
const source = regions.find((region) => region.source)?.source;
|
|
67
|
+
const header = [
|
|
68
|
+
'// Generated by `prenta types` from .prenta/chrome.json. Do not edit.',
|
|
69
|
+
...(source
|
|
70
|
+
? [
|
|
71
|
+
`// Schema: ${source.repo || 'unknown repo'}@${source.commit || 'unknown'}, read ${source.readAt}`,
|
|
72
|
+
]
|
|
73
|
+
: []),
|
|
74
|
+
].join('\n');
|
|
75
|
+
const fields = regions
|
|
76
|
+
.map((region) => ` ${region.region}: {\n${regionBody(region, ' ')} }\n`)
|
|
77
|
+
.join('');
|
|
78
|
+
const variants = regions
|
|
79
|
+
.map((region) => ` ${region.region}: ${Object.keys(region.variants)
|
|
80
|
+
.map((id) => JSON.stringify(id))
|
|
81
|
+
.join(' | ') || 'string'}\n`)
|
|
82
|
+
.join('');
|
|
83
|
+
return `${header}
|
|
84
|
+
|
|
85
|
+
${PRELUDE}
|
|
86
|
+
|
|
87
|
+
/** What \`getChrome\` returns in each region's \`fields\`. */
|
|
88
|
+
export interface ChromeFields {
|
|
89
|
+
${fields}}
|
|
90
|
+
|
|
91
|
+
/** Each region's variant ids. */
|
|
92
|
+
export interface ChromeVariants {
|
|
93
|
+
${variants}}
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/chrome/codegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Site chrome API shapes (DATA_CONTRACTS §2), as `/chrome/*` and
|
|
3
|
+
* `/public/chrome` return them.
|
|
4
|
+
*/
|
|
5
|
+
import type { UserRef } from '../jobs/contract.js';
|
|
6
|
+
import type { ChromeFieldsOf, ChromeLinkValue, ChromeRegionName, FieldDef, RegionDefinition, RegionFieldValues } from './schema.js';
|
|
7
|
+
/** Where a schema was read from. `readAt` is when the CMS stored it. */
|
|
8
|
+
export interface RegionSchemaSource {
|
|
9
|
+
repo: string;
|
|
10
|
+
branch: string;
|
|
11
|
+
commit: string;
|
|
12
|
+
readAt: string;
|
|
13
|
+
}
|
|
14
|
+
/** One region's schema, as the site sent it on deploy. */
|
|
15
|
+
export interface RegionSchema {
|
|
16
|
+
region: ChromeRegionName;
|
|
17
|
+
component: string;
|
|
18
|
+
variants: Record<string, string>;
|
|
19
|
+
fields: Record<string, FieldDef>;
|
|
20
|
+
source: RegionSchemaSource;
|
|
21
|
+
}
|
|
22
|
+
/** A saved value the schema doesn't have any more. It's purged 30 days after `orphanedAt`. */
|
|
23
|
+
export interface ChromeOrphan {
|
|
24
|
+
key: string;
|
|
25
|
+
value: unknown;
|
|
26
|
+
orphanedAt: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `GET /chrome/:region`. Optional fields store `{ on, ...value }`. Pass the
|
|
30
|
+
* site's region (`RegionValues<typeof header>`) to type `fields`.
|
|
31
|
+
*/
|
|
32
|
+
export interface RegionValues<R extends RegionDefinition | undefined = undefined> {
|
|
33
|
+
region: ChromeRegionName;
|
|
34
|
+
variant: R extends RegionDefinition ? Extract<keyof R['variants'], string> : string;
|
|
35
|
+
fields: R extends RegionDefinition ? RegionFieldValues<R> : Record<string, unknown>;
|
|
36
|
+
orphans: ChromeOrphan[];
|
|
37
|
+
/** Who last saved the region, or pushed the schema that changed it. Null before the first write. */
|
|
38
|
+
updatedBy: UserRef | null;
|
|
39
|
+
updatedAt: string | null;
|
|
40
|
+
}
|
|
41
|
+
/** `GET /chrome/schema`: whether the CMS has read the site's schema, and from where. */
|
|
42
|
+
export interface ChromeSyncStatus {
|
|
43
|
+
/** `never` until the first `prenta push chrome`. */
|
|
44
|
+
status: 'synced' | 'never';
|
|
45
|
+
/** The most recent schema read. */
|
|
46
|
+
source: RegionSchemaSource | null;
|
|
47
|
+
regions: ChromeRegionName[];
|
|
48
|
+
fieldCount: number;
|
|
49
|
+
}
|
|
50
|
+
export type AnnouncementTone = 'brand' | 'dark' | 'alert';
|
|
51
|
+
export interface AnnouncementSchedule {
|
|
52
|
+
startsAt: string | null;
|
|
53
|
+
endsAt: string | null;
|
|
54
|
+
}
|
|
55
|
+
/** `GET /chrome/announcement`. */
|
|
56
|
+
export interface Announcement {
|
|
57
|
+
/** Changes whenever the text, link or tone changes, so a dismissed visitor sees a new message. */
|
|
58
|
+
id: string;
|
|
59
|
+
on: boolean;
|
|
60
|
+
/** At most 110 characters. */
|
|
61
|
+
text: string;
|
|
62
|
+
link: ChromeLinkValue | null;
|
|
63
|
+
tone: AnnouncementTone;
|
|
64
|
+
dismissible: boolean;
|
|
65
|
+
schedule: AnnouncementSchedule | null;
|
|
66
|
+
}
|
|
67
|
+
/** The announcement as the site receives it, only while it's on and inside its schedule. */
|
|
68
|
+
export interface PublicAnnouncement {
|
|
69
|
+
id: string;
|
|
70
|
+
text: string;
|
|
71
|
+
link: ChromeLinkValue | null;
|
|
72
|
+
tone: AnnouncementTone;
|
|
73
|
+
dismissible: boolean;
|
|
74
|
+
endsAt: string | null;
|
|
75
|
+
}
|
|
76
|
+
/** `GET/PUT /chrome/settings`. */
|
|
77
|
+
export interface ChromeSettings {
|
|
78
|
+
/** Signed `chrome.updated` webhook target. Only admins see it; null for everyone else. */
|
|
79
|
+
revalidateUrl: string | null;
|
|
80
|
+
previewUrl: string | null;
|
|
81
|
+
}
|
|
82
|
+
/** A region as the site receives it. */
|
|
83
|
+
export interface PublicChromeRegion<F = Record<string, unknown>> {
|
|
84
|
+
variant: string;
|
|
85
|
+
fields: F;
|
|
86
|
+
}
|
|
87
|
+
/** What types each region's `fields` in {@link PublicChrome}, such as the generated `ChromeFields`. */
|
|
88
|
+
export interface ChromeFieldsShape {
|
|
89
|
+
header?: unknown;
|
|
90
|
+
footer?: unknown;
|
|
91
|
+
}
|
|
92
|
+
export interface DefaultChromeFields {
|
|
93
|
+
header: Record<string, unknown>;
|
|
94
|
+
footer: Record<string, unknown>;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* `GET /public/chrome?path=`. A region is `null` when the page hides it, and
|
|
98
|
+
* missing when the site hasn't defined it with `defineRegion` (it then still
|
|
99
|
+
* uses the layout variants `/resolve` returns). Pass the generated
|
|
100
|
+
* `ChromeFields` (or `{ header: ChromeFieldsOf<typeof header> }`) to type `fields`.
|
|
101
|
+
*/
|
|
102
|
+
export interface PublicChrome<T extends ChromeFieldsShape = DefaultChromeFields> {
|
|
103
|
+
header?: PublicChromeRegion<T['header']> | null;
|
|
104
|
+
footer?: PublicChromeRegion<T['footer']> | null;
|
|
105
|
+
announcement: PublicAnnouncement | null;
|
|
106
|
+
etag: string;
|
|
107
|
+
}
|
|
108
|
+
/** `PublicChrome` typed from the site's own region definitions. */
|
|
109
|
+
export type PublicChromeOf<H extends RegionDefinition | undefined = undefined, F extends RegionDefinition | undefined = undefined> = PublicChrome<{
|
|
110
|
+
header: H extends RegionDefinition ? ChromeFieldsOf<H> : Record<string, unknown>;
|
|
111
|
+
footer: F extends RegionDefinition ? ChromeFieldsOf<F> : Record<string, unknown>;
|
|
112
|
+
}>;
|
|
113
|
+
/** What one region's override on a page (`_layout.header`) holds. `null` hides the region. */
|
|
114
|
+
export interface ChromeRegionOverride {
|
|
115
|
+
variant?: string;
|
|
116
|
+
fields?: Record<string, unknown>;
|
|
117
|
+
}
|
|
118
|
+
/** `PageChromeOverride` (DATA_CONTRACTS §2): stored in the page's `_layout`, inherited by child paths. */
|
|
119
|
+
export interface PageChromeOverride {
|
|
120
|
+
pageId: string;
|
|
121
|
+
header?: ChromeRegionOverride | null;
|
|
122
|
+
footer?: ChromeRegionOverride | null;
|
|
123
|
+
}
|
|
124
|
+
/** A published page whose `_layout` overrides the header, the footer or both. */
|
|
125
|
+
export interface ChromePageOverrides {
|
|
126
|
+
/** The page's document id. */
|
|
127
|
+
id: string;
|
|
128
|
+
collection: string;
|
|
129
|
+
title: string;
|
|
130
|
+
/** The page's public path, such as `/seo-audit`. Child paths inherit its overrides. */
|
|
131
|
+
path: string;
|
|
132
|
+
locale: string | null;
|
|
133
|
+
/** Left out when the page doesn't override the region; `null` hides it. */
|
|
134
|
+
header?: ChromeRegionOverride | null;
|
|
135
|
+
footer?: ChromeRegionOverride | null;
|
|
136
|
+
}
|
|
137
|
+
/** `GET /chrome/overrides`: the pages with an override, sorted by path. */
|
|
138
|
+
export interface ChromeOverridesList {
|
|
139
|
+
pages: ChromePageOverrides[];
|
|
140
|
+
/** True when there are more than the 200 most recently changed pages shown. */
|
|
141
|
+
truncated: boolean;
|
|
142
|
+
}
|
|
143
|
+
/** `PUT /chrome/schema`: what changed in the stored values. */
|
|
144
|
+
export interface ChromeSchemaReadResult {
|
|
145
|
+
regions: Array<{
|
|
146
|
+
region: ChromeRegionName;
|
|
147
|
+
/** Saved values the new schema doesn't have, now orphans. */
|
|
148
|
+
orphaned: string[];
|
|
149
|
+
/** `renamedFrom` → key pairs whose value moved over. */
|
|
150
|
+
renamed: Array<{
|
|
151
|
+
from: string;
|
|
152
|
+
to: string;
|
|
153
|
+
}>;
|
|
154
|
+
/** Orphans that came back because their field did. */
|
|
155
|
+
restored: string[];
|
|
156
|
+
/** True when the region's schema or values changed. */
|
|
157
|
+
changed: boolean;
|
|
158
|
+
}>;
|
|
159
|
+
source: RegionSchemaSource;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/chrome/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/chrome/contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ChromeRow, type ChromeRowPatch, type ChromeStore, type ChromeWriteOptions } from './store.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory chrome store for tests. JSON columns are copied as JSONB would
|
|
4
|
+
* store them, key order included, so callers never share objects with it and
|
|
5
|
+
* code that relies on key order fails here as it would in production.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MemoryChromeStore implements ChromeStore {
|
|
8
|
+
readonly rows: Map<string, ChromeRow>;
|
|
9
|
+
private copy;
|
|
10
|
+
get(region: string): Promise<ChromeRow | null>;
|
|
11
|
+
list(): Promise<ChromeRow[]>;
|
|
12
|
+
ensure(region: string, now?: Date): Promise<void>;
|
|
13
|
+
update(row: ChromeRow, patch: ChromeRowPatch, now: Date, options?: ChromeWriteOptions): Promise<ChromeRow | null>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/chrome/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAA;AAiBnB;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,yBAA+B;IAE5C,OAAO,CAAC,IAAI;IAUN,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK9C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAI5B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,MAAM,CACV,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,IAAI,EACT,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAO7B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { emptyRow, patchedRow, } from './store.js';
|
|
2
|
+
/** Copy a JSON value the way Postgres JSONB stores it: object keys sorted by length, then bytes. */
|
|
3
|
+
function jsonb(value) {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return value.map(jsonb);
|
|
6
|
+
if (typeof value !== 'object' || value === null)
|
|
7
|
+
return value;
|
|
8
|
+
const keys = Object.keys(value).sort((a, b) => a.length !== b.length ? a.length - b.length : a < b ? -1 : a > b ? 1 : 0);
|
|
9
|
+
const out = {};
|
|
10
|
+
for (const key of keys) {
|
|
11
|
+
const item = value[key];
|
|
12
|
+
if (item !== undefined)
|
|
13
|
+
out[key] = jsonb(item);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* In-memory chrome store for tests. JSON columns are copied as JSONB would
|
|
19
|
+
* store them, key order included, so callers never share objects with it and
|
|
20
|
+
* code that relies on key order fails here as it would in production.
|
|
21
|
+
*/
|
|
22
|
+
export class MemoryChromeStore {
|
|
23
|
+
rows = new Map();
|
|
24
|
+
copy(row) {
|
|
25
|
+
return {
|
|
26
|
+
...row,
|
|
27
|
+
schema: jsonb(row.schema),
|
|
28
|
+
values: jsonb(row.values),
|
|
29
|
+
orphans: jsonb(row.orphans),
|
|
30
|
+
state: jsonb(row.state),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async get(region) {
|
|
34
|
+
const row = this.rows.get(region);
|
|
35
|
+
return row ? this.copy(row) : null;
|
|
36
|
+
}
|
|
37
|
+
async list() {
|
|
38
|
+
return [...this.rows.values()].map((row) => this.copy(row));
|
|
39
|
+
}
|
|
40
|
+
async ensure(region, now) {
|
|
41
|
+
// As the database row: created with `updatedAt` set.
|
|
42
|
+
if (!this.rows.has(region))
|
|
43
|
+
this.rows.set(region, { ...emptyRow(region), updatedAt: now ?? null });
|
|
44
|
+
}
|
|
45
|
+
async update(row, patch, now, options) {
|
|
46
|
+
const current = this.rows.get(row.region);
|
|
47
|
+
if (!current || current.version !== row.version)
|
|
48
|
+
return null;
|
|
49
|
+
const next = this.copy(patchedRow(current, patch, now, options));
|
|
50
|
+
this.rows.set(row.region, next);
|
|
51
|
+
return this.copy(next);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/chrome/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pages that override a region, for the Header & Footer screen's "Page
|
|
3
|
+
* overrides" card (`GET /chrome/overrides`). Overrides live in each page's
|
|
4
|
+
* `_layout` (`_layout.header = {variant?, fields?} | null`), so this reads them
|
|
5
|
+
* out of the documents table. Only PUBLISHED pages count, as in
|
|
6
|
+
* `loadPublicChrome`: a draft's override never reaches the site.
|
|
7
|
+
*
|
|
8
|
+
* On Postgres one query picks the rows and returns only the two `_layout`
|
|
9
|
+
* keys and what the path needs, never the page body. SQLite and MySQL have no
|
|
10
|
+
* `jsonb` operators, so there the published documents are read a page at a
|
|
11
|
+
* time, newest first, and the same rules applied here. A legacy string (a
|
|
12
|
+
* variant-document id) isn't an override, so it's skipped, as `/public/chrome`
|
|
13
|
+
* skips it.
|
|
14
|
+
*/
|
|
15
|
+
import type { PrentaCMSConfig } from '../config/types.js';
|
|
16
|
+
import type { PrentaDB } from '../db/client-types.js';
|
|
17
|
+
import { type DatabaseProvider } from '../db/create-adapter.js';
|
|
18
|
+
import type { ChromeOverridesList } from './contract.js';
|
|
19
|
+
/** The published pages with a header or footer override, sorted by path. */
|
|
20
|
+
export declare function listChromeOverrides(db: Pick<PrentaDB, '$queryRawUnsafe' | 'document'>, config: Pick<PrentaCMSConfig, 'collections'> | null, options?: {
|
|
21
|
+
canRead?: (collection: string) => boolean | Promise<boolean>;
|
|
22
|
+
/** The database the client talks to. Defaults to the one `DATABASE_URL` names. */
|
|
23
|
+
provider?: DatabaseProvider;
|
|
24
|
+
}): Promise<ChromeOverridesList>;
|
|
25
|
+
//# sourceMappingURL=overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overrides.d.ts","sourceRoot":"","sources":["../../src/chrome/overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,eAAe,CAAA;AA8K7E,4EAA4E;AAC5E,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,UAAU,CAAC,EAClD,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,EACnD,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5D,kFAAkF;IAClF,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CACvB,GACL,OAAO,CAAC,mBAAmB,CAAC,CA0B9B"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { detectProvider } from '../db/create-adapter.js';
|
|
2
|
+
import { documentPublicPath } from '../seo/document-path.js';
|
|
3
|
+
import { readRegionOverride } from './resolve.js';
|
|
4
|
+
import { CHROME_REGIONS } from './schema.js';
|
|
5
|
+
/** The most pages the card lists. The newest overrides win. */
|
|
6
|
+
const CHROME_OVERRIDES_LIMIT = 200;
|
|
7
|
+
/** Without `jsonb`: published documents read per page. */
|
|
8
|
+
const SCAN_PAGE = 200;
|
|
9
|
+
/** Without `jsonb`: the most published documents read; past it the list says it's truncated. */
|
|
10
|
+
const SCAN_MAX = 5000;
|
|
11
|
+
const OVERRIDES_SQL = `
|
|
12
|
+
SELECT
|
|
13
|
+
id,
|
|
14
|
+
collection,
|
|
15
|
+
title,
|
|
16
|
+
slug,
|
|
17
|
+
locale,
|
|
18
|
+
data->>'path' AS "dataPath",
|
|
19
|
+
data->>'slug' AS "dataSlug",
|
|
20
|
+
data->>'title' AS "dataTitle",
|
|
21
|
+
(data #> '{_layout,header}')::text AS header,
|
|
22
|
+
(data #> '{_layout,footer}')::text AS footer
|
|
23
|
+
FROM "prenta_documents"
|
|
24
|
+
WHERE "deletedAt" IS NULL
|
|
25
|
+
AND status = 'PUBLISHED'
|
|
26
|
+
AND jsonb_typeof(data) = 'object'
|
|
27
|
+
AND jsonb_typeof(data -> '_layout') = 'object'
|
|
28
|
+
AND (
|
|
29
|
+
jsonb_typeof(data #> '{_layout,header}') IN ('object', 'null')
|
|
30
|
+
OR jsonb_typeof(data #> '{_layout,footer}') IN ('object', 'null')
|
|
31
|
+
)
|
|
32
|
+
ORDER BY "updatedAt" DESC, id ASC
|
|
33
|
+
LIMIT $1`;
|
|
34
|
+
function text(value) {
|
|
35
|
+
return typeof value === 'string' && value.trim() ? value : null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The override in one `_layout` key. The query sends it as JSON text because
|
|
39
|
+
* a driver turns both JSON `null` (hide the region) and a missing key (no
|
|
40
|
+
* override) into `null`.
|
|
41
|
+
*/
|
|
42
|
+
function overrideFrom(json) {
|
|
43
|
+
if (json === null)
|
|
44
|
+
return undefined;
|
|
45
|
+
try {
|
|
46
|
+
return readRegionOverride(JSON.parse(json));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** One row as the card shows it, or null when neither region holds an override. */
|
|
53
|
+
function toPageOverrides(row, config) {
|
|
54
|
+
const page = {
|
|
55
|
+
id: row.id,
|
|
56
|
+
collection: row.collection,
|
|
57
|
+
title: text(row.title) ?? text(row.dataTitle) ?? text(row.slug) ?? text(row.dataSlug) ?? '',
|
|
58
|
+
path: documentPublicPath({
|
|
59
|
+
urlPrefix: config?.collections?.[row.collection]?.urlPrefix,
|
|
60
|
+
slug: text(row.slug) ?? text(row.dataSlug),
|
|
61
|
+
path: text(row.dataPath),
|
|
62
|
+
}),
|
|
63
|
+
locale: text(row.locale),
|
|
64
|
+
};
|
|
65
|
+
let any = false;
|
|
66
|
+
for (const region of CHROME_REGIONS) {
|
|
67
|
+
const override = overrideFrom(row[region]);
|
|
68
|
+
if (override === undefined)
|
|
69
|
+
continue;
|
|
70
|
+
page[region] = override;
|
|
71
|
+
any = true;
|
|
72
|
+
}
|
|
73
|
+
return any ? page : null;
|
|
74
|
+
}
|
|
75
|
+
function isObject(value) {
|
|
76
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* One region's override as JSON text, as the Postgres query sends it: an
|
|
80
|
+
* object, or `null` to hide the region. A missing key, a legacy string or any
|
|
81
|
+
* other value is no override (SQL NULL there).
|
|
82
|
+
*/
|
|
83
|
+
function regionJson(layout, region) {
|
|
84
|
+
if (!Object.prototype.hasOwnProperty.call(layout, region))
|
|
85
|
+
return null;
|
|
86
|
+
const value = layout[region];
|
|
87
|
+
return value === null || isObject(value) ? JSON.stringify(value) : null;
|
|
88
|
+
}
|
|
89
|
+
/** A document as {@link OVERRIDES_SQL} would return it, or null when the query would skip it. */
|
|
90
|
+
function rowFromDocument(doc) {
|
|
91
|
+
const data = doc.data;
|
|
92
|
+
if (!isObject(data) || !isObject(data._layout))
|
|
93
|
+
return null;
|
|
94
|
+
const header = regionJson(data._layout, 'header');
|
|
95
|
+
const footer = regionJson(data._layout, 'footer');
|
|
96
|
+
if (header === null && footer === null)
|
|
97
|
+
return null;
|
|
98
|
+
const field = (key) => {
|
|
99
|
+
const value = data[key];
|
|
100
|
+
return typeof value === 'string' ? value : null;
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
id: doc.id,
|
|
104
|
+
collection: doc.collection,
|
|
105
|
+
title: doc.title,
|
|
106
|
+
slug: doc.slug,
|
|
107
|
+
locale: doc.locale,
|
|
108
|
+
dataPath: field('path'),
|
|
109
|
+
dataSlug: field('slug'),
|
|
110
|
+
dataTitle: field('title'),
|
|
111
|
+
header,
|
|
112
|
+
footer,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The rows without `jsonb` (SQLite, MySQL): published documents newest first,
|
|
117
|
+
* a page at a time, until `want` have an override or {@link SCAN_MAX} have
|
|
118
|
+
* been read. `capped` says the scan stopped with documents left unread.
|
|
119
|
+
*/
|
|
120
|
+
async function scanOverrideRows(db, want) {
|
|
121
|
+
const rows = [];
|
|
122
|
+
let cursor;
|
|
123
|
+
let read = 0;
|
|
124
|
+
while (read < SCAN_MAX) {
|
|
125
|
+
const take = Math.min(SCAN_PAGE, SCAN_MAX - read);
|
|
126
|
+
const page = (await db.document.findMany({
|
|
127
|
+
where: { deletedAt: null, status: 'PUBLISHED' },
|
|
128
|
+
orderBy: [{ updatedAt: 'desc' }, { id: 'asc' }],
|
|
129
|
+
take,
|
|
130
|
+
...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
|
|
131
|
+
select: { id: true, collection: true, title: true, slug: true, locale: true, data: true },
|
|
132
|
+
}));
|
|
133
|
+
for (const doc of page) {
|
|
134
|
+
const row = rowFromDocument(doc);
|
|
135
|
+
if (row)
|
|
136
|
+
rows.push(row);
|
|
137
|
+
if (rows.length >= want)
|
|
138
|
+
return { rows, capped: false };
|
|
139
|
+
}
|
|
140
|
+
read += page.length;
|
|
141
|
+
// A short page is the last one.
|
|
142
|
+
if (page.length < take)
|
|
143
|
+
return { rows, capped: false };
|
|
144
|
+
cursor = page[page.length - 1].id;
|
|
145
|
+
}
|
|
146
|
+
return { rows, capped: true };
|
|
147
|
+
}
|
|
148
|
+
/** The published pages with a header or footer override, sorted by path. */
|
|
149
|
+
export async function listChromeOverrides(db, config, options = {}) {
|
|
150
|
+
const provider = options.provider ?? detectProvider(process.env.DATABASE_URL ?? '');
|
|
151
|
+
// One extra row tells the card there are more than it shows.
|
|
152
|
+
const want = CHROME_OVERRIDES_LIMIT + 1;
|
|
153
|
+
let rows;
|
|
154
|
+
let capped = false;
|
|
155
|
+
if (provider === 'postgresql') {
|
|
156
|
+
rows = (await db.$queryRawUnsafe(OVERRIDES_SQL, want));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
;
|
|
160
|
+
({ rows, capped } = await scanOverrideRows(db, want));
|
|
161
|
+
}
|
|
162
|
+
const truncated = capped || rows.length > CHROME_OVERRIDES_LIMIT;
|
|
163
|
+
const readable = new Map();
|
|
164
|
+
const pages = [];
|
|
165
|
+
for (const row of rows.slice(0, CHROME_OVERRIDES_LIMIT)) {
|
|
166
|
+
if (options.canRead) {
|
|
167
|
+
if (!readable.has(row.collection)) {
|
|
168
|
+
readable.set(row.collection, await options.canRead(row.collection));
|
|
169
|
+
}
|
|
170
|
+
if (!readable.get(row.collection))
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const page = toPageOverrides(row, config);
|
|
174
|
+
if (page)
|
|
175
|
+
pages.push(page);
|
|
176
|
+
}
|
|
177
|
+
pages.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : a.id < b.id ? -1 : 1));
|
|
178
|
+
return { pages, truncated };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/chrome/overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation for `PUT /chrome/schema`, the body `prenta push chrome` sends.
|
|
3
|
+
* Known options are checked and copied in a fixed order; options this version
|
|
4
|
+
* doesn't know are dropped, so a newer SDK can still push to an older CMS.
|
|
5
|
+
*/
|
|
6
|
+
import { type ChromeRegionName, type FieldDef } from './schema.js';
|
|
7
|
+
export interface RegionSchemaInput {
|
|
8
|
+
region: ChromeRegionName;
|
|
9
|
+
component: string;
|
|
10
|
+
variants: Record<string, string>;
|
|
11
|
+
fields: Record<string, FieldDef>;
|
|
12
|
+
}
|
|
13
|
+
interface SchemaSourceInput {
|
|
14
|
+
repo: string;
|
|
15
|
+
branch: string;
|
|
16
|
+
commit: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SchemaReadInput {
|
|
19
|
+
regions: RegionSchemaInput[];
|
|
20
|
+
source: SchemaSourceInput;
|
|
21
|
+
}
|
|
22
|
+
export type Parsed<T> = {
|
|
23
|
+
ok: true;
|
|
24
|
+
value: T;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
error: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function isFieldKey(key: string): boolean;
|
|
30
|
+
export declare function isVariantId(id: string): boolean;
|
|
31
|
+
/** Upper bound for a menu list (`field.menu({ list: true, max })`). */
|
|
32
|
+
export declare const MAX_MENU_LIST = 20;
|
|
33
|
+
/** Validate a schema push. Every region the site defines must be in it; a region left out loses its schema. */
|
|
34
|
+
export declare function parseSchemaRead(body: unknown): Parsed<SchemaReadInput>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/chrome/parse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAkB,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAElF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CACjC;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAgB7E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AAOD,uEAAuE;AACvE,eAAO,MAAM,aAAa,KAAK,CAAA;AA+M/B,+GAA+G;AAC/G,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,CA0BtE"}
|