@growth-labs/cms 0.3.1 → 0.5.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/README.md +80 -6
- package/dist/engine/content-metadata.d.ts +13 -0
- package/dist/engine/content-metadata.d.ts.map +1 -0
- package/dist/engine/content-metadata.js +80 -0
- package/dist/engine/content-metadata.js.map +1 -0
- package/dist/engine/foundry-dispatch.d.ts +5 -1
- package/dist/engine/foundry-dispatch.d.ts.map +1 -1
- package/dist/engine/foundry-dispatch.js +19 -3
- package/dist/engine/foundry-dispatch.js.map +1 -1
- package/dist/engine/index.d.ts +4 -2
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +6 -2
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/publication.d.ts +29 -1
- package/dist/engine/publication.d.ts.map +1 -1
- package/dist/engine/publication.js +197 -15
- package/dist/engine/publication.js.map +1 -1
- package/dist/engine/published-content.d.ts +40 -0
- package/dist/engine/published-content.d.ts.map +1 -0
- package/dist/engine/published-content.js +388 -0
- package/dist/engine/published-content.js.map +1 -0
- package/dist/engine/publisher.d.ts +20 -1
- package/dist/engine/publisher.d.ts.map +1 -1
- package/dist/engine/publisher.js +264 -65
- package/dist/engine/publisher.js.map +1 -1
- package/dist/engine/revisions.d.ts.map +1 -1
- package/dist/engine/revisions.js +2 -0
- package/dist/engine/revisions.js.map +1 -1
- package/dist/providers/types.d.ts +1 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/routes/content.d.ts.map +1 -1
- package/dist/routes/content.js +76 -16
- package/dist/routes/content.js.map +1 -1
- package/dist/routes/context.d.ts +1 -0
- package/dist/routes/context.d.ts.map +1 -1
- package/dist/routes/context.js.map +1 -1
- package/dist/routes/media.d.ts.map +1 -1
- package/dist/routes/media.js +53 -31
- package/dist/routes/media.js.map +1 -1
- package/dist/schema/migrations.d.ts.map +1 -1
- package/dist/schema/migrations.js +24 -0
- package/dist/schema/migrations.js.map +1 -1
- package/dist/schema/types.d.ts +6 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js.map +1 -1
- package/dist/ui/editor/ContentForm.d.ts.map +1 -1
- package/dist/ui/editor/ContentForm.js +65 -10
- package/dist/ui/editor/ContentForm.js.map +1 -1
- package/dist/ui/editor/content-payload.d.ts +2 -0
- package/dist/ui/editor/content-payload.d.ts.map +1 -1
- package/dist/ui/editor/content-payload.js +15 -4
- package/dist/ui/editor/content-payload.js.map +1 -1
- package/dist/ui/editor/editor-media-duration.d.ts +24 -0
- package/dist/ui/editor/editor-media-duration.d.ts.map +1 -0
- package/dist/ui/editor/editor-media-duration.js +51 -0
- package/dist/ui/editor/editor-media-duration.js.map +1 -0
- package/dist/ui/screens/MediaScreen.d.ts.map +1 -1
- package/dist/ui/screens/MediaScreen.js +8 -1
- package/dist/ui/screens/MediaScreen.js.map +1 -1
- package/dist/ui/screens/media-upload.d.ts +9 -2
- package/dist/ui/screens/media-upload.d.ts.map +1 -1
- package/dist/ui/screens/media-upload.js +24 -0
- package/dist/ui/screens/media-upload.js.map +1 -1
- package/migrations/0020_content_metadata_read_model.sql +19 -0
- package/migrations/0021_published_revision_slug_index.sql +5 -0
- package/package.json +1 -1
- package/src/engine/content-metadata.ts +122 -0
- package/src/engine/foundry-dispatch.ts +32 -4
- package/src/engine/index.ts +27 -0
- package/src/engine/publication.ts +329 -18
- package/src/engine/published-content.ts +581 -0
- package/src/engine/publisher.ts +403 -107
- package/src/engine/revisions.ts +4 -0
- package/src/providers/types.ts +1 -0
- package/src/routes/content.ts +91 -16
- package/src/routes/context.ts +1 -0
- package/src/routes/media.ts +63 -41
- package/src/schema/migrations.ts +24 -0
- package/src/schema/types.ts +6 -0
- package/src/ui/editor/ContentForm.tsx +121 -4
- package/src/ui/editor/content-payload.ts +20 -2
- package/src/ui/editor/editor-media-duration.ts +75 -0
- package/src/ui/screens/MediaScreen.tsx +13 -2
- package/src/ui/screens/media-upload.ts +41 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ContentType } from '../schema/types.js';
|
|
2
|
+
import { type ContentMetadata } from './content-metadata.js';
|
|
3
|
+
import type { D1Database } from './d1.js';
|
|
4
|
+
import type { ContentRevisionPayload } from './revisions.js';
|
|
5
|
+
export declare const MAX_PUBLISHED_CONTENT_PAGE_SIZE = 100;
|
|
6
|
+
export declare const MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES: number;
|
|
7
|
+
export declare const MAX_PUBLISHED_CONTENT_PAGE_BYTES: number;
|
|
8
|
+
export type PublishedContentReadErrorCode = 'published_content_input_invalid' | 'published_revision_missing' | 'published_revision_mismatch' | 'published_payload_invalid' | 'published_payload_limit_exceeded' | 'published_slug_ambiguous' | 'published_read_failed';
|
|
9
|
+
export declare class PublishedContentReadError extends Error {
|
|
10
|
+
readonly code: PublishedContentReadErrorCode;
|
|
11
|
+
constructor(code: PublishedContentReadErrorCode, message: string, options?: ErrorOptions);
|
|
12
|
+
}
|
|
13
|
+
export interface PublishedContent {
|
|
14
|
+
contentId: string;
|
|
15
|
+
revisionId: string;
|
|
16
|
+
slug: string;
|
|
17
|
+
type: ContentType;
|
|
18
|
+
publishedAt: number;
|
|
19
|
+
updatedAt: number;
|
|
20
|
+
payload: ContentRevisionPayload;
|
|
21
|
+
metadata: ContentMetadata;
|
|
22
|
+
}
|
|
23
|
+
export interface PublishedContentCursor {
|
|
24
|
+
publishedAt: number;
|
|
25
|
+
contentId: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ListPublishedContentOptions {
|
|
28
|
+
type?: ContentType;
|
|
29
|
+
channel?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
cursor?: PublishedContentCursor | null;
|
|
32
|
+
}
|
|
33
|
+
export interface PublishedContentPage {
|
|
34
|
+
items: PublishedContent[];
|
|
35
|
+
nextCursor: PublishedContentCursor | null;
|
|
36
|
+
}
|
|
37
|
+
export declare function getPublishedContentById(db: D1Database, contentId: string): Promise<PublishedContent | null>;
|
|
38
|
+
export declare function getPublishedContentBySlug(db: D1Database, slug: string): Promise<PublishedContent | null>;
|
|
39
|
+
export declare function listPublishedContent(db: D1Database, options?: ListPublishedContentOptions): Promise<PublishedContentPage>;
|
|
40
|
+
//# sourceMappingURL=published-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-content.d.ts","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EACN,KAAK,eAAe,EAGpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAClD,eAAO,MAAM,mCAAmC,QAAkB,CAAA;AAClE,eAAO,MAAM,gCAAgC,QAAkB,CAAA;AAE/D,MAAM,MAAM,6BAA6B,GACtC,iCAAiC,GACjC,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAC3B,kCAAkC,GAClC,0BAA0B,GAC1B,uBAAuB,CAAA;AAE1B,qBAAa,yBAA0B,SAAQ,KAAK;IAElD,QAAQ,CAAC,IAAI,EAAE,6BAA6B;gBAAnC,IAAI,EAAE,6BAA6B,EAC5C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY;CAKvB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;CACzB;AAED,MAAM,WAAW,sBAAsB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACtC;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACzC;AAmQD,wBAAsB,uBAAuB,CAC5C,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAqBlC;AAED,wBAAsB,yBAAyB,CAC9C,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4BlC;AAkFD,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,UAAU,EACd,OAAO,GAAE,2BAAgC,GACvC,OAAO,CAAC,oBAAoB,CAAC,CAkH/B"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { ContentMetadataError, parseContentMetadata, } from './content-metadata.js';
|
|
2
|
+
const CONTENT_TYPES = new Set(['article', 'video', 'podcast', 'newsletter', 'page']);
|
|
3
|
+
const CONTENT_STATUSES = new Set(['draft', 'scheduled', 'review', 'published', 'archived']);
|
|
4
|
+
const CONTENT_VISIBILITIES = new Set(['free', 'premium']);
|
|
5
|
+
const LIST_OPTION_KEYS = new Set(['type', 'channel', 'limit', 'cursor']);
|
|
6
|
+
const CURSOR_KEYS = new Set(['publishedAt', 'contentId']);
|
|
7
|
+
export const MAX_PUBLISHED_CONTENT_PAGE_SIZE = 100;
|
|
8
|
+
export const MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES = 4 * 1024 * 1024;
|
|
9
|
+
export const MAX_PUBLISHED_CONTENT_PAGE_BYTES = 4 * 1024 * 1024;
|
|
10
|
+
export class PublishedContentReadError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code, message, options) {
|
|
13
|
+
super(message, options);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'PublishedContentReadError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const SELECT_PUBLISHED_CONTENT = `
|
|
19
|
+
SELECT
|
|
20
|
+
ci.id AS content_id,
|
|
21
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
22
|
+
ci.published_at AS canonical_published_at,
|
|
23
|
+
cr.id AS revision_id,
|
|
24
|
+
cr.content_id AS revision_content_id,
|
|
25
|
+
CASE
|
|
26
|
+
WHEN length(CAST(cr.payload_json AS BLOB)) <= ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES}
|
|
27
|
+
THEN cr.payload_json
|
|
28
|
+
ELSE NULL
|
|
29
|
+
END AS payload_json,
|
|
30
|
+
length(CAST(cr.payload_json AS BLOB)) AS payload_bytes
|
|
31
|
+
FROM content_items ci
|
|
32
|
+
`;
|
|
33
|
+
const SELECT_PUBLISHED_CONTENT_OUTLINE = `
|
|
34
|
+
SELECT
|
|
35
|
+
ci.id AS content_id,
|
|
36
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
37
|
+
ci.published_at AS canonical_published_at,
|
|
38
|
+
length(CAST(cr.payload_json AS BLOB)) AS payload_bytes
|
|
39
|
+
FROM content_items ci
|
|
40
|
+
`;
|
|
41
|
+
const SELECT_PUBLISHED_CONTENT_BY_SLUG = `
|
|
42
|
+
SELECT
|
|
43
|
+
ci.id AS content_id,
|
|
44
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
45
|
+
ci.published_at AS canonical_published_at,
|
|
46
|
+
cr.id AS revision_id,
|
|
47
|
+
cr.content_id AS revision_content_id,
|
|
48
|
+
CASE
|
|
49
|
+
WHEN length(CAST(cr.payload_json AS BLOB)) <= ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES}
|
|
50
|
+
THEN cr.payload_json
|
|
51
|
+
ELSE NULL
|
|
52
|
+
END AS payload_json,
|
|
53
|
+
length(CAST(cr.payload_json AS BLOB)) AS payload_bytes
|
|
54
|
+
FROM content_revisions cr INDEXED BY idx_content_revisions_published_slug
|
|
55
|
+
JOIN content_items ci
|
|
56
|
+
ON ci.published_revision_id = cr.id
|
|
57
|
+
AND cr.content_id = ci.id
|
|
58
|
+
`;
|
|
59
|
+
function isPlainRecord(value) {
|
|
60
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
61
|
+
return false;
|
|
62
|
+
const prototype = Object.getPrototypeOf(value);
|
|
63
|
+
return prototype === Object.prototype || prototype === null;
|
|
64
|
+
}
|
|
65
|
+
function byteLength(value) {
|
|
66
|
+
return new TextEncoder().encode(value).byteLength;
|
|
67
|
+
}
|
|
68
|
+
function invalidPayload(message) {
|
|
69
|
+
throw new PublishedContentReadError('published_payload_invalid', message);
|
|
70
|
+
}
|
|
71
|
+
function validatePayload(raw, row) {
|
|
72
|
+
if (byteLength(raw) > MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES) {
|
|
73
|
+
throw new PublishedContentReadError('published_payload_limit_exceeded', `published revision payload exceeds ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES} bytes`);
|
|
74
|
+
}
|
|
75
|
+
let decoded;
|
|
76
|
+
try {
|
|
77
|
+
decoded = JSON.parse(raw);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return invalidPayload('published revision payload is not valid JSON');
|
|
81
|
+
}
|
|
82
|
+
if (!isPlainRecord(decoded))
|
|
83
|
+
return invalidPayload('published revision payload must be an object');
|
|
84
|
+
if (!isPlainRecord(decoded.item))
|
|
85
|
+
return invalidPayload('published revision item must be an object');
|
|
86
|
+
if (decoded.content !== null && !isPlainRecord(decoded.content)) {
|
|
87
|
+
return invalidPayload('published revision content must be an object or null');
|
|
88
|
+
}
|
|
89
|
+
if (!Array.isArray(decoded.tags) || !decoded.tags.every((tag) => typeof tag === 'string')) {
|
|
90
|
+
return invalidPayload('published revision tags must be strings');
|
|
91
|
+
}
|
|
92
|
+
if (decoded.tags.length > 10 ||
|
|
93
|
+
decoded.tags.some((tag) => tag.length === 0 || tag.length > 256)) {
|
|
94
|
+
return invalidPayload('published revision tags exceed their canonical bounds');
|
|
95
|
+
}
|
|
96
|
+
if (!Array.isArray(decoded.related) ||
|
|
97
|
+
decoded.related.length > 100 ||
|
|
98
|
+
!decoded.related.every((relation) => isPlainRecord(relation) &&
|
|
99
|
+
typeof relation.related_id === 'string' &&
|
|
100
|
+
relation.related_id.length > 0 &&
|
|
101
|
+
relation.related_id.length <= 256 &&
|
|
102
|
+
Number.isSafeInteger(relation.rank) &&
|
|
103
|
+
relation.rank >= 0 &&
|
|
104
|
+
(relation.reason === null || typeof relation.reason === 'string'))) {
|
|
105
|
+
return invalidPayload('published revision relations are malformed');
|
|
106
|
+
}
|
|
107
|
+
const item = decoded.item;
|
|
108
|
+
if (item.id !== row.content_id) {
|
|
109
|
+
throw new PublishedContentReadError('published_revision_mismatch', 'published revision item does not belong to the canonical content item');
|
|
110
|
+
}
|
|
111
|
+
if (typeof item.slug !== 'string' || item.slug.length === 0) {
|
|
112
|
+
return invalidPayload('published revision slug is invalid');
|
|
113
|
+
}
|
|
114
|
+
if (item.slug.length > 512)
|
|
115
|
+
return invalidPayload('published revision slug is too long');
|
|
116
|
+
if (typeof item.type !== 'string' || !CONTENT_TYPES.has(item.type)) {
|
|
117
|
+
return invalidPayload('published revision type is invalid');
|
|
118
|
+
}
|
|
119
|
+
if (typeof item.title !== 'string' || !item.title.trim() || item.title.length > 1_024) {
|
|
120
|
+
return invalidPayload('published revision title is invalid');
|
|
121
|
+
}
|
|
122
|
+
if (typeof item.status !== 'string' || !CONTENT_STATUSES.has(item.status)) {
|
|
123
|
+
return invalidPayload('published revision status is invalid');
|
|
124
|
+
}
|
|
125
|
+
if (typeof item.visibility !== 'string' || !CONTENT_VISIBILITIES.has(item.visibility)) {
|
|
126
|
+
return invalidPayload('published revision visibility is invalid');
|
|
127
|
+
}
|
|
128
|
+
if (!Number.isSafeInteger(item.updated_at) || item.updated_at < 0) {
|
|
129
|
+
return invalidPayload('published revision updated_at is invalid');
|
|
130
|
+
}
|
|
131
|
+
if (item.metadata_json !== undefined && typeof item.metadata_json !== 'string') {
|
|
132
|
+
return invalidPayload('published revision metadata must be JSON text');
|
|
133
|
+
}
|
|
134
|
+
const content = decoded.content;
|
|
135
|
+
if (!content)
|
|
136
|
+
return invalidPayload('published revision content is missing');
|
|
137
|
+
if (['article', 'newsletter', 'page'].includes(item.type) &&
|
|
138
|
+
typeof content.body_markdown !== 'string') {
|
|
139
|
+
return invalidPayload('published revision body Markdown is invalid');
|
|
140
|
+
}
|
|
141
|
+
if (item.type === 'video' && typeof content.video_id !== 'string') {
|
|
142
|
+
return invalidPayload('published revision video ID is invalid');
|
|
143
|
+
}
|
|
144
|
+
if (item.type === 'podcast' && typeof content.audio_r2_key !== 'string') {
|
|
145
|
+
return invalidPayload('published revision podcast audio key is invalid');
|
|
146
|
+
}
|
|
147
|
+
return decoded;
|
|
148
|
+
}
|
|
149
|
+
function decodePublishedContent(row) {
|
|
150
|
+
if (!row.revision_id || !row.revision_content_id || row.payload_bytes === null) {
|
|
151
|
+
throw new PublishedContentReadError('published_revision_missing', 'canonical publication pointer does not resolve to a revision');
|
|
152
|
+
}
|
|
153
|
+
if (!Number.isSafeInteger(row.payload_bytes) || row.payload_bytes < 1) {
|
|
154
|
+
throw new PublishedContentReadError('published_payload_invalid', 'published revision payload length is invalid');
|
|
155
|
+
}
|
|
156
|
+
if (row.payload_bytes > MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES) {
|
|
157
|
+
throw new PublishedContentReadError('published_payload_limit_exceeded', `published revision payload exceeds ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES} bytes`);
|
|
158
|
+
}
|
|
159
|
+
if (row.payload_json === null || byteLength(row.payload_json) !== row.payload_bytes) {
|
|
160
|
+
throw new PublishedContentReadError('published_read_failed', 'published revision changed during its bounded read');
|
|
161
|
+
}
|
|
162
|
+
if (row.pointer_revision_id !== row.revision_id || row.revision_content_id !== row.content_id) {
|
|
163
|
+
throw new PublishedContentReadError('published_revision_mismatch', 'canonical publication pointer resolves to a revision owned by another item');
|
|
164
|
+
}
|
|
165
|
+
if (!Number.isSafeInteger(row.canonical_published_at) || row.canonical_published_at < 0) {
|
|
166
|
+
throw new PublishedContentReadError('published_payload_invalid', 'canonical published_at is invalid');
|
|
167
|
+
}
|
|
168
|
+
const payload = validatePayload(row.payload_json, row);
|
|
169
|
+
const item = payload.item;
|
|
170
|
+
let metadata;
|
|
171
|
+
try {
|
|
172
|
+
metadata = parseContentMetadata(typeof item.metadata_json === 'undefined' ? '{}' : item.metadata_json);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (error instanceof ContentMetadataError) {
|
|
176
|
+
throw new PublishedContentReadError('published_payload_invalid', `published revision metadata is invalid: ${error.message}`);
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
contentId: row.content_id,
|
|
182
|
+
revisionId: row.revision_id,
|
|
183
|
+
slug: item.slug,
|
|
184
|
+
type: item.type,
|
|
185
|
+
publishedAt: row.canonical_published_at,
|
|
186
|
+
updatedAt: item.updated_at,
|
|
187
|
+
payload,
|
|
188
|
+
metadata,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function assertLookupValue(value, field, maxLength) {
|
|
192
|
+
if (typeof value !== 'string' || !value || value.length > maxLength) {
|
|
193
|
+
throw new PublishedContentReadError('published_content_input_invalid', `${field} must be between 1 and ${maxLength} characters`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function wrapReadError(error) {
|
|
197
|
+
if (error instanceof PublishedContentReadError)
|
|
198
|
+
throw error;
|
|
199
|
+
throw new PublishedContentReadError('published_read_failed', 'published content could not be read safely', { cause: error });
|
|
200
|
+
}
|
|
201
|
+
export async function getPublishedContentById(db, contentId) {
|
|
202
|
+
assertLookupValue(contentId, 'contentId', 256);
|
|
203
|
+
try {
|
|
204
|
+
const row = await db
|
|
205
|
+
.prepare(`${SELECT_PUBLISHED_CONTENT}
|
|
206
|
+
LEFT JOIN content_revisions cr
|
|
207
|
+
ON cr.id = ci.published_revision_id
|
|
208
|
+
WHERE ci.id = ?
|
|
209
|
+
AND ci.status = 'published'
|
|
210
|
+
AND ci.deleted_at IS NULL
|
|
211
|
+
AND ci.published_revision_id IS NOT NULL
|
|
212
|
+
AND ci.published_at IS NOT NULL
|
|
213
|
+
LIMIT 1`)
|
|
214
|
+
.bind(contentId)
|
|
215
|
+
.first();
|
|
216
|
+
return row ? decodePublishedContent(row) : null;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return wrapReadError(error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export async function getPublishedContentBySlug(db, slug) {
|
|
223
|
+
assertLookupValue(slug, 'slug', 512);
|
|
224
|
+
try {
|
|
225
|
+
const result = await db
|
|
226
|
+
.prepare(`${SELECT_PUBLISHED_CONTENT_BY_SLUG}
|
|
227
|
+
WHERE ci.status = 'published'
|
|
228
|
+
AND ci.deleted_at IS NULL
|
|
229
|
+
AND ci.published_revision_id IS NOT NULL
|
|
230
|
+
AND ci.published_at IS NOT NULL
|
|
231
|
+
AND json_extract(cr.payload_json, '$.item.slug') = ?
|
|
232
|
+
ORDER BY ci.id DESC
|
|
233
|
+
LIMIT 2`)
|
|
234
|
+
.bind(slug)
|
|
235
|
+
.all();
|
|
236
|
+
const rows = result.results ?? [];
|
|
237
|
+
if (rows.length === 0)
|
|
238
|
+
return null;
|
|
239
|
+
if (rows.length > 1) {
|
|
240
|
+
throw new PublishedContentReadError('published_slug_ambiguous', 'published slug resolves to more than one canonical content item');
|
|
241
|
+
}
|
|
242
|
+
return decodePublishedContent(rows[0]);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
return wrapReadError(error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function normalizeListOptions(options) {
|
|
249
|
+
if (!isPlainRecord(options)) {
|
|
250
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'published content options must be an object');
|
|
251
|
+
}
|
|
252
|
+
if (Object.keys(options).some((key) => !LIST_OPTION_KEYS.has(key))) {
|
|
253
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'published content options contain an unsupported field');
|
|
254
|
+
}
|
|
255
|
+
const limit = options.limit ?? 20;
|
|
256
|
+
if (typeof limit !== 'number' ||
|
|
257
|
+
!Number.isSafeInteger(limit) ||
|
|
258
|
+
limit < 1 ||
|
|
259
|
+
limit > MAX_PUBLISHED_CONTENT_PAGE_SIZE) {
|
|
260
|
+
throw new PublishedContentReadError('published_content_input_invalid', `limit must be between 1 and ${MAX_PUBLISHED_CONTENT_PAGE_SIZE}`);
|
|
261
|
+
}
|
|
262
|
+
let type;
|
|
263
|
+
if (options.type !== undefined) {
|
|
264
|
+
if (typeof options.type !== 'string' || !CONTENT_TYPES.has(options.type)) {
|
|
265
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'unknown published content type');
|
|
266
|
+
}
|
|
267
|
+
type = options.type;
|
|
268
|
+
}
|
|
269
|
+
let channel;
|
|
270
|
+
if (options.channel !== undefined) {
|
|
271
|
+
assertLookupValue(options.channel, 'channel', 128);
|
|
272
|
+
channel = options.channel;
|
|
273
|
+
}
|
|
274
|
+
let cursor;
|
|
275
|
+
if (options.cursor !== undefined && options.cursor !== null) {
|
|
276
|
+
if (!isPlainRecord(options.cursor) ||
|
|
277
|
+
Object.keys(options.cursor).some((key) => !CURSOR_KEYS.has(key))) {
|
|
278
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'published content cursor is malformed');
|
|
279
|
+
}
|
|
280
|
+
if (typeof options.cursor.publishedAt !== 'number' ||
|
|
281
|
+
!Number.isSafeInteger(options.cursor.publishedAt) ||
|
|
282
|
+
options.cursor.publishedAt < 0) {
|
|
283
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'cursor publishedAt must be a non-negative integer');
|
|
284
|
+
}
|
|
285
|
+
assertLookupValue(options.cursor.contentId, 'cursor contentId', 256);
|
|
286
|
+
cursor = {
|
|
287
|
+
publishedAt: options.cursor.publishedAt,
|
|
288
|
+
contentId: options.cursor.contentId,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
limit,
|
|
293
|
+
type,
|
|
294
|
+
channel,
|
|
295
|
+
cursor,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
export async function listPublishedContent(db, options = {}) {
|
|
299
|
+
const normalized = normalizeListOptions(options);
|
|
300
|
+
const predicates = [
|
|
301
|
+
"ci.status = 'published'",
|
|
302
|
+
'ci.deleted_at IS NULL',
|
|
303
|
+
'ci.published_revision_id IS NOT NULL',
|
|
304
|
+
'ci.published_at IS NOT NULL',
|
|
305
|
+
];
|
|
306
|
+
const values = [];
|
|
307
|
+
if (normalized.type) {
|
|
308
|
+
predicates.push("json_extract(cr.payload_json, '$.item.type') = ?");
|
|
309
|
+
values.push(normalized.type);
|
|
310
|
+
}
|
|
311
|
+
if (normalized.channel) {
|
|
312
|
+
predicates.push("json_extract(cr.payload_json, '$.item.channel') = ?");
|
|
313
|
+
values.push(normalized.channel);
|
|
314
|
+
}
|
|
315
|
+
if (normalized.cursor) {
|
|
316
|
+
predicates.push('(ci.published_at < ? OR (ci.published_at = ? AND ci.id < ?))');
|
|
317
|
+
values.push(normalized.cursor.publishedAt, normalized.cursor.publishedAt, normalized.cursor.contentId);
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
const outlineResult = await db
|
|
321
|
+
.prepare(`${SELECT_PUBLISHED_CONTENT_OUTLINE}
|
|
322
|
+
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
323
|
+
WHERE ${predicates.join('\n AND ')}
|
|
324
|
+
ORDER BY ci.published_at DESC, ci.id DESC
|
|
325
|
+
LIMIT ?`)
|
|
326
|
+
.bind(...values, normalized.limit + 1)
|
|
327
|
+
.all();
|
|
328
|
+
const outlines = outlineResult.results ?? [];
|
|
329
|
+
const selected = [];
|
|
330
|
+
let selectedBytes = 0;
|
|
331
|
+
for (const outline of outlines.slice(0, normalized.limit)) {
|
|
332
|
+
if (typeof outline.content_id !== 'string' ||
|
|
333
|
+
typeof outline.pointer_revision_id !== 'string' ||
|
|
334
|
+
!Number.isSafeInteger(outline.canonical_published_at) ||
|
|
335
|
+
outline.canonical_published_at < 0 ||
|
|
336
|
+
!Number.isSafeInteger(outline.payload_bytes) ||
|
|
337
|
+
outline.payload_bytes < 1) {
|
|
338
|
+
throw new PublishedContentReadError('published_payload_invalid', 'published revision outline is malformed');
|
|
339
|
+
}
|
|
340
|
+
if (outline.payload_bytes > MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES) {
|
|
341
|
+
throw new PublishedContentReadError('published_payload_limit_exceeded', `published revision payload exceeds ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES} bytes`);
|
|
342
|
+
}
|
|
343
|
+
if (selected.length > 0 &&
|
|
344
|
+
selectedBytes + outline.payload_bytes > MAX_PUBLISHED_CONTENT_PAGE_BYTES) {
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
selected.push(outline);
|
|
348
|
+
selectedBytes += outline.payload_bytes;
|
|
349
|
+
}
|
|
350
|
+
if (selected.length === 0)
|
|
351
|
+
return { items: [], nextCursor: null };
|
|
352
|
+
const selectedPredicates = selected.map(() => '(ci.id = ? AND ci.published_revision_id = ?)');
|
|
353
|
+
const selectedValues = selected.flatMap((outline) => [
|
|
354
|
+
outline.content_id,
|
|
355
|
+
outline.pointer_revision_id,
|
|
356
|
+
]);
|
|
357
|
+
const result = await db
|
|
358
|
+
.prepare(`${SELECT_PUBLISHED_CONTENT}
|
|
359
|
+
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
360
|
+
WHERE ci.status = 'published'
|
|
361
|
+
AND ci.deleted_at IS NULL
|
|
362
|
+
AND (${selectedPredicates.join(' OR ')})`)
|
|
363
|
+
.bind(...selectedValues)
|
|
364
|
+
.all();
|
|
365
|
+
const rows = result.results ?? [];
|
|
366
|
+
const rowsByPointer = new Map(rows.map((row) => [`${row.content_id}\0${row.pointer_revision_id}`, row]));
|
|
367
|
+
const items = selected.map((outline) => {
|
|
368
|
+
const row = rowsByPointer.get(`${outline.content_id}\0${outline.pointer_revision_id}`);
|
|
369
|
+
if (!row ||
|
|
370
|
+
row.canonical_published_at !== outline.canonical_published_at ||
|
|
371
|
+
row.payload_json === null ||
|
|
372
|
+
byteLength(row.payload_json) !== outline.payload_bytes) {
|
|
373
|
+
throw new PublishedContentReadError('published_read_failed', 'published revision changed during its bounded read');
|
|
374
|
+
}
|
|
375
|
+
return decodePublishedContent(row);
|
|
376
|
+
});
|
|
377
|
+
const hasMore = outlines.length > selected.length;
|
|
378
|
+
const last = items.at(-1);
|
|
379
|
+
return {
|
|
380
|
+
items,
|
|
381
|
+
nextCursor: hasMore && last ? { publishedAt: last.publishedAt, contentId: last.contentId } : null,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
return wrapReadError(error);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=published-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-content.js","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ContentType } from '../schema/types.js';
|
|
2
|
+
import { type ContentMetadata } from './content-metadata.js';
|
|
2
3
|
import type { D1Database } from './d1.js';
|
|
3
4
|
import { type PublishGuardOutcome } from './publish-guard.js';
|
|
4
5
|
type ContentVisibility = 'free' | 'premium';
|
|
@@ -36,6 +37,8 @@ export interface BaseContentInput {
|
|
|
36
37
|
tags?: string[];
|
|
37
38
|
/** The SEO focus keyword for this content item (migration 0004 column). */
|
|
38
39
|
seoFocusKeyword?: string | null;
|
|
40
|
+
/** Declared site-specific JSON values retained in every immutable revision. */
|
|
41
|
+
metadata?: ContentMetadata;
|
|
39
42
|
}
|
|
40
43
|
export interface ArticleInput extends BaseContentInput {
|
|
41
44
|
type: 'article';
|
|
@@ -89,7 +92,21 @@ export interface PageInput extends BaseContentInput {
|
|
|
89
92
|
editorTakeaways?: string[] | null;
|
|
90
93
|
};
|
|
91
94
|
}
|
|
92
|
-
export type CreateContentInput = ArticleInput | VideoInput | PodcastInput | NewsletterInput | PageInput
|
|
95
|
+
export type CreateContentInput = (ArticleInput | VideoInput | PodcastInput | NewsletterInput | PageInput) & {
|
|
96
|
+
/** Optional namespaced archive key. New copies deliberately do not inherit it. */
|
|
97
|
+
sourceId?: string | null;
|
|
98
|
+
/** Initial historical values for archive ingestion; normal creates omit this. */
|
|
99
|
+
initialTimestamps?: {
|
|
100
|
+
publishedAt?: number | null;
|
|
101
|
+
createdAt?: number | null;
|
|
102
|
+
updatedAt?: number | null;
|
|
103
|
+
publishTz?: string | null;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
export declare class VerifiedMediaDurationConflictError extends Error {
|
|
107
|
+
readonly code = "verified_duration_conflict";
|
|
108
|
+
constructor();
|
|
109
|
+
}
|
|
93
110
|
export interface UpdateContentInput extends Partial<BaseContentInput> {
|
|
94
111
|
content?: Partial<ArticleInput['content'] | VideoInput['content'] | PodcastInput['content'] | NewsletterInput['content'] | PageInput['content']>;
|
|
95
112
|
relations?: Array<{
|
|
@@ -131,6 +148,8 @@ export interface ContentItemRecord {
|
|
|
131
148
|
ai_locked_fields: string | null;
|
|
132
149
|
published_revision_id: string | null;
|
|
133
150
|
seo_focus_keyword: string | null;
|
|
151
|
+
metadata_json: string;
|
|
152
|
+
source_id: string | null;
|
|
134
153
|
created_at: number | null;
|
|
135
154
|
updated_at: number | null;
|
|
136
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/engine/publisher.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGlF,KAAK,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAA;AAiB3C,qBAAa,6BAA8B,SAAQ,KAAK;IACvD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,EAAE,mBAAmB;CAMxC;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/engine/publisher.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGlF,KAAK,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAA;AAiB3C,qBAAa,6BAA8B,SAAQ,KAAK;IACvD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,EAAE,mBAAmB;CAMxC;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC1B;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACrD,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACjC,CAAA;CACD;AAED,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IACnD,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAChC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACnC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACpC,CAAA;CACD;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACrD,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE;QACR,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC/B,CAAA;CACD;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACxD,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACjC,CAAA;CACD;AAED,MAAM,WAAW,SAAU,SAAQ,gBAAgB;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACjC,CAAA;CACD;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC9B,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,eAAe,GACf,SAAS,CACX,GAAG;IACH,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE;QACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACzB,CAAA;CACD,CAAA;AAoBD,qBAAa,kCAAmC,SAAQ,KAAK;IAC5D,QAAQ,CAAC,IAAI,gCAA+B;;CAM5C;AA6FD,MAAM,WAAW,kBAAmB,SAAQ,OAAO,CAAC,gBAAgB,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CACd,YAAY,CAAC,SAAS,CAAC,GACvB,UAAU,CAAC,SAAS,CAAC,GACrB,YAAY,CAAC,SAAS,CAAC,GACvB,eAAe,CAAC,SAAS,CAAC,GAC1B,SAAS,CAAC,SAAS,CAAC,CACtB,CAAA;IACD,SAAS,CAAC,EAAE,KAAK,CAAC;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACtB,CAAC,CAAA;IACF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAmBD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,iBAAiB,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AA+CD,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAkCjB;AA8CD,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAC3E,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,mBAAmB,CACxC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAQ7E;AAED,wBAAsB,aAAa,CAClC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,kBAAkB,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA+HvC;AAED,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,GACR,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAKnC;AAED,wBAAsB,iBAAiB,CACtC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,kBAAkB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA8XlC;AAED,wBAAsB,eAAe,CACpC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,SAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,6BAA6B,CAClD,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAkCrC;AAED,wBAAsB,gCAAgC,CACrD,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,wBAAwB,CAC7C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhF;AAED,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAuF9C;AAED,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,kBAAkB,CACvC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAoDzC"}
|