@prenta/core 8.9.1 → 8.10.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 +102 -0
- package/dist/actions.d.ts +31 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +59 -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 +47 -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/documents.d.ts.map +1 -1
- package/dist/api/routes/documents.js +20 -0
- package/dist/api/routes/documents.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 +142 -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/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 +306 -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 +186 -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 +270 -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,142 @@
|
|
|
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
|
+
/** `PUT /chrome/schema`: what changed in the stored values. */
|
|
125
|
+
export interface ChromeSchemaReadResult {
|
|
126
|
+
regions: Array<{
|
|
127
|
+
region: ChromeRegionName;
|
|
128
|
+
/** Saved values the new schema doesn't have, now orphans. */
|
|
129
|
+
orphaned: string[];
|
|
130
|
+
/** `renamedFrom` → key pairs whose value moved over. */
|
|
131
|
+
renamed: Array<{
|
|
132
|
+
from: string;
|
|
133
|
+
to: string;
|
|
134
|
+
}>;
|
|
135
|
+
/** Orphans that came back because their field did. */
|
|
136
|
+
restored: string[];
|
|
137
|
+
/** True when the region's schema or values changed. */
|
|
138
|
+
changed: boolean;
|
|
139
|
+
}>;
|
|
140
|
+
source: RegionSchemaSource;
|
|
141
|
+
}
|
|
142
|
+
//# 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,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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
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 { CHROME_REGIONS } from './schema.js';
|
|
7
|
+
/** Field keys and variant ids start with a letter, so JSON keeps them in the order written. */
|
|
8
|
+
const FIELD_KEY = /^[A-Za-z][A-Za-z0-9_]{0,39}$/;
|
|
9
|
+
const VARIANT_ID = /^[A-Za-z][A-Za-z0-9_-]{0,39}$/;
|
|
10
|
+
/**
|
|
11
|
+
* A key that can't be confused with an `Object.prototype` member
|
|
12
|
+
* (`toString`, `constructor`, …), which a plain-object lookup would find on
|
|
13
|
+
* every object. Lookups are own-property as well; this keeps such names out
|
|
14
|
+
* of the schema altogether.
|
|
15
|
+
*/
|
|
16
|
+
function notReserved(key) {
|
|
17
|
+
return !(key in Object.prototype);
|
|
18
|
+
}
|
|
19
|
+
export function isFieldKey(key) {
|
|
20
|
+
return FIELD_KEY.test(key) && notReserved(key);
|
|
21
|
+
}
|
|
22
|
+
export function isVariantId(id) {
|
|
23
|
+
return VARIANT_ID.test(id) && notReserved(id);
|
|
24
|
+
}
|
|
25
|
+
const TOKEN = /^\{[A-Za-z][A-Za-z0-9_]{0,28}\}$/;
|
|
26
|
+
const MAX_FIELDS = 60;
|
|
27
|
+
const MAX_VARIANTS = 24;
|
|
28
|
+
const MAX_OPTIONS = 50;
|
|
29
|
+
const MAX_TEXT = 5000;
|
|
30
|
+
/** Upper bound for a menu list (`field.menu({ list: true, max })`). */
|
|
31
|
+
export const MAX_MENU_LIST = 20;
|
|
32
|
+
class SchemaError extends Error {
|
|
33
|
+
}
|
|
34
|
+
function fail(message) {
|
|
35
|
+
throw new SchemaError(message);
|
|
36
|
+
}
|
|
37
|
+
function isRecord(value) {
|
|
38
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
39
|
+
}
|
|
40
|
+
function optionalString(value, where, max) {
|
|
41
|
+
if (value === undefined || value === null || value === '')
|
|
42
|
+
return undefined;
|
|
43
|
+
if (typeof value !== 'string')
|
|
44
|
+
fail(`${where} must be a string`);
|
|
45
|
+
if (value.length > max)
|
|
46
|
+
fail(`${where} is longer than ${max} characters`);
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function optionalBoolean(value, where) {
|
|
50
|
+
if (value === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (typeof value !== 'boolean')
|
|
53
|
+
fail(`${where} must be true or false`);
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function optionalInt(value, where, min, max) {
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {
|
|
60
|
+
fail(`${where} must be a whole number from ${min} to ${max}`);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
/** Builds the field in a fixed property order and leaves out what wasn't set. */
|
|
65
|
+
function compact(fieldDef) {
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const [key, value] of Object.entries(fieldDef))
|
|
68
|
+
if (value !== undefined)
|
|
69
|
+
out[key] = value;
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
function parseField(key, raw, region) {
|
|
73
|
+
const where = `${region}.${key}`;
|
|
74
|
+
if (!isRecord(raw))
|
|
75
|
+
fail(`${where} must be a field`);
|
|
76
|
+
const common = {
|
|
77
|
+
label: optionalString(raw.label, `${where}.label`, 80),
|
|
78
|
+
help: optionalString(raw.help, `${where}.help`, 300),
|
|
79
|
+
renamedFrom: optionalString(raw.renamedFrom, `${where}.renamedFrom`, 40),
|
|
80
|
+
};
|
|
81
|
+
if (common.renamedFrom !== undefined) {
|
|
82
|
+
if (!isFieldKey(common.renamedFrom))
|
|
83
|
+
fail(`${where}.renamedFrom is not a field key`);
|
|
84
|
+
if (common.renamedFrom === key)
|
|
85
|
+
fail(`${where}.renamedFrom can't be the field's own key`);
|
|
86
|
+
}
|
|
87
|
+
switch (raw.type) {
|
|
88
|
+
case 'brand':
|
|
89
|
+
if (raw.key !== 'logo' && raw.key !== 'name')
|
|
90
|
+
fail(`${where}.key must be "logo" or "name"`);
|
|
91
|
+
return compact({ type: 'brand', key: raw.key, ...common });
|
|
92
|
+
case 'menu':
|
|
93
|
+
return compact({
|
|
94
|
+
type: 'menu',
|
|
95
|
+
optional: optionalBoolean(raw.optional, `${where}.optional`),
|
|
96
|
+
list: optionalBoolean(raw.list, `${where}.list`),
|
|
97
|
+
max: optionalInt(raw.max, `${where}.max`, 1, MAX_MENU_LIST),
|
|
98
|
+
default: optionalString(raw.default, `${where}.default`, 200),
|
|
99
|
+
...common,
|
|
100
|
+
});
|
|
101
|
+
case 'link':
|
|
102
|
+
return compact({
|
|
103
|
+
type: 'link',
|
|
104
|
+
optional: optionalBoolean(raw.optional, `${where}.optional`),
|
|
105
|
+
...common,
|
|
106
|
+
});
|
|
107
|
+
case 'text': {
|
|
108
|
+
if (raw.format !== undefined && raw.format !== 'tel' && raw.format !== 'email') {
|
|
109
|
+
fail(`${where}.format must be "tel" or "email"`);
|
|
110
|
+
}
|
|
111
|
+
let tokens;
|
|
112
|
+
if (raw.tokens !== undefined) {
|
|
113
|
+
if (!Array.isArray(raw.tokens) || raw.tokens.length > 10) {
|
|
114
|
+
fail(`${where}.tokens must be a list of up to 10 tokens`);
|
|
115
|
+
}
|
|
116
|
+
tokens = raw.tokens.map((token) => {
|
|
117
|
+
if (typeof token !== 'string' || !TOKEN.test(token)) {
|
|
118
|
+
fail(`${where}.tokens must look like "{year}"`);
|
|
119
|
+
}
|
|
120
|
+
return token;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return compact({
|
|
124
|
+
type: 'text',
|
|
125
|
+
optional: optionalBoolean(raw.optional, `${where}.optional`),
|
|
126
|
+
format: raw.format,
|
|
127
|
+
tokens,
|
|
128
|
+
max: optionalInt(raw.max, `${where}.max`, 1, MAX_TEXT),
|
|
129
|
+
...common,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
case 'textarea':
|
|
133
|
+
return compact({
|
|
134
|
+
type: 'textarea',
|
|
135
|
+
max: optionalInt(raw.max, `${where}.max`, 1, MAX_TEXT),
|
|
136
|
+
...common,
|
|
137
|
+
});
|
|
138
|
+
case 'select': {
|
|
139
|
+
if (!Array.isArray(raw.options) || raw.options.length === 0) {
|
|
140
|
+
fail(`${where}.options must list at least one option`);
|
|
141
|
+
}
|
|
142
|
+
if (raw.options.length > MAX_OPTIONS)
|
|
143
|
+
fail(`${where} has more than ${MAX_OPTIONS} options`);
|
|
144
|
+
const options = raw.options.map((option) => {
|
|
145
|
+
if (typeof option !== 'string' || option === '' || option.length > 60) {
|
|
146
|
+
fail(`${where}.options must be non-empty strings of up to 60 characters`);
|
|
147
|
+
}
|
|
148
|
+
return option;
|
|
149
|
+
});
|
|
150
|
+
if (new Set(options).size !== options.length)
|
|
151
|
+
fail(`${where}.options repeats an option`);
|
|
152
|
+
const fallback = optionalString(raw.default, `${where}.default`, 60);
|
|
153
|
+
if (fallback !== undefined && !options.includes(fallback)) {
|
|
154
|
+
fail(`${where}.default must be one of its options`);
|
|
155
|
+
}
|
|
156
|
+
return compact({ type: 'select', options, default: fallback, ...common });
|
|
157
|
+
}
|
|
158
|
+
case 'boolean':
|
|
159
|
+
return compact({
|
|
160
|
+
type: 'boolean',
|
|
161
|
+
default: optionalBoolean(raw.default, `${where}.default`),
|
|
162
|
+
...common,
|
|
163
|
+
});
|
|
164
|
+
case 'social':
|
|
165
|
+
return compact({ type: 'social', ...common });
|
|
166
|
+
default:
|
|
167
|
+
return fail(`${where}.type must be one of brand, menu, link, text, textarea, select, boolean, social`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function parseRegion(raw, index) {
|
|
171
|
+
if (!isRecord(raw))
|
|
172
|
+
fail(`regions[${index}] must be a region`);
|
|
173
|
+
const region = raw.region;
|
|
174
|
+
if (typeof region !== 'string' || !CHROME_REGIONS.includes(region)) {
|
|
175
|
+
fail(`regions[${index}].region must be one of: ${CHROME_REGIONS.join(', ')}`);
|
|
176
|
+
}
|
|
177
|
+
const component = raw.component;
|
|
178
|
+
if (typeof component !== 'string' || component.trim() === '' || component.length > 500) {
|
|
179
|
+
fail(`${region}.component must be the component's path`);
|
|
180
|
+
}
|
|
181
|
+
if (!isRecord(raw.variants))
|
|
182
|
+
fail(`${region}.variants must map variant ids to labels`);
|
|
183
|
+
const variantEntries = Object.entries(raw.variants);
|
|
184
|
+
if (variantEntries.length === 0)
|
|
185
|
+
fail(`${region} needs at least one variant`);
|
|
186
|
+
if (variantEntries.length > MAX_VARIANTS)
|
|
187
|
+
fail(`${region} has more than ${MAX_VARIANTS} variants`);
|
|
188
|
+
const variants = {};
|
|
189
|
+
for (const [id, label] of variantEntries) {
|
|
190
|
+
if (!isVariantId(id)) {
|
|
191
|
+
fail(`${region} variant "${id}" must start with a letter, use letters, digits, - or _, and not be a reserved name`);
|
|
192
|
+
}
|
|
193
|
+
if (typeof label !== 'string' || label.trim() === '' || label.length > 80) {
|
|
194
|
+
fail(`${region} variant "${id}" needs a label of up to 80 characters`);
|
|
195
|
+
}
|
|
196
|
+
variants[id] = label;
|
|
197
|
+
}
|
|
198
|
+
if (!isRecord(raw.fields))
|
|
199
|
+
fail(`${region}.fields must map field keys to fields`);
|
|
200
|
+
const fieldEntries = Object.entries(raw.fields);
|
|
201
|
+
if (fieldEntries.length > MAX_FIELDS)
|
|
202
|
+
fail(`${region} has more than ${MAX_FIELDS} fields`);
|
|
203
|
+
const fields = {};
|
|
204
|
+
for (const [key, value] of fieldEntries) {
|
|
205
|
+
if (!isFieldKey(key)) {
|
|
206
|
+
fail(`${region} field "${key}" must start with a letter, use letters, digits or _, and not be a reserved name`);
|
|
207
|
+
}
|
|
208
|
+
fields[key] = parseField(key, value, region);
|
|
209
|
+
}
|
|
210
|
+
const renamedFrom = new Set();
|
|
211
|
+
for (const [key, def] of Object.entries(fields)) {
|
|
212
|
+
if (!def.renamedFrom)
|
|
213
|
+
continue;
|
|
214
|
+
if (def.renamedFrom in fields) {
|
|
215
|
+
fail(`${region}.${key}.renamedFrom names "${def.renamedFrom}", which is still a field`);
|
|
216
|
+
}
|
|
217
|
+
if (renamedFrom.has(def.renamedFrom)) {
|
|
218
|
+
fail(`${region}: two fields are renamed from "${def.renamedFrom}"`);
|
|
219
|
+
}
|
|
220
|
+
renamedFrom.add(def.renamedFrom);
|
|
221
|
+
}
|
|
222
|
+
return { region: region, component, variants, fields };
|
|
223
|
+
}
|
|
224
|
+
function sourceString(value, where) {
|
|
225
|
+
if (value === undefined || value === null)
|
|
226
|
+
return '';
|
|
227
|
+
if (typeof value !== 'string' || value.length > 200) {
|
|
228
|
+
fail(`source.${where} must be a string of up to 200 characters`);
|
|
229
|
+
}
|
|
230
|
+
return value.trim();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Every signed-in user can read the source, so a repo given as a remote URL
|
|
234
|
+
* with credentials (`https://oauth2:TOKEN@host/site`) keeps only what follows
|
|
235
|
+
* the last `@`. `prenta push chrome` strips them too; this covers other callers.
|
|
236
|
+
*/
|
|
237
|
+
function withoutCredentials(repo) {
|
|
238
|
+
const at = repo.lastIndexOf('@');
|
|
239
|
+
if (at === -1)
|
|
240
|
+
return repo;
|
|
241
|
+
const scheme = repo.match(/^[a-z][a-z0-9+.-]*:\/\//i)?.[0] ?? '';
|
|
242
|
+
return scheme + repo.slice(at + 1);
|
|
243
|
+
}
|
|
244
|
+
/** Validate a schema push. Every region the site defines must be in it; a region left out loses its schema. */
|
|
245
|
+
export function parseSchemaRead(body) {
|
|
246
|
+
try {
|
|
247
|
+
if (!isRecord(body))
|
|
248
|
+
fail('Send { regions, source }');
|
|
249
|
+
if (!Array.isArray(body.regions))
|
|
250
|
+
fail('regions must be a list');
|
|
251
|
+
if (body.regions.length > CHROME_REGIONS.length) {
|
|
252
|
+
fail(`regions can hold at most ${CHROME_REGIONS.length} regions`);
|
|
253
|
+
}
|
|
254
|
+
const regions = body.regions.map(parseRegion);
|
|
255
|
+
const names = regions.map((region) => region.region);
|
|
256
|
+
if (new Set(names).size !== names.length)
|
|
257
|
+
fail('Each region can only be sent once');
|
|
258
|
+
const source = isRecord(body.source) ? body.source : {};
|
|
259
|
+
return {
|
|
260
|
+
ok: true,
|
|
261
|
+
value: {
|
|
262
|
+
regions,
|
|
263
|
+
source: {
|
|
264
|
+
repo: withoutCredentials(sourceString(source.repo, 'repo')),
|
|
265
|
+
branch: sourceString(source.branch, 'branch'),
|
|
266
|
+
commit: sourceString(source.commit, 'commit'),
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
if (err instanceof SchemaError)
|
|
273
|
+
return { ok: false, error: err.message };
|
|
274
|
+
throw err;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/chrome/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PrentaDB } from '../db/client-types.js';
|
|
2
|
+
import { type ChromeRow, type ChromeRowPatch, type ChromeStore, type ChromeWriteOptions } from './store.js';
|
|
3
|
+
export declare class PrismaChromeStore implements ChromeStore {
|
|
4
|
+
private readonly db;
|
|
5
|
+
constructor(db: PrentaDB);
|
|
6
|
+
get(region: string): Promise<ChromeRow | null>;
|
|
7
|
+
list(): Promise<ChromeRow[]>;
|
|
8
|
+
ensure(region: string, now: Date): Promise<void>;
|
|
9
|
+
update(row: ChromeRow, patch: ChromeRowPatch, now: Date, options?: ChromeWriteOptions): Promise<ChromeRow | null>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=prisma-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-store.d.ts","sourceRoot":"","sources":["../../src/chrome/prisma-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAA;AAkCnB,qBAAa,iBAAkB,YAAW,WAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK9C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK5B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,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;CAS7B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { patchedRow, writtenAt, } from './store.js';
|
|
2
|
+
function toRow(raw) {
|
|
3
|
+
const values = raw.values;
|
|
4
|
+
return {
|
|
5
|
+
region: raw.region,
|
|
6
|
+
schema: raw.schema ?? null,
|
|
7
|
+
schemaHash: raw.schemaHash ?? null,
|
|
8
|
+
variant: raw.variant ?? null,
|
|
9
|
+
values: typeof values === 'object' && values !== null && !Array.isArray(values)
|
|
10
|
+
? values
|
|
11
|
+
: {},
|
|
12
|
+
orphans: Array.isArray(raw.orphans) ? raw.orphans : [],
|
|
13
|
+
state: raw.state ?? null,
|
|
14
|
+
version: typeof raw.version === 'number' ? raw.version : 0,
|
|
15
|
+
updatedById: raw.updatedById ?? null,
|
|
16
|
+
updatedAt: raw.updatedAt ? new Date(raw.updatedAt) : null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export class PrismaChromeStore {
|
|
20
|
+
db;
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
}
|
|
24
|
+
async get(region) {
|
|
25
|
+
const row = await this.db.chromeRegion.findUnique({ where: { region } });
|
|
26
|
+
return row ? toRow(row) : null;
|
|
27
|
+
}
|
|
28
|
+
async list() {
|
|
29
|
+
const rows = await this.db.chromeRegion.findMany({ orderBy: { region: 'asc' } });
|
|
30
|
+
return rows.map(toRow);
|
|
31
|
+
}
|
|
32
|
+
async ensure(region, now) {
|
|
33
|
+
await this.db.chromeRegion.createMany({
|
|
34
|
+
data: [{ region, values: {}, orphans: [], version: 0, updatedAt: now }],
|
|
35
|
+
skipDuplicates: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async update(row, patch, now, options) {
|
|
39
|
+
const { count } = await this.db.chromeRegion.updateMany({
|
|
40
|
+
where: { region: row.region, version: row.version },
|
|
41
|
+
// A JS null clears a nullable Json column on Prisma 7.
|
|
42
|
+
// `updatedAt` is always sent, so Prisma's @updatedAt doesn't move it on a `touch: false` write.
|
|
43
|
+
data: { ...patch, version: row.version + 1, updatedAt: writtenAt(row, now, options) },
|
|
44
|
+
});
|
|
45
|
+
return count === 1 ? patchedRow(row, patch, now, options) : null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=prisma-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-store.js","sourceRoot":"","sources":["../../src/chrome/prisma-store.ts"],"names":[],"mappings":"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"}
|