@commonpub/server 2.55.0 → 2.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/layout.d.ts +147 -0
- package/dist/layout/layout.d.ts.map +1 -0
- package/dist/layout/layout.js +360 -0
- package/dist/layout/layout.js.map +1 -0
- package/dist/layout/seed.d.ts +18 -0
- package/dist/layout/seed.d.ts.map +1 -0
- package/dist/layout/seed.js +106 -0
- package/dist/layout/seed.js.map +1 -0
- package/dist/theme.d.ts +39 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +135 -9
- package/dist/theme.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -29,7 +29,12 @@ export { createRateLimitStore, createRedisClient, createRealtimePubSub, createRe
|
|
|
29
29
|
export type { RealtimePubSub, RedisClient, FailOpenHook } from '@commonpub/infra';
|
|
30
30
|
export { publishSseEvent, subscribeSseEvents, realtimeChannel, resetRealtimeForTests } from './realtime/index.js';
|
|
31
31
|
export type { SseEventPayload } from './realtime/index.js';
|
|
32
|
-
export { resolveTheme, getCustomTokenOverrides, setUserTheme } from './theme.js';
|
|
32
|
+
export { resolveTheme, getCustomTokenOverrides, setUserTheme, listCustomThemes, getCustomTheme, saveCustomTheme, deleteCustomTheme, customThemeDataAttr, parseCustomThemeId, CUSTOM_THEME_PREFIX, } from './theme.js';
|
|
33
|
+
export type { CustomThemeRecord } from './theme.js';
|
|
34
|
+
export { listLayouts, getLayoutByScope, getLayoutById, saveLayout, deleteLayout, publishLayout, listLayoutVersions, revertToVersion, } from './layout/layout.js';
|
|
35
|
+
export type { LayoutScope, LayoutInput, LayoutRecord, LayoutZone, LayoutZoneInput, LayoutRowInput, LayoutRowResolved, LayoutSectionInput, LayoutSectionResolved, LayoutVersionRecord, LayoutPageMeta, } from './layout/layout.js';
|
|
36
|
+
export { seedHomepageLayout } from './layout/seed.js';
|
|
37
|
+
export type { SeedHomepageResult } from './layout/seed.js';
|
|
33
38
|
export { getOrCreateActorKeypair, getOrCreateInstanceKeypair, buildInstanceActor, resolveRemoteActor, searchRemoteActor, getRemoteActorProfile, sendFollow, acceptFollow, rejectFollow, unfollowRemote, federateContent, federateUpdate, federateDelete, federateLike, federateUnlike, buildContentUri, resolveContentObjectUri, getContentSlugById, getFollowers, getFollowing, listFederationActivity, createInboxHandlers, deliverPendingActivities, listFederatedTimeline, getFederatedContent, likeRemoteContent, boostRemoteContent, federateReply, listRemoteReplies, incrementFederatedViewCount, searchFederatedContent, getHubActorUri, getOrCreateHubKeypair, buildHubGroupActor, handleHubFollow, handleHubUnfollow, getHubFederatedFollowers, federateHubActor, federateHubPost, federateHubShare, federateHubPostDelete, federateHubPostUpdate, federateHubPostLike, federateHubPostUnlike, federateHubPostReply, federateHubUpdate, sendPostToRemoteHub, getHubPostNoteUri, createMirror, activateMirror, pauseMirror, resumeMirror, cancelMirror, listMirrors, getMirror, type MirrorConfig, processAuthorize, processTokenExchange, registerOAuthClient, linkFederatedAccount, findUserByFederatedAccount, listOAuthClients, resolveRemoteHandle, federateDirectMessage, isFederatedHandle, processDynamicRegistration, storeOAuthState, consumeOAuthState, exchangeCodeForToken, createFederatedSession, storePendingLink, consumePendingLink, getStoredTrustedInstances, addTrustedInstance, removeTrustedInstance, isDomainTrusted, type AuthorizeResult, type TokenResult, type OAuthLoginState, type FederatedSessionResult, type PendingLinkData, type RemoteActorProfile, type FederatedContentItem, type FederatedTimelineOptions, repairFederatedContentTypes, type InboxHandlerOptions, type DeliveryResult, type DeliveryOptions, cleanupDeliveredActivities, backfillFromOutbox, type BackfillResult, countOutboxItems, countInstanceOutboxItems, getOutboxPage, getInstanceOutboxPage, countHubOutboxItems, getHubOutboxPage, isCircuitOpen, recordDeliverySuccess, recordDeliveryFailure, getDeliveryHealth, listFederatedHubs, getFederatedHub, getFederatedHubByActorUri, followRemoteHub, sendHubFollow, acceptHubFollow, unfollowRemoteHub, autoDiscoverHub, ingestFederatedHubPost, getFederatedHubPost, listFederatedHubPosts, listFederatedHubMembers, upsertFederatedHubMember, deleteFederatedHubPost, likeFederatedHubPost, unlikeFederatedHubPost, createFederatedHubPostReply, listFederatedHubPostReplies, backfillHubFromOutbox, fetchRemoteHubFollowers, repairFederatedHubPostActors, refreshFederatedHubMetadata, toggleFederatedHubPostLike, joinFederatedHub, getFederatedHubFollowStatus, getLikedFederatedHubPostIds, } from './federation/index.js';
|
|
34
39
|
export { storeAuthCode, consumeAuthCode, cleanupExpiredCodes } from './oauthCodes.js';
|
|
35
40
|
export { listContests, getContestBySlug, createContest, updateContest, listContestEntries, submitContestEntry, judgeContestEntry, deleteContest, transitionContestStatus, calculateContestRanks, withdrawContestEntry, } from './contest/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,11 @@ export { createRateLimitStore, createRedisClient, createRealtimePubSub, createRe
|
|
|
30
30
|
// Realtime pub/sub singleton for SSE fanout
|
|
31
31
|
export { publishSseEvent, subscribeSseEvents, realtimeChannel, resetRealtimeForTests } from './realtime/index.js';
|
|
32
32
|
// Theme
|
|
33
|
-
export { resolveTheme, getCustomTokenOverrides, setUserTheme } from './theme.js';
|
|
33
|
+
export { resolveTheme, getCustomTokenOverrides, setUserTheme, listCustomThemes, getCustomTheme, saveCustomTheme, deleteCustomTheme, customThemeDataAttr, parseCustomThemeId, CUSTOM_THEME_PREFIX, } from './theme.js';
|
|
34
|
+
// Layout engine (Phase 1 — session 157)
|
|
35
|
+
export { listLayouts, getLayoutByScope, getLayoutById, saveLayout, deleteLayout, publishLayout, listLayoutVersions, revertToVersion, } from './layout/layout.js';
|
|
36
|
+
// Layout engine — homepage seed helper (Phase 1c — session 158)
|
|
37
|
+
export { seedHomepageLayout } from './layout/seed.js';
|
|
34
38
|
// Federation
|
|
35
39
|
export { getOrCreateActorKeypair, getOrCreateInstanceKeypair, buildInstanceActor, resolveRemoteActor, searchRemoteActor, getRemoteActorProfile, sendFollow, acceptFollow, rejectFollow, unfollowRemote, federateContent, federateUpdate, federateDelete, federateLike, federateUnlike, buildContentUri, resolveContentObjectUri, getContentSlugById, getFollowers, getFollowing, listFederationActivity, createInboxHandlers, deliverPendingActivities, listFederatedTimeline, getFederatedContent, likeRemoteContent, boostRemoteContent, federateReply, listRemoteReplies, incrementFederatedViewCount, searchFederatedContent, getHubActorUri, getOrCreateHubKeypair, buildHubGroupActor, handleHubFollow, handleHubUnfollow, getHubFederatedFollowers, federateHubActor, federateHubPost, federateHubShare, federateHubPostDelete, federateHubPostUpdate, federateHubPostLike, federateHubPostUnlike, federateHubPostReply, federateHubUpdate, sendPostToRemoteHub, getHubPostNoteUri, createMirror, activateMirror, pauseMirror, resumeMirror, cancelMirror, listMirrors, getMirror, processAuthorize, processTokenExchange, registerOAuthClient, linkFederatedAccount, findUserByFederatedAccount, listOAuthClients, resolveRemoteHandle, federateDirectMessage, isFederatedHandle, processDynamicRegistration, storeOAuthState, consumeOAuthState, exchangeCodeForToken, createFederatedSession, storePendingLink, consumePendingLink, getStoredTrustedInstances, addTrustedInstance, removeTrustedInstance, isDomainTrusted, repairFederatedContentTypes, cleanupDeliveredActivities, backfillFromOutbox, countOutboxItems, countInstanceOutboxItems, getOutboxPage, getInstanceOutboxPage, countHubOutboxItems, getHubOutboxPage, isCircuitOpen, recordDeliverySuccess, recordDeliveryFailure, getDeliveryHealth,
|
|
36
40
|
// Hub mirroring
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA2ErE,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,gBAAgB;AAChB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,UAAU;AACV,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,aAAa,EACb,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,qBAAqB;AACrB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO;AACP,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,WAAW;AACX,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAQ5B,SAAS;AACT,OAAO,EACL,UAAU,EACV,OAAO,EACT,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,WAAW;AACX,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO;AACP,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,yBAAyB;AACzB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAY1B,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG1G,WAAW;AACX,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,2DAA2D;AAC3D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,4CAA4C;AAC5C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,QAAQ;AACR,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import type { DB } from '../types.js';
|
|
2
|
+
/** Scope of a layout — what the layout is FOR. Discriminated union. */
|
|
3
|
+
export type LayoutScope = {
|
|
4
|
+
type: 'route';
|
|
5
|
+
path: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'virtual';
|
|
8
|
+
key: '__footer' | '__not-found' | '__error';
|
|
9
|
+
} | {
|
|
10
|
+
type: 'custom-page';
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
export interface LayoutPageMeta {
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
ogImage?: string;
|
|
17
|
+
noindex?: boolean;
|
|
18
|
+
ogType?: 'website' | 'article' | 'profile';
|
|
19
|
+
access?: 'public' | 'members' | 'admin';
|
|
20
|
+
frame?: 'narrow' | 'wide' | 'two-column' | 'three-column' | 'sidebar-left' | 'sidebar-right';
|
|
21
|
+
}
|
|
22
|
+
export interface LayoutSectionInput {
|
|
23
|
+
id?: string;
|
|
24
|
+
order: number;
|
|
25
|
+
type: string;
|
|
26
|
+
config: Record<string, unknown>;
|
|
27
|
+
colSpan?: number;
|
|
28
|
+
responsive?: {
|
|
29
|
+
sm?: number;
|
|
30
|
+
md?: number;
|
|
31
|
+
lg?: number;
|
|
32
|
+
};
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
visibility?: {
|
|
35
|
+
roles?: string[];
|
|
36
|
+
features?: string[];
|
|
37
|
+
hideAt?: ('sm' | 'md' | 'lg')[];
|
|
38
|
+
};
|
|
39
|
+
schemaVersion?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface LayoutRowInput {
|
|
42
|
+
id?: string;
|
|
43
|
+
order: number;
|
|
44
|
+
config?: {
|
|
45
|
+
gap?: 'none' | 'sm' | 'md' | 'lg';
|
|
46
|
+
align?: 'start' | 'center' | 'stretch';
|
|
47
|
+
background?: string;
|
|
48
|
+
paddingY?: 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
49
|
+
};
|
|
50
|
+
sections: LayoutSectionInput[];
|
|
51
|
+
}
|
|
52
|
+
export interface LayoutZoneInput {
|
|
53
|
+
zone: string;
|
|
54
|
+
rows: LayoutRowInput[];
|
|
55
|
+
}
|
|
56
|
+
export interface LayoutInput {
|
|
57
|
+
scope: LayoutScope;
|
|
58
|
+
name: string;
|
|
59
|
+
pageMeta?: LayoutPageMeta;
|
|
60
|
+
zones: LayoutZoneInput[];
|
|
61
|
+
state?: 'draft' | 'published';
|
|
62
|
+
}
|
|
63
|
+
export interface LayoutRecord {
|
|
64
|
+
id: string;
|
|
65
|
+
scope: LayoutScope;
|
|
66
|
+
name: string;
|
|
67
|
+
pageMeta: LayoutPageMeta | null;
|
|
68
|
+
state: 'draft' | 'published';
|
|
69
|
+
publishedVersionId: string | null;
|
|
70
|
+
zones: LayoutZone[];
|
|
71
|
+
createdAt: string;
|
|
72
|
+
updatedAt: string;
|
|
73
|
+
}
|
|
74
|
+
export interface LayoutZone {
|
|
75
|
+
zone: string;
|
|
76
|
+
rows: LayoutRowResolved[];
|
|
77
|
+
}
|
|
78
|
+
export interface LayoutRowResolved {
|
|
79
|
+
id: string;
|
|
80
|
+
order: number;
|
|
81
|
+
config: LayoutRowInput['config'] | null;
|
|
82
|
+
sections: LayoutSectionResolved[];
|
|
83
|
+
}
|
|
84
|
+
export interface LayoutSectionResolved {
|
|
85
|
+
id: string;
|
|
86
|
+
order: number;
|
|
87
|
+
type: string;
|
|
88
|
+
config: Record<string, unknown>;
|
|
89
|
+
colSpan: number;
|
|
90
|
+
responsive: {
|
|
91
|
+
sm?: number;
|
|
92
|
+
md?: number;
|
|
93
|
+
lg?: number;
|
|
94
|
+
} | null;
|
|
95
|
+
enabled: boolean;
|
|
96
|
+
visibility: LayoutSectionInput['visibility'] | null;
|
|
97
|
+
schemaVersion: number;
|
|
98
|
+
}
|
|
99
|
+
export interface LayoutVersionRecord {
|
|
100
|
+
id: string;
|
|
101
|
+
layoutId: string;
|
|
102
|
+
version: number;
|
|
103
|
+
snapshot: LayoutRecord;
|
|
104
|
+
publishedBy: string | null;
|
|
105
|
+
publishedAt: string;
|
|
106
|
+
}
|
|
107
|
+
/** Fetch a layout by scope. Returns the FULL nested shape (zones → rows → sections). */
|
|
108
|
+
export declare function getLayoutByScope(db: DB, scope: LayoutScope): Promise<LayoutRecord | null>;
|
|
109
|
+
/** Fetch a layout by its uuid. */
|
|
110
|
+
export declare function getLayoutById(db: DB, id: string): Promise<LayoutRecord | null>;
|
|
111
|
+
/** List all layouts, optionally filtered by scope type. */
|
|
112
|
+
export declare function listLayouts(db: DB, opts?: {
|
|
113
|
+
scopeType?: 'route' | 'virtual' | 'custom-page';
|
|
114
|
+
}): Promise<LayoutRecord[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Save a layout — atomic "replace whole layout" semantics. Accepts the
|
|
117
|
+
* full nested zones → rows → sections payload, normalizes positions to
|
|
118
|
+
* {0..n}, and rewrites the children in a single transaction.
|
|
119
|
+
*
|
|
120
|
+
* Returns the saved layout in resolved form. Server-generates UUIDs for
|
|
121
|
+
* any row/section without an `id` (treats them as new). Existing rows
|
|
122
|
+
* with the same `id` are preserved (stable across reorders).
|
|
123
|
+
*/
|
|
124
|
+
export declare function saveLayout(db: DB, input: LayoutInput, opts?: {
|
|
125
|
+
id?: string;
|
|
126
|
+
userId?: string;
|
|
127
|
+
}): Promise<LayoutRecord>;
|
|
128
|
+
/** Delete a layout. Cascades through rows + sections + versions via FK. */
|
|
129
|
+
export declare function deleteLayout(db: DB, id: string): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Snapshot the current layout into `layout_versions`, set the layout's
|
|
132
|
+
* `published_version_id`, transition state → 'published'. The snapshot is
|
|
133
|
+
* the full nested record at the moment of publish.
|
|
134
|
+
*/
|
|
135
|
+
export declare function publishLayout(db: DB, id: string, opts?: {
|
|
136
|
+
publishedBy?: string;
|
|
137
|
+
}): Promise<LayoutVersionRecord>;
|
|
138
|
+
/** List versions for a layout, newest first. */
|
|
139
|
+
export declare function listLayoutVersions(db: DB, layoutId: string): Promise<LayoutVersionRecord[]>;
|
|
140
|
+
/**
|
|
141
|
+
* Revert: rewrite the current layout's rows + sections from a snapshot.
|
|
142
|
+
* The original version row is NOT touched — snapshots are immutable.
|
|
143
|
+
*/
|
|
144
|
+
export declare function revertToVersion(db: DB, layoutId: string, versionId: string, opts?: {
|
|
145
|
+
userId?: string;
|
|
146
|
+
}): Promise<LayoutRecord>;
|
|
147
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/layout/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout engine — server CRUD.
|
|
3
|
+
*
|
|
4
|
+
* Spec: `docs/plans/layout-and-pages.md` §3, §4, §5.
|
|
5
|
+
*
|
|
6
|
+
* Storage: 4 normalized tables (layouts → layout_rows → layout_sections,
|
|
7
|
+
* layout_versions for snapshots). Defined in `@commonpub/schema`'s
|
|
8
|
+
* `layout.ts` (session 155). Migration 0005 creates them; this module
|
|
9
|
+
* is the only thing that reads/writes.
|
|
10
|
+
*
|
|
11
|
+
* Behaviour summary:
|
|
12
|
+
* - `listLayouts`, `getLayoutByScope`, `getLayoutById` are reads
|
|
13
|
+
* - `saveLayout` does atomic "replace whole layout" — accepts the
|
|
14
|
+
* entire nested zones→rows→sections payload, diffs against current
|
|
15
|
+
* state in a transaction, issues minimal inserts/updates/deletes,
|
|
16
|
+
* re-numbers positions to {0..n}
|
|
17
|
+
* - `publishLayout` snapshots current draft into layout_versions,
|
|
18
|
+
* sets `layouts.published_version_id`, transitions state to 'published'
|
|
19
|
+
* - `revertToVersion` copies a version's snapshot into the layout's
|
|
20
|
+
* current rows/sections (replacing them); does NOT delete the version
|
|
21
|
+
* - `deleteLayout` cascades through rows + sections + versions via FK
|
|
22
|
+
*
|
|
23
|
+
* Caching: callers cache the `getLayoutByScope` result (60s server-side,
|
|
24
|
+
* 5min client-side). Cache invalidation: the SSR layer middleware calls
|
|
25
|
+
* `invalidateLayoutCache()` after any write — see `instanceLayouts.ts`
|
|
26
|
+
* in `layers/base/server/utils/` (next phase).
|
|
27
|
+
*/
|
|
28
|
+
import { and, asc, desc, eq } from 'drizzle-orm';
|
|
29
|
+
import { layouts, layoutRows, layoutSections, layoutVersions, } from '@commonpub/schema';
|
|
30
|
+
// ---- Helpers ------------------------------------------------------------
|
|
31
|
+
function unpackScope(scopeType, scopeKey) {
|
|
32
|
+
if (scopeType === 'route')
|
|
33
|
+
return { type: 'route', path: scopeKey };
|
|
34
|
+
if (scopeType === 'virtual') {
|
|
35
|
+
return { type: 'virtual', key: scopeKey };
|
|
36
|
+
}
|
|
37
|
+
return { type: 'custom-page', path: scopeKey };
|
|
38
|
+
}
|
|
39
|
+
function packScope(scope) {
|
|
40
|
+
return {
|
|
41
|
+
scopeType: scope.type,
|
|
42
|
+
scopeKey: scope.type === 'virtual' ? scope.key : scope.path,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Convert DB section row → resolved shape (typed JSON columns). */
|
|
46
|
+
function rowToSection(s) {
|
|
47
|
+
return {
|
|
48
|
+
id: s.id,
|
|
49
|
+
order: s.position,
|
|
50
|
+
type: s.type,
|
|
51
|
+
config: (s.config ?? {}),
|
|
52
|
+
colSpan: s.colSpan,
|
|
53
|
+
responsive: (s.responsive ?? null),
|
|
54
|
+
enabled: s.enabled,
|
|
55
|
+
visibility: (s.visibility ?? null),
|
|
56
|
+
schemaVersion: s.schemaVersion,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// ---- Reads --------------------------------------------------------------
|
|
60
|
+
/** Fetch a layout by scope. Returns the FULL nested shape (zones → rows → sections). */
|
|
61
|
+
export async function getLayoutByScope(db, scope) {
|
|
62
|
+
const { scopeType, scopeKey } = packScope(scope);
|
|
63
|
+
const [row] = await db
|
|
64
|
+
.select()
|
|
65
|
+
.from(layouts)
|
|
66
|
+
.where(and(eq(layouts.scopeType, scopeType), eq(layouts.scopeKey, scopeKey)));
|
|
67
|
+
if (!row)
|
|
68
|
+
return null;
|
|
69
|
+
return assembleLayout(db, row);
|
|
70
|
+
}
|
|
71
|
+
/** Fetch a layout by its uuid. */
|
|
72
|
+
export async function getLayoutById(db, id) {
|
|
73
|
+
const [row] = await db.select().from(layouts).where(eq(layouts.id, id));
|
|
74
|
+
if (!row)
|
|
75
|
+
return null;
|
|
76
|
+
return assembleLayout(db, row);
|
|
77
|
+
}
|
|
78
|
+
/** List all layouts, optionally filtered by scope type. */
|
|
79
|
+
export async function listLayouts(db, opts = {}) {
|
|
80
|
+
const rows = opts.scopeType
|
|
81
|
+
? await db.select().from(layouts).where(eq(layouts.scopeType, opts.scopeType))
|
|
82
|
+
: await db.select().from(layouts);
|
|
83
|
+
return Promise.all(rows.map((r) => assembleLayout(db, r)));
|
|
84
|
+
}
|
|
85
|
+
/** Inner helper: take a layout-table row + fetch its rows + sections, return assembled record. */
|
|
86
|
+
async function assembleLayout(db, row) {
|
|
87
|
+
const rowsForLayout = await db
|
|
88
|
+
.select()
|
|
89
|
+
.from(layoutRows)
|
|
90
|
+
.where(eq(layoutRows.layoutId, row.id))
|
|
91
|
+
.orderBy(asc(layoutRows.zone), asc(layoutRows.position));
|
|
92
|
+
const sectionRowIds = rowsForLayout.map((r) => r.id);
|
|
93
|
+
const allSections = sectionRowIds.length > 0
|
|
94
|
+
? await db
|
|
95
|
+
.select()
|
|
96
|
+
.from(layoutSections)
|
|
97
|
+
.orderBy(asc(layoutSections.position))
|
|
98
|
+
: [];
|
|
99
|
+
const sectionsByRow = new Map();
|
|
100
|
+
for (const s of allSections) {
|
|
101
|
+
if (!sectionRowIds.includes(s.rowId))
|
|
102
|
+
continue;
|
|
103
|
+
const arr = sectionsByRow.get(s.rowId) ?? [];
|
|
104
|
+
arr.push(rowToSection(s));
|
|
105
|
+
sectionsByRow.set(s.rowId, arr);
|
|
106
|
+
}
|
|
107
|
+
// Group rows by zone preserving order
|
|
108
|
+
const zoneMap = new Map();
|
|
109
|
+
for (const r of rowsForLayout) {
|
|
110
|
+
const list = zoneMap.get(r.zone) ?? [];
|
|
111
|
+
list.push({
|
|
112
|
+
id: r.id,
|
|
113
|
+
order: r.position,
|
|
114
|
+
config: (r.config ?? null),
|
|
115
|
+
sections: sectionsByRow.get(r.id) ?? [],
|
|
116
|
+
});
|
|
117
|
+
zoneMap.set(r.zone, list);
|
|
118
|
+
}
|
|
119
|
+
const zones = [...zoneMap.entries()].map(([zone, rs]) => ({ zone, rows: rs }));
|
|
120
|
+
return {
|
|
121
|
+
id: row.id,
|
|
122
|
+
scope: unpackScope(row.scopeType, row.scopeKey),
|
|
123
|
+
name: row.name,
|
|
124
|
+
pageMeta: (row.pageMeta ?? null),
|
|
125
|
+
state: row.state,
|
|
126
|
+
publishedVersionId: row.publishedVersionId,
|
|
127
|
+
zones,
|
|
128
|
+
createdAt: row.createdAt.toISOString(),
|
|
129
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ---- Writes -------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Save a layout — atomic "replace whole layout" semantics. Accepts the
|
|
135
|
+
* full nested zones → rows → sections payload, normalizes positions to
|
|
136
|
+
* {0..n}, and rewrites the children in a single transaction.
|
|
137
|
+
*
|
|
138
|
+
* Returns the saved layout in resolved form. Server-generates UUIDs for
|
|
139
|
+
* any row/section without an `id` (treats them as new). Existing rows
|
|
140
|
+
* with the same `id` are preserved (stable across reorders).
|
|
141
|
+
*/
|
|
142
|
+
export async function saveLayout(db, input, opts = {}) {
|
|
143
|
+
const { scopeType, scopeKey } = packScope(input.scope);
|
|
144
|
+
const now = new Date();
|
|
145
|
+
// Wrap the whole upsert + child rewrite in a single transaction so two
|
|
146
|
+
// admins saving the same layout simultaneously can't interleave their
|
|
147
|
+
// delete + insert calls (which would either lose data silently OR hit
|
|
148
|
+
// the unique-(layout_id,zone,position) constraint and 500). Last-writer-
|
|
149
|
+
// wins semantics still apply at the transaction boundary, but the
|
|
150
|
+
// partial-state failure mode is impossible inside the tx.
|
|
151
|
+
//
|
|
152
|
+
// PGlite (used by tests) supports db.transaction; real Postgres ditto.
|
|
153
|
+
const layoutId = await db.transaction(async (tx) => {
|
|
154
|
+
let id = opts.id ?? null;
|
|
155
|
+
if (!id) {
|
|
156
|
+
// Look up by scope first — one layout per scope is the invariant.
|
|
157
|
+
const [existing] = await tx
|
|
158
|
+
.select({ id: layouts.id })
|
|
159
|
+
.from(layouts)
|
|
160
|
+
.where(and(eq(layouts.scopeType, scopeType), eq(layouts.scopeKey, scopeKey)));
|
|
161
|
+
id = existing?.id ?? null;
|
|
162
|
+
}
|
|
163
|
+
// Upsert the layouts row first (need its id for FK).
|
|
164
|
+
if (id) {
|
|
165
|
+
await tx
|
|
166
|
+
.update(layouts)
|
|
167
|
+
.set({
|
|
168
|
+
name: input.name,
|
|
169
|
+
pageMeta: input.pageMeta ?? null,
|
|
170
|
+
state: input.state ?? 'draft',
|
|
171
|
+
updatedBy: opts.userId ?? null,
|
|
172
|
+
updatedAt: now,
|
|
173
|
+
})
|
|
174
|
+
.where(eq(layouts.id, id));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const [created] = await tx
|
|
178
|
+
.insert(layouts)
|
|
179
|
+
.values({
|
|
180
|
+
scopeType,
|
|
181
|
+
scopeKey,
|
|
182
|
+
name: input.name,
|
|
183
|
+
pageMeta: input.pageMeta ?? null,
|
|
184
|
+
state: input.state ?? 'draft',
|
|
185
|
+
createdBy: opts.userId ?? null,
|
|
186
|
+
updatedBy: opts.userId ?? null,
|
|
187
|
+
})
|
|
188
|
+
.returning({ id: layouts.id });
|
|
189
|
+
id = created.id;
|
|
190
|
+
}
|
|
191
|
+
// Children rewrite — delete all rows for this layout (sections cascade),
|
|
192
|
+
// then re-insert from input. Position-stable IDs are preserved when the
|
|
193
|
+
// input row has an `id` field.
|
|
194
|
+
await tx.delete(layoutRows).where(eq(layoutRows.layoutId, id));
|
|
195
|
+
// Normalize positions {0..n} per zone for rows, {0..n} per row for sections
|
|
196
|
+
// (ignore caller-provided values to enforce canonical order).
|
|
197
|
+
const zoneRowsToInsert = [];
|
|
198
|
+
for (const z of input.zones) {
|
|
199
|
+
const sorted = [...z.rows].sort((a, b) => a.order - b.order);
|
|
200
|
+
sorted.forEach((r, i) => {
|
|
201
|
+
zoneRowsToInsert.push({
|
|
202
|
+
id: r.id,
|
|
203
|
+
zone: z.zone,
|
|
204
|
+
position: i,
|
|
205
|
+
config: r.config ?? null,
|
|
206
|
+
sections: r.sections,
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (zoneRowsToInsert.length === 0) {
|
|
211
|
+
// Empty layout — children already cleared by the delete above
|
|
212
|
+
return id;
|
|
213
|
+
}
|
|
214
|
+
// Insert rows + capture their final IDs
|
|
215
|
+
const insertedRows = await tx
|
|
216
|
+
.insert(layoutRows)
|
|
217
|
+
.values(zoneRowsToInsert.map((r) => ({
|
|
218
|
+
...(r.id ? { id: r.id } : {}),
|
|
219
|
+
layoutId: id,
|
|
220
|
+
zone: r.zone,
|
|
221
|
+
position: r.position,
|
|
222
|
+
config: r.config,
|
|
223
|
+
})))
|
|
224
|
+
.returning({ id: layoutRows.id, zone: layoutRows.zone, position: layoutRows.position });
|
|
225
|
+
// Build {zone, position} → rowId map so we know where to attach sections
|
|
226
|
+
const rowIdMap = new Map();
|
|
227
|
+
for (const r of insertedRows) {
|
|
228
|
+
rowIdMap.set(`${r.zone}|${r.position}`, r.id);
|
|
229
|
+
}
|
|
230
|
+
// Insert sections per row
|
|
231
|
+
const sectionsToInsert = [];
|
|
232
|
+
for (const r of zoneRowsToInsert) {
|
|
233
|
+
const rowId = rowIdMap.get(`${r.zone}|${r.position}`);
|
|
234
|
+
const sortedSections = [...r.sections].sort((a, b) => a.order - b.order);
|
|
235
|
+
sortedSections.forEach((s, i) => {
|
|
236
|
+
sectionsToInsert.push({
|
|
237
|
+
...(s.id ? { id: s.id } : {}),
|
|
238
|
+
rowId,
|
|
239
|
+
position: i,
|
|
240
|
+
enabled: s.enabled ?? true,
|
|
241
|
+
type: s.type,
|
|
242
|
+
config: s.config,
|
|
243
|
+
colSpan: s.colSpan ?? 12,
|
|
244
|
+
responsive: s.responsive ?? null,
|
|
245
|
+
visibility: s.visibility ?? null,
|
|
246
|
+
schemaVersion: s.schemaVersion ?? 1,
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (sectionsToInsert.length > 0) {
|
|
251
|
+
await tx.insert(layoutSections).values(sectionsToInsert);
|
|
252
|
+
}
|
|
253
|
+
return id;
|
|
254
|
+
});
|
|
255
|
+
// Re-fetch outside the transaction so the returned shape uses the post-
|
|
256
|
+
// commit state. (assembleLayout makes multiple selects; running them
|
|
257
|
+
// inside the tx works too but isn't necessary.)
|
|
258
|
+
return (await getLayoutById(db, layoutId));
|
|
259
|
+
}
|
|
260
|
+
/** Delete a layout. Cascades through rows + sections + versions via FK. */
|
|
261
|
+
export async function deleteLayout(db, id) {
|
|
262
|
+
await db.delete(layouts).where(eq(layouts.id, id));
|
|
263
|
+
}
|
|
264
|
+
// ---- Versioning ---------------------------------------------------------
|
|
265
|
+
/**
|
|
266
|
+
* Snapshot the current layout into `layout_versions`, set the layout's
|
|
267
|
+
* `published_version_id`, transition state → 'published'. The snapshot is
|
|
268
|
+
* the full nested record at the moment of publish.
|
|
269
|
+
*/
|
|
270
|
+
export async function publishLayout(db, id, opts = {}) {
|
|
271
|
+
const current = await getLayoutById(db, id);
|
|
272
|
+
if (!current)
|
|
273
|
+
throw new Error(`Layout not found: ${id}`);
|
|
274
|
+
// Compute next version number
|
|
275
|
+
const [latest] = await db
|
|
276
|
+
.select({ version: layoutVersions.version })
|
|
277
|
+
.from(layoutVersions)
|
|
278
|
+
.where(eq(layoutVersions.layoutId, id))
|
|
279
|
+
.orderBy(desc(layoutVersions.version))
|
|
280
|
+
.limit(1);
|
|
281
|
+
const nextVersion = (latest?.version ?? 0) + 1;
|
|
282
|
+
const [inserted] = await db
|
|
283
|
+
.insert(layoutVersions)
|
|
284
|
+
.values({
|
|
285
|
+
layoutId: id,
|
|
286
|
+
version: nextVersion,
|
|
287
|
+
snapshot: current,
|
|
288
|
+
publishedBy: opts.publishedBy ?? null,
|
|
289
|
+
})
|
|
290
|
+
.returning();
|
|
291
|
+
await db
|
|
292
|
+
.update(layouts)
|
|
293
|
+
.set({ publishedVersionId: inserted.id, state: 'published', updatedAt: new Date() })
|
|
294
|
+
.where(eq(layouts.id, id));
|
|
295
|
+
return {
|
|
296
|
+
id: inserted.id,
|
|
297
|
+
layoutId: id,
|
|
298
|
+
version: nextVersion,
|
|
299
|
+
snapshot: current,
|
|
300
|
+
publishedBy: inserted.publishedBy,
|
|
301
|
+
publishedAt: inserted.publishedAt.toISOString(),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/** List versions for a layout, newest first. */
|
|
305
|
+
export async function listLayoutVersions(db, layoutId) {
|
|
306
|
+
const rows = await db
|
|
307
|
+
.select()
|
|
308
|
+
.from(layoutVersions)
|
|
309
|
+
.where(eq(layoutVersions.layoutId, layoutId))
|
|
310
|
+
.orderBy(desc(layoutVersions.version));
|
|
311
|
+
return rows.map((r) => ({
|
|
312
|
+
id: r.id,
|
|
313
|
+
layoutId: r.layoutId,
|
|
314
|
+
version: r.version,
|
|
315
|
+
snapshot: r.snapshot,
|
|
316
|
+
publishedBy: r.publishedBy,
|
|
317
|
+
publishedAt: r.publishedAt.toISOString(),
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Revert: rewrite the current layout's rows + sections from a snapshot.
|
|
322
|
+
* The original version row is NOT touched — snapshots are immutable.
|
|
323
|
+
*/
|
|
324
|
+
export async function revertToVersion(db, layoutId, versionId, opts = {}) {
|
|
325
|
+
const [v] = await db
|
|
326
|
+
.select()
|
|
327
|
+
.from(layoutVersions)
|
|
328
|
+
.where(and(eq(layoutVersions.layoutId, layoutId), eq(layoutVersions.id, versionId)));
|
|
329
|
+
if (!v)
|
|
330
|
+
throw new Error(`Version not found: layout=${layoutId} version=${versionId}`);
|
|
331
|
+
const snap = v.snapshot;
|
|
332
|
+
// Re-write via saveLayout with the snapshot's zones — preserves IDs so
|
|
333
|
+
// any pinned section ids in URL bookmarks etc still resolve.
|
|
334
|
+
return saveLayout(db, {
|
|
335
|
+
scope: snap.scope,
|
|
336
|
+
name: snap.name,
|
|
337
|
+
pageMeta: snap.pageMeta ?? undefined,
|
|
338
|
+
zones: snap.zones.map((z) => ({
|
|
339
|
+
zone: z.zone,
|
|
340
|
+
rows: z.rows.map((r) => ({
|
|
341
|
+
id: r.id,
|
|
342
|
+
order: r.order,
|
|
343
|
+
config: r.config ?? undefined,
|
|
344
|
+
sections: r.sections.map((s) => ({
|
|
345
|
+
id: s.id,
|
|
346
|
+
order: s.order,
|
|
347
|
+
type: s.type,
|
|
348
|
+
config: s.config,
|
|
349
|
+
colSpan: s.colSpan,
|
|
350
|
+
responsive: s.responsive ?? undefined,
|
|
351
|
+
enabled: s.enabled,
|
|
352
|
+
visibility: s.visibility ?? undefined,
|
|
353
|
+
schemaVersion: s.schemaVersion,
|
|
354
|
+
})),
|
|
355
|
+
})),
|
|
356
|
+
})),
|
|
357
|
+
state: 'draft',
|
|
358
|
+
}, { id: layoutId, userId: opts.userId });
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/layout/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DB } from '../types.js';
|
|
2
|
+
export interface SeedHomepageResult {
|
|
3
|
+
/** True if a new layout was inserted; false if one already existed. */
|
|
4
|
+
created: boolean;
|
|
5
|
+
/** Layout id (the existing one or the newly created one). */
|
|
6
|
+
layoutId: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Idempotent: safe to call repeatedly. Concurrency: the unique
|
|
10
|
+
* `(scope_type, scope_key)` constraint in migration 0005 prevents two
|
|
11
|
+
* simultaneous calls from inserting twice — we catch the race
|
|
12
|
+
* implicitly via the pre-check, but the constraint is the real
|
|
13
|
+
* guarantee.
|
|
14
|
+
*/
|
|
15
|
+
export declare function seedHomepageLayout(db: DB, opts?: {
|
|
16
|
+
adminId?: string;
|
|
17
|
+
}): Promise<SeedHomepageResult>;
|
|
18
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/layout/seed.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CA+E7B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout engine — homepage seed helper.
|
|
3
|
+
*
|
|
4
|
+
* One-shot bootstrap: if the layout for `('route', '/')` doesn't exist
|
|
5
|
+
* yet, create + publish a minimal default using the Phase 1c starter
|
|
6
|
+
* sections (hero + content-feed). Returns `{ created: false }` if a
|
|
7
|
+
* layout already exists at that scope — operator can call this safely
|
|
8
|
+
* before flipping `features.layoutEngine` ON.
|
|
9
|
+
*
|
|
10
|
+
* Why this exists (not a full legacy `homepage.sections` migration):
|
|
11
|
+
* - The legacy renderer dispatches to 9 section types (hero,
|
|
12
|
+
* editorial, content-grid, content-carousel, contests, hubs,
|
|
13
|
+
* learning, stats, custom-html). Phase 1c only ships 5 of those
|
|
14
|
+
* (hero + 4 content/data sections). A real migration must wait
|
|
15
|
+
* until Phase 6b adds the remaining 20 sections.
|
|
16
|
+
* - This seed lets the operator flip `features.layoutEngine` on and
|
|
17
|
+
* immediately see a non-empty homepage (hero + feed), which is
|
|
18
|
+
* enough to validate the LayoutSlot render path end-to-end.
|
|
19
|
+
* - Doc'd in `docs/reference/guides/layout-engine.md` as the
|
|
20
|
+
* "enabling layoutEngine on the homepage" procedure.
|
|
21
|
+
*/
|
|
22
|
+
import { saveLayout, publishLayout, getLayoutByScope } from './layout.js';
|
|
23
|
+
/**
|
|
24
|
+
* Idempotent: safe to call repeatedly. Concurrency: the unique
|
|
25
|
+
* `(scope_type, scope_key)` constraint in migration 0005 prevents two
|
|
26
|
+
* simultaneous calls from inserting twice — we catch the race
|
|
27
|
+
* implicitly via the pre-check, but the constraint is the real
|
|
28
|
+
* guarantee.
|
|
29
|
+
*/
|
|
30
|
+
export async function seedHomepageLayout(db, opts = {}) {
|
|
31
|
+
const existing = await getLayoutByScope(db, { type: 'route', path: '/' });
|
|
32
|
+
if (existing) {
|
|
33
|
+
return { created: false, layoutId: existing.id };
|
|
34
|
+
}
|
|
35
|
+
const input = {
|
|
36
|
+
scope: { type: 'route', path: '/' },
|
|
37
|
+
name: 'Homepage',
|
|
38
|
+
pageMeta: {
|
|
39
|
+
title: 'Homepage',
|
|
40
|
+
access: 'public',
|
|
41
|
+
},
|
|
42
|
+
state: 'draft', // saveLayout creates as draft; publishLayout flips to published below
|
|
43
|
+
zones: [
|
|
44
|
+
{
|
|
45
|
+
zone: 'full-width',
|
|
46
|
+
rows: [
|
|
47
|
+
{
|
|
48
|
+
order: 0,
|
|
49
|
+
config: { gap: 'none' },
|
|
50
|
+
sections: [
|
|
51
|
+
{
|
|
52
|
+
order: 0,
|
|
53
|
+
type: 'hero',
|
|
54
|
+
config: {
|
|
55
|
+
variant: 'default',
|
|
56
|
+
eyebrow: 'Open Source',
|
|
57
|
+
title: 'Build. Document. Share.',
|
|
58
|
+
subtitle: 'CommonPub is an open platform for maker communities. Document your builds with rich editors, join hubs, learn with structured paths, and share with the world.',
|
|
59
|
+
ctas: [
|
|
60
|
+
{ label: 'Start building', href: '/create', variant: 'primary' },
|
|
61
|
+
{ label: 'Explore', href: '/explore', variant: 'secondary' },
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
colSpan: 12,
|
|
65
|
+
enabled: true,
|
|
66
|
+
schemaVersion: 1,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
zone: 'main',
|
|
74
|
+
rows: [
|
|
75
|
+
{
|
|
76
|
+
order: 0,
|
|
77
|
+
sections: [
|
|
78
|
+
{
|
|
79
|
+
order: 0,
|
|
80
|
+
type: 'content-feed',
|
|
81
|
+
config: {
|
|
82
|
+
heading: 'Latest',
|
|
83
|
+
contentType: '',
|
|
84
|
+
sort: 'recent',
|
|
85
|
+
limit: 9,
|
|
86
|
+
columns: 3,
|
|
87
|
+
tag: '',
|
|
88
|
+
featured: false,
|
|
89
|
+
},
|
|
90
|
+
colSpan: 12,
|
|
91
|
+
enabled: true,
|
|
92
|
+
schemaVersion: 1,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
const saved = await saveLayout(db, input, { userId: opts.adminId });
|
|
101
|
+
// Publish immediately so SSR's getLayoutByScope returns it (state filter
|
|
102
|
+
// in the public endpoint surfaces published over draft).
|
|
103
|
+
await publishLayout(db, saved.id, { publishedBy: opts.adminId });
|
|
104
|
+
return { created: true, layoutId: saved.id };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/layout/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAW1E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,OAA6B,EAAE;IAE/B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1E,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAgB;QACzB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;QACnC,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,QAAQ;SACjB;QACD,KAAK,EAAE,OAAO,EAAG,sEAAsE;QACvF,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE;oBACJ;wBACE,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;wBACvB,QAAQ,EAAE;4BACR;gCACE,KAAK,EAAE,CAAC;gCACR,IAAI,EAAE,MAAM;gCACZ,MAAM,EAAE;oCACN,OAAO,EAAE,SAAS;oCAClB,OAAO,EAAE,aAAa;oCACtB,KAAK,EAAE,yBAAyB;oCAChC,QAAQ,EACN,gKAAgK;oCAClK,IAAI,EAAE;wCACJ,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;wCAChE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE;qCAC7D;iCACF;gCACD,OAAO,EAAE,EAAE;gCACX,OAAO,EAAE,IAAI;gCACb,aAAa,EAAE,CAAC;6BACjB;yBACF;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACJ;wBACE,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE;4BACR;gCACE,KAAK,EAAE,CAAC;gCACR,IAAI,EAAE,cAAc;gCACpB,MAAM,EAAE;oCACN,OAAO,EAAE,QAAQ;oCACjB,WAAW,EAAE,EAAE;oCACf,IAAI,EAAE,QAAQ;oCACd,KAAK,EAAE,CAAC;oCACR,OAAO,EAAE,CAAC;oCACV,GAAG,EAAE,EAAE;oCACP,QAAQ,EAAE,KAAK;iCAChB;gCACD,OAAO,EAAE,EAAE;gCACX,OAAO,EAAE,IAAI;gCACb,aAAa,EAAE,CAAC;6BACjB;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,MAAM,KAAK,GAAiB,MAAM,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAEjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;AAC/C,CAAC"}
|
package/dist/theme.d.ts
CHANGED
|
@@ -1,12 +1,50 @@
|
|
|
1
1
|
import type { DB } from './types.js';
|
|
2
|
+
/** Custom-theme ID prefix used in `data-theme` attribute + DB lookup. */
|
|
3
|
+
export declare const CUSTOM_THEME_PREFIX = "cpub-custom-";
|
|
4
|
+
/**
|
|
5
|
+
* A custom theme record persisted in `instance_settings.theme.custom`.
|
|
6
|
+
* Mirrors `customThemeSchema` in @commonpub/schema validators.
|
|
7
|
+
*/
|
|
8
|
+
export interface CustomThemeRecord {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
family: string;
|
|
13
|
+
isDark: boolean;
|
|
14
|
+
pairId?: string;
|
|
15
|
+
parentTheme: string;
|
|
16
|
+
tokens: Record<string, string>;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}
|
|
20
|
+
/** Slug used in `data-theme` for a DB-stored custom theme. */
|
|
21
|
+
export declare function customThemeDataAttr(id: string): string;
|
|
22
|
+
/** Reverse of customThemeDataAttr — returns the raw custom theme ID or null. */
|
|
23
|
+
export declare function parseCustomThemeId(themeId: string): string | null;
|
|
2
24
|
/**
|
|
3
25
|
* Resolve the active theme for a request.
|
|
4
26
|
* Priority: user preference > instance default > 'base' fallback.
|
|
5
27
|
* Framework-agnostic — cookie checking should be done by the caller.
|
|
6
28
|
*/
|
|
7
29
|
export declare function resolveTheme(db: DB, userId?: string): Promise<string>;
|
|
8
|
-
/** Get custom CSS token overrides configured at the instance level
|
|
30
|
+
/** Get custom CSS token overrides configured at the instance level. These
|
|
31
|
+
* apply on top of whatever theme is active (built-in, custom, or code). */
|
|
9
32
|
export declare function getCustomTokenOverrides(db: DB): Promise<Record<string, string>>;
|
|
10
33
|
/** Update a user's theme preference */
|
|
11
34
|
export declare function setUserTheme(db: DB, userId: string, themeId: string): Promise<void>;
|
|
35
|
+
/** List all DB-stored custom themes. Returns an empty array if none exist. */
|
|
36
|
+
export declare function listCustomThemes(db: DB): Promise<CustomThemeRecord[]>;
|
|
37
|
+
/** Fetch a single custom theme by ID. */
|
|
38
|
+
export declare function getCustomTheme(db: DB, id: string): Promise<CustomThemeRecord | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Upsert a custom theme. The whole `theme.custom` array is rewritten on each
|
|
41
|
+
* save — fine because the array is small (admins manage a handful of themes)
|
|
42
|
+
* and gives us atomic consistency without a separate table.
|
|
43
|
+
*/
|
|
44
|
+
export declare function saveCustomTheme(db: DB, theme: Omit<CustomThemeRecord, 'createdAt' | 'updatedAt'> & {
|
|
45
|
+
createdAt?: string;
|
|
46
|
+
updatedAt?: string;
|
|
47
|
+
}, adminId: string): Promise<CustomThemeRecord>;
|
|
48
|
+
/** Delete a custom theme. No-op if not found. */
|
|
49
|
+
export declare function deleteCustomTheme(db: DB, id: string, adminId: string): Promise<void>;
|
|
12
50
|
//# sourceMappingURL=theme.d.ts.map
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAIrC,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAKlD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjE;AA0BD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB3E;AAED;4EAC4E;AAC5E,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgBrF;AAED,uCAAuC;AACvC,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF;AAID,8EAA8E;AAC9E,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsB3E;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAG1F;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAuB5B;AAED,iDAAiD;AACjD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F"}
|
package/dist/theme.js
CHANGED
|
@@ -1,8 +1,44 @@
|
|
|
1
1
|
import { eq } from 'drizzle-orm';
|
|
2
2
|
import { users, instanceSettings } from '@commonpub/schema';
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const BUILT_IN_THEME_IDS = new Set(['base', 'dark', 'generics', 'agora', 'agora-dark']);
|
|
4
|
+
/** Custom-theme ID prefix used in `data-theme` attribute + DB lookup. */
|
|
5
|
+
export const CUSTOM_THEME_PREFIX = 'cpub-custom-';
|
|
6
|
+
/** Storage key in `instance_settings` holding the custom-themes array. */
|
|
7
|
+
const CUSTOM_THEMES_KEY = 'theme.custom';
|
|
8
|
+
/** Slug used in `data-theme` for a DB-stored custom theme. */
|
|
9
|
+
export function customThemeDataAttr(id) {
|
|
10
|
+
return `${CUSTOM_THEME_PREFIX}${id}`;
|
|
11
|
+
}
|
|
12
|
+
/** Reverse of customThemeDataAttr — returns the raw custom theme ID or null. */
|
|
13
|
+
export function parseCustomThemeId(themeId) {
|
|
14
|
+
if (themeId.startsWith(CUSTOM_THEME_PREFIX)) {
|
|
15
|
+
return themeId.slice(CUSTOM_THEME_PREFIX.length);
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function isBuiltInThemeId(id) {
|
|
20
|
+
return BUILT_IN_THEME_IDS.has(id);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether a theme ID is structurally valid (sanity check only — defends
|
|
24
|
+
* against path traversal / injection in the data attribute). Accepts:
|
|
25
|
+
* - built-in IDs
|
|
26
|
+
* - DB custom IDs (`cpub-custom-*`)
|
|
27
|
+
* - any slug-shaped string (covers code-registered themes from the
|
|
28
|
+
* thin layer app's `commonpub.config.ts`)
|
|
29
|
+
*
|
|
30
|
+
* Cross-checking against the actual list of available themes happens at
|
|
31
|
+
* the route-handler layer (`api/admin/themes/*` and the SSR middleware,
|
|
32
|
+
* which both see the runtime config). On read, unknown values fall back
|
|
33
|
+
* to `base` silently rather than throwing — the user shouldn't see a
|
|
34
|
+
* broken theme just because an admin deleted a custom one.
|
|
35
|
+
*/
|
|
36
|
+
function isAcceptableThemeId(id) {
|
|
37
|
+
if (isBuiltInThemeId(id))
|
|
38
|
+
return true;
|
|
39
|
+
if (parseCustomThemeId(id) !== null)
|
|
40
|
+
return true;
|
|
41
|
+
return /^[a-z0-9][a-z0-9_-]{0,63}$/i.test(id);
|
|
6
42
|
}
|
|
7
43
|
/**
|
|
8
44
|
* Resolve the active theme for a request.
|
|
@@ -16,7 +52,7 @@ export async function resolveTheme(db, userId) {
|
|
|
16
52
|
.select({ theme: users.theme })
|
|
17
53
|
.from(users)
|
|
18
54
|
.where(eq(users.id, userId));
|
|
19
|
-
if (user?.theme &&
|
|
55
|
+
if (user?.theme && isAcceptableThemeId(user.theme)) {
|
|
20
56
|
return user.theme;
|
|
21
57
|
}
|
|
22
58
|
}
|
|
@@ -25,26 +61,33 @@ export async function resolveTheme(db, userId) {
|
|
|
25
61
|
.select({ value: instanceSettings.value })
|
|
26
62
|
.from(instanceSettings)
|
|
27
63
|
.where(eq(instanceSettings.key, 'theme.default'));
|
|
28
|
-
if (setting?.value && typeof setting.value === 'string' &&
|
|
64
|
+
if (setting?.value && typeof setting.value === 'string' && isAcceptableThemeId(setting.value)) {
|
|
29
65
|
return setting.value;
|
|
30
66
|
}
|
|
31
67
|
// 3. Fallback
|
|
32
68
|
return 'base';
|
|
33
69
|
}
|
|
34
|
-
/** Get custom CSS token overrides configured at the instance level
|
|
70
|
+
/** Get custom CSS token overrides configured at the instance level. These
|
|
71
|
+
* apply on top of whatever theme is active (built-in, custom, or code). */
|
|
35
72
|
export async function getCustomTokenOverrides(db) {
|
|
36
73
|
const [setting] = await db
|
|
37
74
|
.select({ value: instanceSettings.value })
|
|
38
75
|
.from(instanceSettings)
|
|
39
76
|
.where(eq(instanceSettings.key, 'theme.token_overrides'));
|
|
40
|
-
if (setting?.value && typeof setting.value === 'object' && setting.value !== null) {
|
|
41
|
-
|
|
77
|
+
if (setting?.value && typeof setting.value === 'object' && setting.value !== null && !Array.isArray(setting.value)) {
|
|
78
|
+
// Filter only string values so malformed rows can't break SSR
|
|
79
|
+
const out = {};
|
|
80
|
+
for (const [k, v] of Object.entries(setting.value)) {
|
|
81
|
+
if (typeof v === 'string')
|
|
82
|
+
out[k] = v;
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
42
85
|
}
|
|
43
86
|
return {};
|
|
44
87
|
}
|
|
45
88
|
/** Update a user's theme preference */
|
|
46
89
|
export async function setUserTheme(db, userId, themeId) {
|
|
47
|
-
if (!
|
|
90
|
+
if (!isAcceptableThemeId(themeId)) {
|
|
48
91
|
throw new Error(`Invalid theme ID: ${themeId}`);
|
|
49
92
|
}
|
|
50
93
|
await db
|
|
@@ -52,4 +95,87 @@ export async function setUserTheme(db, userId, themeId) {
|
|
|
52
95
|
.set({ theme: themeId, updatedAt: new Date() })
|
|
53
96
|
.where(eq(users.id, userId));
|
|
54
97
|
}
|
|
98
|
+
// --- Custom (DB-stored) themes -------------------------------------------
|
|
99
|
+
/** List all DB-stored custom themes. Returns an empty array if none exist. */
|
|
100
|
+
export async function listCustomThemes(db) {
|
|
101
|
+
const [setting] = await db
|
|
102
|
+
.select({ value: instanceSettings.value })
|
|
103
|
+
.from(instanceSettings)
|
|
104
|
+
.where(eq(instanceSettings.key, CUSTOM_THEMES_KEY));
|
|
105
|
+
if (!setting?.value || !Array.isArray(setting.value))
|
|
106
|
+
return [];
|
|
107
|
+
// Defensive: filter to records that have the required shape so a partial
|
|
108
|
+
// write (or future schema change) can't crash SSR.
|
|
109
|
+
return setting.value.filter((row) => {
|
|
110
|
+
if (!row || typeof row !== 'object')
|
|
111
|
+
return false;
|
|
112
|
+
const r = row;
|
|
113
|
+
return (typeof r.id === 'string' &&
|
|
114
|
+
typeof r.name === 'string' &&
|
|
115
|
+
typeof r.family === 'string' &&
|
|
116
|
+
typeof r.isDark === 'boolean' &&
|
|
117
|
+
typeof r.tokens === 'object' &&
|
|
118
|
+
r.tokens !== null);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** Fetch a single custom theme by ID. */
|
|
122
|
+
export async function getCustomTheme(db, id) {
|
|
123
|
+
const all = await listCustomThemes(db);
|
|
124
|
+
return all.find((t) => t.id === id) ?? null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Upsert a custom theme. The whole `theme.custom` array is rewritten on each
|
|
128
|
+
* save — fine because the array is small (admins manage a handful of themes)
|
|
129
|
+
* and gives us atomic consistency without a separate table.
|
|
130
|
+
*/
|
|
131
|
+
export async function saveCustomTheme(db, theme, adminId) {
|
|
132
|
+
const all = await listCustomThemes(db);
|
|
133
|
+
const now = new Date().toISOString();
|
|
134
|
+
const existing = all.find((t) => t.id === theme.id);
|
|
135
|
+
const next = {
|
|
136
|
+
id: theme.id,
|
|
137
|
+
name: theme.name,
|
|
138
|
+
description: theme.description ?? '',
|
|
139
|
+
family: theme.family,
|
|
140
|
+
isDark: theme.isDark,
|
|
141
|
+
pairId: theme.pairId,
|
|
142
|
+
parentTheme: theme.parentTheme,
|
|
143
|
+
tokens: theme.tokens,
|
|
144
|
+
createdAt: existing?.createdAt ?? theme.createdAt ?? now,
|
|
145
|
+
updatedAt: now,
|
|
146
|
+
};
|
|
147
|
+
const newList = existing
|
|
148
|
+
? all.map((t) => (t.id === theme.id ? next : t))
|
|
149
|
+
: [...all, next];
|
|
150
|
+
await writeCustomThemes(db, newList, adminId);
|
|
151
|
+
return next;
|
|
152
|
+
}
|
|
153
|
+
/** Delete a custom theme. No-op if not found. */
|
|
154
|
+
export async function deleteCustomTheme(db, id, adminId) {
|
|
155
|
+
const all = await listCustomThemes(db);
|
|
156
|
+
if (!all.some((t) => t.id === id))
|
|
157
|
+
return;
|
|
158
|
+
const next = all.filter((t) => t.id !== id);
|
|
159
|
+
await writeCustomThemes(db, next, adminId);
|
|
160
|
+
}
|
|
161
|
+
async function writeCustomThemes(db, next, adminId) {
|
|
162
|
+
const existing = await db
|
|
163
|
+
.select({ id: instanceSettings.id })
|
|
164
|
+
.from(instanceSettings)
|
|
165
|
+
.where(eq(instanceSettings.key, CUSTOM_THEMES_KEY));
|
|
166
|
+
if (existing.length > 0) {
|
|
167
|
+
await db
|
|
168
|
+
.update(instanceSettings)
|
|
169
|
+
.set({ value: next, updatedBy: adminId, updatedAt: new Date() })
|
|
170
|
+
.where(eq(instanceSettings.key, CUSTOM_THEMES_KEY));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
await db.insert(instanceSettings).values({
|
|
174
|
+
key: CUSTOM_THEMES_KEY,
|
|
175
|
+
value: next,
|
|
176
|
+
updatedBy: adminId,
|
|
177
|
+
updatedAt: new Date(),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
55
181
|
//# sourceMappingURL=theme.js.map
|
package/dist/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAExF,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAmBzC,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,GAAG,mBAAmB,GAAG,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAU;IAClC,OAAO,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,mBAAmB,CAAC,EAAU;IACrC,IAAI,gBAAgB,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,kBAAkB,CAAC,EAAE,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,MAAe;IACxD,qBAAqB;IACrB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;aACpB,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;aAC9B,IAAI,CAAC,KAAK,CAAC;aACX,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,EAAE,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;SACvB,MAAM,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,gBAAgB,CAAC;SACtB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IACpD,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,cAAc;IACd,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAM;IAClD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;SACvB,MAAM,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,gBAAgB,CAAC;SACtB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAE5D,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnH,8DAA8D;QAC9D,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,MAAc,EAAE,OAAe;IACxE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,EAAE;SACL,MAAM,CAAC,KAAK,CAAC;SACb,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;SAC9C,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,4EAA4E;AAE5E,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAM;IAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;SACvB,MAAM,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,gBAAgB,CAAC;SACtB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhE,yEAAyE;IACzE,mDAAmD;IACnD,OAAQ,OAAO,CAAC,KAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAA4B,EAAE;QAC3E,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,CAAC,GAAG,GAA8B,CAAC;QACzC,OAAO,CACL,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;YACxB,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAC1B,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAC5B,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;YAC7B,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAC5B,CAAC,CAAC,MAAM,KAAK,IAAI,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAM,EAAE,EAAU;IACrD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,KAGC,EACD,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAsB;QAC9B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG;QACxD,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;IAEnB,MAAM,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,EAAU,EAAE,OAAe;IACzE,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAAE,OAAO;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,MAAM,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAM,EACN,IAAyB,EACzB,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,EAAE;SACtB,MAAM,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC;SACnC,IAAI,CAAC,gBAAgB,CAAC;SACtB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE;aACL,MAAM,CAAC,gBAAgB,CAAC;aACxB,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aAC/D,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;YACvC,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commonpub/server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.57.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Framework-agnostic business logic for CommonPub instances",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|
|
@@ -110,13 +110,13 @@
|
|
|
110
110
|
"linkedom": "^0.18.12",
|
|
111
111
|
"megalodon": "^10.3.0",
|
|
112
112
|
"turndown": "^7.2.4",
|
|
113
|
+
"@commonpub/auth": "0.6.0",
|
|
113
114
|
"@commonpub/docs": "0.6.3",
|
|
115
|
+
"@commonpub/config": "0.15.0",
|
|
114
116
|
"@commonpub/learning": "0.5.2",
|
|
117
|
+
"@commonpub/editor": "0.7.11",
|
|
115
118
|
"@commonpub/protocol": "0.12.0",
|
|
116
|
-
"@commonpub/
|
|
117
|
-
"@commonpub/config": "0.13.0",
|
|
118
|
-
"@commonpub/schema": "0.16.0",
|
|
119
|
-
"@commonpub/editor": "0.7.10",
|
|
119
|
+
"@commonpub/schema": "0.17.0",
|
|
120
120
|
"@commonpub/infra": "0.8.0"
|
|
121
121
|
},
|
|
122
122
|
"peerDependencies": {
|