create-cogenta 0.5.2 → 0.6.7
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/blueprint-defaults.js +1 -1
- package/dist/blueprint-defaults.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/playground-reset.js +1 -1
- package/dist/playground-reset.js.map +1 -1
- package/dist/recap.js +1 -1
- package/dist/recap.js.map +1 -1
- package/dist/scaffold.d.ts +4 -2
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +10 -6
- package/dist/scaffold.js.map +1 -1
- package/dist/wizard.js +1 -1
- package/dist/wizard.js.map +1 -1
- package/package.json +14 -13
- package/dist/blueprints/assets/photos/association/community-cleanup.jpg +0 -0
- package/dist/blueprints/assets/photos/association/fundraising-dinner.jpg +0 -0
- package/dist/blueprints/assets/photos/association/garden-planting.jpg +0 -0
- package/dist/blueprints/assets/photos/association/harvest-food-drive.jpg +0 -0
- package/dist/blueprints/assets/photos/association/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/association/volunteer-orientation.jpg +0 -0
- package/dist/blueprints/assets/photos/association/winter-coat-collection.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/blog-runs-itself.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/desk-setup.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/editing.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/notebooks.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/plain-text-editor.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/reading-nonfiction.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/small-tool.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/writing-schedule.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/business-2.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/business-3.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/business.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/culture-2.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/culture-3.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/culture.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/news-2.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/news-3.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/news.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/opinion-2.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/opinion-3.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/opinion.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/adatum-publishing.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/contoso-mobile-app.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/fabrikam-annual-report.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/litware-signage.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/northwind-rebrand.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/proseware-launch.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/tailspin-streaming.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/wingtip-wayfinding.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/charred-octopus.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/chocolate-tart.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/creme-brulee.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/house-red.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/house-white.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/pan-seared-trout.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/poached-pear.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/roasted-beet-salad.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/slow-roast-duck-leg.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/soup-of-the-day.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/sparkling-water.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/wild-mushroom-risotto.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/avatar-1.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/store/camp-blanket.jpg +0 -0
- package/dist/blueprints/assets/photos/store/canvas-tote.jpg +0 -0
- package/dist/blueprints/assets/photos/store/cast-iron-skillet.jpg +0 -0
- package/dist/blueprints/assets/photos/store/ceramic-pour-over-set.jpg +0 -0
- package/dist/blueprints/assets/photos/store/enamel-mug.jpg +0 -0
- package/dist/blueprints/assets/photos/store/everyday-tee.jpg +0 -0
- package/dist/blueprints/assets/photos/store/field-jacket.jpg +0 -0
- package/dist/blueprints/assets/photos/store/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/store/leather-card-holder.jpg +0 -0
- package/dist/blueprints/assets/photos/store/linen-table-runner.jpg +0 -0
- package/dist/blueprints/assets/photos/store/trail-tote.jpg +0 -0
- package/dist/blueprints/assets/photos/store/wool-beanie.jpg +0 -0
- package/dist/blueprints/assets/photos/store/wool-overshirt.jpg +0 -0
- package/dist/blueprints/assets/photos/vitrine/avatar-1.jpg +0 -0
- package/dist/blueprints/assets/photos/vitrine/avatar-2.jpg +0 -0
- package/dist/blueprints/assets/photos/vitrine/avatar-3.jpg +0 -0
- package/dist/blueprints/assets/photos/vitrine/dashboard.jpg +0 -0
- package/dist/blueprints/assets/photos/vitrine/hero.jpg +0 -0
- package/dist/blueprints/association.d.ts +0 -151
- package/dist/blueprints/association.d.ts.map +0 -1
- package/dist/blueprints/association.js +0 -732
- package/dist/blueprints/association.js.map +0 -1
- package/dist/blueprints/blog.d.ts +0 -198
- package/dist/blueprints/blog.d.ts.map +0 -1
- package/dist/blueprints/blog.js +0 -665
- package/dist/blueprints/blog.js.map +0 -1
- package/dist/blueprints/content-pack.d.ts +0 -143
- package/dist/blueprints/content-pack.d.ts.map +0 -1
- package/dist/blueprints/content-pack.js +0 -111
- package/dist/blueprints/content-pack.js.map +0 -1
- package/dist/blueprints/content-packs.d.ts +0 -11
- package/dist/blueprints/content-packs.d.ts.map +0 -1
- package/dist/blueprints/content-packs.js +0 -29
- package/dist/blueprints/content-packs.js.map +0 -1
- package/dist/blueprints/demo-media.d.ts +0 -39
- package/dist/blueprints/demo-media.d.ts.map +0 -1
- package/dist/blueprints/demo-media.js +0 -30
- package/dist/blueprints/demo-media.js.map +0 -1
- package/dist/blueprints/documentation.d.ts +0 -134
- package/dist/blueprints/documentation.d.ts.map +0 -1
- package/dist/blueprints/documentation.js +0 -678
- package/dist/blueprints/documentation.js.map +0 -1
- package/dist/blueprints/magazine.d.ts +0 -145
- package/dist/blueprints/magazine.d.ts.map +0 -1
- package/dist/blueprints/magazine.js +0 -543
- package/dist/blueprints/magazine.js.map +0 -1
- package/dist/blueprints/menus.d.ts +0 -25
- package/dist/blueprints/menus.d.ts.map +0 -1
- package/dist/blueprints/menus.js +0 -33
- package/dist/blueprints/menus.js.map +0 -1
- package/dist/blueprints/photo-assets.d.ts +0 -3
- package/dist/blueprints/photo-assets.d.ts.map +0 -1
- package/dist/blueprints/photo-assets.js +0 -33
- package/dist/blueprints/photo-assets.js.map +0 -1
- package/dist/blueprints/portfolio.d.ts +0 -141
- package/dist/blueprints/portfolio.d.ts.map +0 -1
- package/dist/blueprints/portfolio.js +0 -700
- package/dist/blueprints/portfolio.js.map +0 -1
- package/dist/blueprints/restaurant.d.ts +0 -124
- package/dist/blueprints/restaurant.d.ts.map +0 -1
- package/dist/blueprints/restaurant.js +0 -457
- package/dist/blueprints/restaurant.js.map +0 -1
- package/dist/blueprints/saas.d.ts +0 -133
- package/dist/blueprints/saas.d.ts.map +0 -1
- package/dist/blueprints/saas.js +0 -551
- package/dist/blueprints/saas.js.map +0 -1
- package/dist/blueprints/site-settings-seed.d.ts +0 -17
- package/dist/blueprints/site-settings-seed.d.ts.map +0 -1
- package/dist/blueprints/site-settings-seed.js +0 -45
- package/dist/blueprints/site-settings-seed.js.map +0 -1
- package/dist/blueprints/starting-skins.d.ts +0 -19
- package/dist/blueprints/starting-skins.d.ts.map +0 -1
- package/dist/blueprints/starting-skins.js +0 -301
- package/dist/blueprints/starting-skins.js.map +0 -1
- package/dist/blueprints/store.d.ts +0 -173
- package/dist/blueprints/store.d.ts.map +0 -1
- package/dist/blueprints/store.js +0 -643
- package/dist/blueprints/store.js.map +0 -1
- package/dist/blueprints/vitrine.d.ts +0 -178
- package/dist/blueprints/vitrine.d.ts.map +0 -1
- package/dist/blueprints/vitrine.js +0 -529
- package/dist/blueprints/vitrine.js.map +0 -1
- package/dist/demo-art/compositions.d.ts +0 -48
- package/dist/demo-art/compositions.d.ts.map +0 -1
- package/dist/demo-art/compositions.js +0 -690
- package/dist/demo-art/compositions.js.map +0 -1
- package/dist/demo-art/index.d.ts +0 -8
- package/dist/demo-art/index.d.ts.map +0 -1
- package/dist/demo-art/index.js +0 -5
- package/dist/demo-art/index.js.map +0 -1
- package/dist/demo-art/oklch.d.ts +0 -39
- package/dist/demo-art/oklch.d.ts.map +0 -1
- package/dist/demo-art/oklch.js +0 -79
- package/dist/demo-art/oklch.js.map +0 -1
- package/dist/demo-art/png.d.ts +0 -24
- package/dist/demo-art/png.d.ts.map +0 -1
- package/dist/demo-art/png.js +0 -110
- package/dist/demo-art/png.js.map +0 -1
- package/dist/demo-art/render.d.ts +0 -228
- package/dist/demo-art/render.d.ts.map +0 -1
- package/dist/demo-art/render.js +0 -478
- package/dist/demo-art/render.js.map +0 -1
package/dist/blueprints/saas.js
DELETED
|
@@ -1,551 +0,0 @@
|
|
|
1
|
-
import { CogentaError } from '@cogenta/core';
|
|
2
|
-
import { createContentStore, defineCollection, f, validateCollectionSet, } from '@cogenta/schema';
|
|
3
|
-
import { avatarArt, coverArt, heroArt, logoArt } from '../demo-art/compositions.js';
|
|
4
|
-
import { definePageCollection, richTextParagraph, SEO_FIELDS, toBlockZoneEntry, } from './content-pack.js';
|
|
5
|
-
import { STARTING_SKINS } from './starting-skins.js';
|
|
6
|
-
/**
|
|
7
|
-
* The `saas` blueprint's content model (L25, "templates pro"): a marketing
|
|
8
|
-
* site for a software product — a `feature` collection routed so it can be
|
|
9
|
-
* listed live and linked to from the home page, exactly like `vitrine`'s
|
|
10
|
-
* `service`. Deliberately no `pricingPlan` collection or billing model:
|
|
11
|
-
* pricing tiers on a real SaaS site are usually a handful of numbers with no
|
|
12
|
-
* independent lifecycle (no author, no publish date, no individual page), so
|
|
13
|
-
* they are page-authored content on the `pricing` page below rather than a
|
|
14
|
-
* second collection invented to hold three rows.
|
|
15
|
-
*
|
|
16
|
-
* `icon` (a symbol name `@cogenta/theme-kit`'s `renderIcon` recognises) and
|
|
17
|
-
* `coverImage` (contract D `theme@1.4`'s `entryImage`) are what let
|
|
18
|
-
* `theme-saas`'s `collectionList` show a feature the same way its
|
|
19
|
-
* `featureGrid` does — an icon chip first, a photo only as the fallback.
|
|
20
|
-
*/
|
|
21
|
-
export const feature = defineCollection({
|
|
22
|
-
name: 'feature',
|
|
23
|
-
labels: { singular: 'Feature', plural: 'Features' },
|
|
24
|
-
routing: { pattern: '/features/:slug' },
|
|
25
|
-
fields: {
|
|
26
|
-
name: f.text({ required: true, max: 120 }),
|
|
27
|
-
slug: f.slug({ from: 'name', unique: true }),
|
|
28
|
-
description: f.text({ max: 300, multiline: true }),
|
|
29
|
-
icon: f.text({
|
|
30
|
-
max: 64,
|
|
31
|
-
admin: {
|
|
32
|
-
label: 'Icon',
|
|
33
|
-
help: 'One of the symbol names @cogenta/theme-kit recognises (e.g. "bolt", "shield", "chart", "users", "globe", "sparkles"). Left blank, the feature falls back to its cover image.',
|
|
34
|
-
},
|
|
35
|
-
}),
|
|
36
|
-
coverImage: f.media({ accept: ['image'] }),
|
|
37
|
-
...SEO_FIELDS,
|
|
38
|
-
},
|
|
39
|
-
indexes: [['slug']],
|
|
40
|
-
permissions: {
|
|
41
|
-
read: ['public'],
|
|
42
|
-
create: ['editor', 'admin'],
|
|
43
|
-
update: ['editor', 'admin'],
|
|
44
|
-
delete: ['admin'],
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
export const page = definePageCollection('/:slug');
|
|
48
|
-
export const SAAS_COLLECTIONS = [feature, page];
|
|
49
|
-
validateCollectionSet(SAAS_COLLECTIONS);
|
|
50
|
-
/**
|
|
51
|
-
* Six real product capabilities, each with the icon `featureGrid` (home
|
|
52
|
-
* page) and this same entry's own `icon` field both point at — a
|
|
53
|
-
* `collectionList` of `feature` and the home page's `featureGrid` read as
|
|
54
|
-
* one system rather than two unrelated sections.
|
|
55
|
-
*/
|
|
56
|
-
export const SAAS_DEMO_FEATURES = [
|
|
57
|
-
{
|
|
58
|
-
name: 'Workflow automation',
|
|
59
|
-
slug: 'workflow-automation',
|
|
60
|
-
description: 'Trigger multi-step approvals, notifications and handoffs the moment a status changes — no script to maintain, no cron job to babysit. Build the flow once in a visual editor, watch every run in real time, and route exceptions to a human without losing your place in the queue.',
|
|
61
|
-
icon: 'bolt',
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
name: 'Audit log',
|
|
65
|
-
slug: 'audit-log',
|
|
66
|
-
description: 'Every change is written once, in order, and never edited after the fact — the same ledger your own compliance review reads from. Filter by actor, resource or time window, and export the result as a signed record that satisfies an external auditor without a follow-up email.',
|
|
67
|
-
icon: 'shield',
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
name: 'Single sign-on',
|
|
71
|
-
slug: 'single-sign-on',
|
|
72
|
-
description: 'SAML and OIDC out of the box, provisioned through your identity provider in minutes, not a support ticket. An offboarded employee loses access everywhere in one step, not six, and group membership synced from your directory keeps roles correct without anyone updating them by hand.',
|
|
73
|
-
icon: 'users',
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: 'Integrations',
|
|
77
|
-
slug: 'integrations',
|
|
78
|
-
description: 'Two-way sync with the tools already in the stack — calendar, chat, storage and the usual project trackers — plus outbound webhooks and a documented API for anything bespoke. Nothing here is a walled garden: what comes in stays in sync, and what goes out is never trapped behind a paywall tier.',
|
|
79
|
-
icon: 'globe',
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
name: 'Analytics',
|
|
83
|
-
slug: 'analytics',
|
|
84
|
-
description: 'Real usage numbers, not vanity counters: active seats this week, the features nobody opens, and the reports someone actually downloads. Every chart is a saved, shareable view, so the number quoted in a leadership meeting is the same one the team is already looking at.',
|
|
85
|
-
icon: 'chart',
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
name: 'API',
|
|
89
|
-
slug: 'api',
|
|
90
|
-
description: 'A typed, versioned REST API with a sandbox key on day one and rate limits generous enough for a real integration, not just a demo. Everything the product does in the browser, a script can do too — through the same permission model and the same audit trail behind it.',
|
|
91
|
-
icon: 'sparkles',
|
|
92
|
-
},
|
|
93
|
-
];
|
|
94
|
-
const BLOCK_VERSION = '1.0.0';
|
|
95
|
-
/**
|
|
96
|
-
* One `prose` block, whose `body` (contract B rich text) can hold more than
|
|
97
|
-
* one paragraph — `text` may be a single string (one paragraph, the
|
|
98
|
-
* original shape every call site but `about` still uses) or an array of
|
|
99
|
-
* strings (one `richTextParagraph` block per entry, concatenated). Real
|
|
100
|
-
* "about" copy reads as more than one paragraph; forcing it into one would
|
|
101
|
-
* have meant either a wall of run-on sentences or losing the paragraph
|
|
102
|
-
* break entirely.
|
|
103
|
-
*/
|
|
104
|
-
function proseParagraph(key, text) {
|
|
105
|
-
const paragraphs = typeof text === 'string' ? [text] : text;
|
|
106
|
-
return {
|
|
107
|
-
_key: key,
|
|
108
|
-
_type: 'prose',
|
|
109
|
-
_version: BLOCK_VERSION,
|
|
110
|
-
body: paragraphs.flatMap((paragraph, index) => richTextParagraph(`${key}-body-${index}`, paragraph)),
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* `home` (ten blocks, the Linear/Stripe/Vercel composition the L25 brief
|
|
115
|
-
* asks for: hero → trust strip → features → product shot → numbers →
|
|
116
|
-
* social proof → pricing → questions → final call to action), `pricing`
|
|
117
|
-
* (its own hero, the same pricing table, and a billing-specific FAQ), and
|
|
118
|
-
* `about` (a short mission statement plus a second, distinct voice of
|
|
119
|
-
* social proof).
|
|
120
|
-
*
|
|
121
|
-
* A function of `media`/`featureIds` (`SeedContext.media`, and the ids
|
|
122
|
-
* `seedSaasDemoContent` assigns its own features before this runs), not a
|
|
123
|
-
* static const: the hero's `media`, the product shot, the trust strip's
|
|
124
|
-
* logos and both testimonials' avatars all need ids only the scaffold
|
|
125
|
-
* knows at seed time, and the feature grid links to each feature's own
|
|
126
|
-
* real page.
|
|
127
|
-
*/
|
|
128
|
-
export function buildSaasDemoPages(media, featureIdBySlug) {
|
|
129
|
-
const featureLink = (slug) => {
|
|
130
|
-
const id = featureIdBySlug.get(slug);
|
|
131
|
-
return id === undefined ? undefined : { collection: 'feature', id };
|
|
132
|
-
};
|
|
133
|
-
// `logoStrip` (blocks@2.0) requires at least one logo — a media map with
|
|
134
|
-
// no `logo-*` entries (a scaffold with no demo-art seeded, or this
|
|
135
|
-
// function called directly, as the blueprint test does) must therefore
|
|
136
|
-
// omit the whole block rather than emit an empty, contract-invalid one.
|
|
137
|
-
const logoItems = [0, 1, 2, 3, 4, 5]
|
|
138
|
-
.map((index) => media[`logo-${index}`])
|
|
139
|
-
.filter((id) => id !== undefined)
|
|
140
|
-
.map((id, index) => ({ _key: `demo-logo-${index}`, media: id }));
|
|
141
|
-
return [
|
|
142
|
-
{
|
|
143
|
-
title: 'Home',
|
|
144
|
-
slug: 'home',
|
|
145
|
-
blocks: [
|
|
146
|
-
{
|
|
147
|
-
_key: 'demo-home-hero',
|
|
148
|
-
_type: 'hero',
|
|
149
|
-
_version: BLOCK_VERSION,
|
|
150
|
-
eyebrow: 'Now in public beta',
|
|
151
|
-
title: 'Ship faster, with less friction',
|
|
152
|
-
subtitle: 'One workspace for the whole team to plan, automate and ship, without the pile of spreadsheets and shared inboxes it usually takes to get there. This page and the six features below it were scaffolded by create-cogenta from the "saas" blueprint — real demo content, ready to edit from the first run.',
|
|
153
|
-
...(media.hero === undefined ? {} : { media: media.hero }),
|
|
154
|
-
actions: [
|
|
155
|
-
{ label: 'Start free', target: { href: '/pricing' }, emphasis: 'primary' },
|
|
156
|
-
{ label: 'Book a demo', target: { href: '/about' } },
|
|
157
|
-
],
|
|
158
|
-
},
|
|
159
|
-
...(logoItems.length === 0
|
|
160
|
-
? []
|
|
161
|
-
: [
|
|
162
|
-
{
|
|
163
|
-
_key: 'demo-home-logos',
|
|
164
|
-
_type: 'logoStrip',
|
|
165
|
-
_version: BLOCK_VERSION,
|
|
166
|
-
logos: logoItems,
|
|
167
|
-
caption: 'Trusted by teams at',
|
|
168
|
-
},
|
|
169
|
-
]),
|
|
170
|
-
{
|
|
171
|
-
_key: 'demo-home-features',
|
|
172
|
-
_type: 'featureGrid',
|
|
173
|
-
_version: BLOCK_VERSION,
|
|
174
|
-
title: 'Everything the team needs to ship',
|
|
175
|
-
items: SAAS_DEMO_FEATURES.map((demo, index) => {
|
|
176
|
-
const link = featureLink(demo.slug);
|
|
177
|
-
return {
|
|
178
|
-
_key: `demo-feature-${index}`,
|
|
179
|
-
icon: demo.icon,
|
|
180
|
-
title: demo.name,
|
|
181
|
-
text: demo.description,
|
|
182
|
-
...(link === undefined ? {} : { link }),
|
|
183
|
-
};
|
|
184
|
-
}),
|
|
185
|
-
},
|
|
186
|
-
// `mediaFigure.media` (blocks@2.0) is required — with no `product`
|
|
187
|
-
// media seeded, the block is omitted rather than emitted invalid
|
|
188
|
-
// (same reasoning as `logoStrip` above).
|
|
189
|
-
...(media.product === undefined
|
|
190
|
-
? []
|
|
191
|
-
: [
|
|
192
|
-
{
|
|
193
|
-
_key: 'demo-home-shot',
|
|
194
|
-
_type: 'mediaFigure',
|
|
195
|
-
_version: BLOCK_VERSION,
|
|
196
|
-
media: media.product,
|
|
197
|
-
caption: 'The board view, live for the whole team.',
|
|
198
|
-
ratio: '16:9',
|
|
199
|
-
align: 'wide',
|
|
200
|
-
},
|
|
201
|
-
]),
|
|
202
|
-
{
|
|
203
|
-
_key: 'demo-home-stats',
|
|
204
|
-
_type: 'statCounter',
|
|
205
|
-
_version: BLOCK_VERSION,
|
|
206
|
-
title: 'Trusted at scale',
|
|
207
|
-
stats: [
|
|
208
|
-
{ _key: 'demo-stat-1', value: '99.98', label: 'Uptime, trailing 12 months' },
|
|
209
|
-
{ _key: 'demo-stat-2', value: '4.8', label: 'Average review score' },
|
|
210
|
-
{ _key: 'demo-stat-3', value: '2,400+', label: 'Teams onboarded' },
|
|
211
|
-
{ _key: 'demo-stat-4', value: '<200ms', label: 'Median API response' },
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
_key: 'demo-home-testimonial',
|
|
216
|
-
_type: 'testimonial',
|
|
217
|
-
_version: BLOCK_VERSION,
|
|
218
|
-
quote: richTextParagraph('demo-testimonial-quote', 'We replaced four spreadsheets and a shared inbox with one workspace. Approvals that used to take a week now close the same afternoon, and for the first time our finance team can see exactly where a request is stuck without pinging three people to ask.'),
|
|
219
|
-
attribution: {
|
|
220
|
-
name: 'Priya Nandakumar',
|
|
221
|
-
role: 'Head of Operations, Kelso Freight',
|
|
222
|
-
...(media.avatar === undefined ? {} : { avatar: media.avatar }),
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
_key: 'demo-home-quote',
|
|
227
|
-
_type: 'quote',
|
|
228
|
-
_version: BLOCK_VERSION,
|
|
229
|
-
text: 'The audit log alone is why our compliance review took an afternoon instead of a month. Every question the auditor asked, we answered by filtering one screen instead of hunting through six systems for a paper trail that may or may not have existed.',
|
|
230
|
-
author: 'Marcus Webb',
|
|
231
|
-
role: 'IT Director, Fenwick & Rowe',
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
_key: 'demo-home-pricing',
|
|
235
|
-
_type: 'pricingTable',
|
|
236
|
-
_version: BLOCK_VERSION,
|
|
237
|
-
title: 'Simple, seat-based pricing',
|
|
238
|
-
tiers: pricingTiers(),
|
|
239
|
-
},
|
|
240
|
-
homeFaq(),
|
|
241
|
-
{
|
|
242
|
-
_key: 'demo-home-cta',
|
|
243
|
-
_type: 'cta',
|
|
244
|
-
_version: BLOCK_VERSION,
|
|
245
|
-
title: 'Start building today',
|
|
246
|
-
text: 'No credit card required for the trial. Every section above is normal editable content.',
|
|
247
|
-
actions: [
|
|
248
|
-
{ label: 'Start free', target: { href: '/pricing' }, emphasis: 'primary' },
|
|
249
|
-
{ label: 'Book a demo', target: { href: '/about' } },
|
|
250
|
-
],
|
|
251
|
-
},
|
|
252
|
-
],
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
title: 'Pricing',
|
|
256
|
-
slug: 'pricing',
|
|
257
|
-
blocks: [
|
|
258
|
-
{
|
|
259
|
-
_key: 'demo-pricing-hero',
|
|
260
|
-
_type: 'hero',
|
|
261
|
-
_version: BLOCK_VERSION,
|
|
262
|
-
eyebrow: 'Pricing',
|
|
263
|
-
title: 'One plan for every team, billed on active seats',
|
|
264
|
-
subtitle: 'No setup fee, no annual lock-in required, and a real person to talk to before you commit to Enterprise. Every plan includes the full feature set below — Pro adds SSO and priority support, and moving between tiers takes effect immediately, prorated to the day.',
|
|
265
|
-
actions: [{ label: 'Start free', target: { href: '#' }, emphasis: 'primary' }],
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
_key: 'demo-pricing-table',
|
|
269
|
-
_type: 'pricingTable',
|
|
270
|
-
_version: BLOCK_VERSION,
|
|
271
|
-
tiers: pricingTiers(),
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
_key: 'demo-pricing-faq',
|
|
275
|
-
_type: 'faq',
|
|
276
|
-
_version: BLOCK_VERSION,
|
|
277
|
-
title: 'Questions about billing',
|
|
278
|
-
items: [
|
|
279
|
-
{
|
|
280
|
-
_key: 'demo-pricing-faq-1',
|
|
281
|
-
question: 'What happens when the trial ends?',
|
|
282
|
-
answer: richTextParagraph('demo-pricing-faq-1-a', 'The workspace goes read-only rather than being deleted. Everything is still there, and still exportable, whether you subscribe that week or six months later — nothing is purged on a timer.'),
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
_key: 'demo-pricing-faq-2',
|
|
286
|
-
question: 'Do you charge for people who barely log in?',
|
|
287
|
-
answer: richTextParagraph('demo-pricing-faq-2-a', 'No. A seat counts in a month only if it was actually used that month, and the invoice itemises exactly which ones did, so finance never has to take our word for it.'),
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
_key: 'demo-pricing-faq-3',
|
|
291
|
-
question: 'Can we pay by invoice instead of card?',
|
|
292
|
-
answer: richTextParagraph('demo-pricing-faq-3-a', 'From five seats up, billed yearly, on thirty-day terms with a PO number on the invoice if you need one. Below that the card flow costs everyone less than the paperwork would.'),
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
_key: 'demo-pricing-faq-4',
|
|
296
|
-
question: 'Can we change plans mid-cycle?',
|
|
297
|
-
answer: richTextParagraph('demo-pricing-faq-4-a', 'Yes, immediately, with a prorated charge or credit for the days remaining, shown on the invoice before it is charged — never a silent rollover to next month.'),
|
|
298
|
-
},
|
|
299
|
-
],
|
|
300
|
-
},
|
|
301
|
-
],
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
title: 'About',
|
|
305
|
-
slug: 'about',
|
|
306
|
-
blocks: [
|
|
307
|
-
proseParagraph('demo-about-prose', [
|
|
308
|
-
'We started building this after watching a team lose a week to an approval that should have taken an hour — not because anyone was slow, but because the request lived in an inbox, the sign-off lived in a spreadsheet, and nobody could see both at once. So we built one workspace where the request, the approval and the record of what happened are the same object, not three.',
|
|
309
|
-
'This is a demo SaaS site, scaffolded by create-cogenta from the "saas" blueprint. Its features and this page were seeded by the installer so there is real content to look at from the first run — every word of it is normal, editable content, not placeholder copy waiting to be swapped out.',
|
|
310
|
-
]),
|
|
311
|
-
{
|
|
312
|
-
_key: 'demo-about-testimonial',
|
|
313
|
-
_type: 'testimonial',
|
|
314
|
-
_version: BLOCK_VERSION,
|
|
315
|
-
quote: richTextParagraph('demo-about-testimonial-quote', 'Support answered inside the hour, on a Sunday, before we’d even finished writing up the incident. Three months later the same person who took that first ticket is still the one who replies — no hand-off, no repeating the whole story from scratch.'),
|
|
316
|
-
attribution: {
|
|
317
|
-
name: 'Dana Osei',
|
|
318
|
-
role: 'Engineering Manager, Vaultline',
|
|
319
|
-
...(media['avatar-about'] === undefined ? {} : { avatar: media['avatar-about'] }),
|
|
320
|
-
},
|
|
321
|
-
},
|
|
322
|
-
],
|
|
323
|
-
},
|
|
324
|
-
];
|
|
325
|
-
}
|
|
326
|
-
function pricingTiers() {
|
|
327
|
-
return [
|
|
328
|
-
{
|
|
329
|
-
_key: 'demo-tier-starter',
|
|
330
|
-
name: 'Starter',
|
|
331
|
-
price: '$0',
|
|
332
|
-
interval: '/month',
|
|
333
|
-
features: ['Up to 5 seats', 'Core workflows', 'Community support'],
|
|
334
|
-
action: { label: 'Start free', target: { href: '#' } },
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
_key: 'demo-tier-pro',
|
|
338
|
-
name: 'Pro',
|
|
339
|
-
price: '$24',
|
|
340
|
-
interval: '/seat/month',
|
|
341
|
-
features: [
|
|
342
|
-
'Unlimited seats',
|
|
343
|
-
'Workflow automation',
|
|
344
|
-
'SSO (SAML & OIDC)',
|
|
345
|
-
'Full audit log',
|
|
346
|
-
'Priority support',
|
|
347
|
-
],
|
|
348
|
-
action: { label: 'Start free', target: { href: '#' }, emphasis: 'primary' },
|
|
349
|
-
highlighted: true,
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
_key: 'demo-tier-enterprise',
|
|
353
|
-
name: 'Enterprise',
|
|
354
|
-
price: 'Custom',
|
|
355
|
-
features: [
|
|
356
|
-
'Everything in Pro',
|
|
357
|
-
'Dedicated onboarding',
|
|
358
|
-
'Custom contract & invoicing',
|
|
359
|
-
'A named account manager',
|
|
360
|
-
],
|
|
361
|
-
action: { label: 'Talk to sales', target: { href: '/about' } },
|
|
362
|
-
},
|
|
363
|
-
];
|
|
364
|
-
}
|
|
365
|
-
function homeFaq() {
|
|
366
|
-
const items = [
|
|
367
|
-
[
|
|
368
|
-
'How long does it take to get started?',
|
|
369
|
-
'Most teams are running real workflows the same afternoon they sign up — there is no migration step to complete first. Import a spreadsheet, invite the team, and the first approval can go out before lunch.',
|
|
370
|
-
],
|
|
371
|
-
[
|
|
372
|
-
'Does it work with the tools we already use?',
|
|
373
|
-
'Yes — two-way sync with the usual suspects, plus outbound webhooks and a documented API for anything bespoke. If it has an API, it can talk to this one; if it does not, the webhook still fires.',
|
|
374
|
-
],
|
|
375
|
-
[
|
|
376
|
-
'Is our data ours if we leave?',
|
|
377
|
-
'A full export, in a format something else can actually read, is one click away at any time — there is no lock-in by file format, no support ticket required, and no waiting period.',
|
|
378
|
-
],
|
|
379
|
-
[
|
|
380
|
-
'How is data secured in transit and at rest?',
|
|
381
|
-
'Everything is encrypted in transit and at rest, and every access is written to the audit log described above. Backups are tested by restoring them, not just taking them, on a schedule a security review can ask to see.',
|
|
382
|
-
],
|
|
383
|
-
[
|
|
384
|
-
'Can we bring our own identity provider?',
|
|
385
|
-
'Yes, SAML and OIDC are supported on every paid plan, provisioned in minutes from the settings screen — no support ticket, no waiting on a callback from us.',
|
|
386
|
-
],
|
|
387
|
-
[
|
|
388
|
-
'What kind of support do we get?',
|
|
389
|
-
'Every plan includes email support with a same-day response on business days; Pro and Enterprise add priority response times, a named contact, and a shared channel for anything urgent.',
|
|
390
|
-
],
|
|
391
|
-
];
|
|
392
|
-
return {
|
|
393
|
-
_key: 'demo-home-faq',
|
|
394
|
-
_type: 'faq',
|
|
395
|
-
_version: BLOCK_VERSION,
|
|
396
|
-
title: 'Frequently asked questions',
|
|
397
|
-
items: items.map(([question, answer], index) => ({
|
|
398
|
-
_key: `demo-home-faq-${index}`,
|
|
399
|
-
question,
|
|
400
|
-
answer: richTextParagraph(`demo-home-faq-${index}-a`, answer),
|
|
401
|
-
})),
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
export const SAAS_RECOMMENDED_AGENTS = [
|
|
405
|
-
{
|
|
406
|
-
name: 'performanceAgent',
|
|
407
|
-
package: '@cogenta/agents-builtin',
|
|
408
|
-
reason: 'Catches regressions on the marketing pages that most directly drive sign-ups.',
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
name: 'securityAgent',
|
|
412
|
-
package: '@cogenta/agents-builtin',
|
|
413
|
-
reason: 'Tracks dependency vulnerabilities — the kind of thing a SaaS buyer asks about first.',
|
|
414
|
-
},
|
|
415
|
-
];
|
|
416
|
-
/**
|
|
417
|
-
* `saas`'s own starting skin (`starting-skins.js`) — asserted present with a
|
|
418
|
-
* real check, not a `!`, since `STARTING_SKINS` is keyed by blueprint id and
|
|
419
|
-
* TypeScript cannot see that this particular key is always populated.
|
|
420
|
-
*/
|
|
421
|
-
function saasPalette() {
|
|
422
|
-
const skin = STARTING_SKINS.saas;
|
|
423
|
-
if (skin === undefined) {
|
|
424
|
-
// Same code `resolveBlueprint` (`registry.ts`) uses for its own
|
|
425
|
-
// "this cannot happen unless the registry itself is broken" guard — this
|
|
426
|
-
// is a bug in starting-skins.ts, never a user-facing condition.
|
|
427
|
-
throw new CogentaError({
|
|
428
|
-
code: 'BLUEPRINT_REGISTRY_CORRUPT',
|
|
429
|
-
message: 'STARTING_SKINS.saas is missing.',
|
|
430
|
-
hint: 'The "saas" entry must stay declared in starting-skins.ts for this blueprint to render its demo art.',
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
return skin.color;
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Procedural visuals this blueprint seeds (L25): a mesh-gradient hero
|
|
437
|
-
* backdrop, a wide product screenshot stand-in, six neutral client logos
|
|
438
|
-
* for the trust strip, one avatar per testimonial (L26: the "about" page's
|
|
439
|
-
* testimonial went unillustrated before this — a second, distinct avatar
|
|
440
|
-
* fixes that rather than reusing the home page's), and one cover photo per
|
|
441
|
-
* demo feature — all from the same starting-skin palette
|
|
442
|
-
* (`starting-skins.js`) this blueprint already ships.
|
|
443
|
-
*/
|
|
444
|
-
export const SAAS_MEDIA_SPECS = [
|
|
445
|
-
{
|
|
446
|
-
name: 'hero',
|
|
447
|
-
spec: heroArt(saasPalette(), 'mesh', 21),
|
|
448
|
-
alt: 'A software team at work',
|
|
449
|
-
photo: 'saas/hero.jpg',
|
|
450
|
-
},
|
|
451
|
-
{
|
|
452
|
-
name: 'product',
|
|
453
|
-
spec: coverArt(saasPalette(), 22),
|
|
454
|
-
alt: 'Abstract product visual standing in for a screenshot of the workspace',
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
name: 'avatar',
|
|
458
|
-
spec: avatarArt(saasPalette(), 23),
|
|
459
|
-
alt: 'Portrait of the testimonial’s author',
|
|
460
|
-
photo: 'saas/avatar-1.jpg',
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
name: 'avatar-about',
|
|
464
|
-
// No second bundled photo exists for this blueprint (only
|
|
465
|
-
// `hero.jpg`/`avatar-1.jpg`, see `assets/photos/saas/`) — reusing
|
|
466
|
-
// `avatar-1.jpg` under a different name would put the same face on two
|
|
467
|
-
// different people, which is worse than an honest procedural portrait.
|
|
468
|
-
spec: avatarArt(saasPalette(), 24),
|
|
469
|
-
alt: 'Portrait of the "about" page testimonial’s author',
|
|
470
|
-
},
|
|
471
|
-
...[0, 1, 2, 3, 4, 5].map((index) => ({
|
|
472
|
-
name: `logo-${index}`,
|
|
473
|
-
spec: logoArt(30 + index),
|
|
474
|
-
alt: `Client logo ${index + 1}`,
|
|
475
|
-
})),
|
|
476
|
-
...SAAS_DEMO_FEATURES.map((demo, index) => ({
|
|
477
|
-
name: `feature-${demo.slug}`,
|
|
478
|
-
spec: coverArt(saasPalette(), 40 + index),
|
|
479
|
-
alt: `${demo.name} cover art`,
|
|
480
|
-
})),
|
|
481
|
-
];
|
|
482
|
-
/** Header/footer navigation and the header call-to-action button (L25, D4). */
|
|
483
|
-
export const SAAS_MENUS = {
|
|
484
|
-
header: [
|
|
485
|
-
{ label: 'Product', url: '#' },
|
|
486
|
-
{ label: 'Pricing', url: '/pricing' },
|
|
487
|
-
{ label: 'Docs', url: '#' },
|
|
488
|
-
{ label: 'Blog', url: '#' },
|
|
489
|
-
{ label: 'Company', url: '/about' },
|
|
490
|
-
],
|
|
491
|
-
footer: [
|
|
492
|
-
{ label: 'Product', url: '#' },
|
|
493
|
-
{ label: 'Company', url: '/about' },
|
|
494
|
-
{ label: 'Legal', url: '#' },
|
|
495
|
-
],
|
|
496
|
-
headerAction: { label: 'Start free', url: '/pricing' },
|
|
497
|
-
};
|
|
498
|
-
export const SAAS_SITE_SETTINGS = {
|
|
499
|
-
'general.tagline': 'Ship faster, with less friction.',
|
|
500
|
-
'general.socialLinks': [
|
|
501
|
-
{ label: 'X', url: 'https://x.com/example' },
|
|
502
|
-
{ label: 'GitHub', url: 'https://github.com/example' },
|
|
503
|
-
{ label: 'LinkedIn', url: 'https://linkedin.com/company/example' },
|
|
504
|
-
],
|
|
505
|
-
'general.footerNote': 'A demo SaaS site, scaffolded by create-cogenta.',
|
|
506
|
-
};
|
|
507
|
-
/**
|
|
508
|
-
* Inserts the `saas` blueprint's demo content through the real
|
|
509
|
-
* `ContentStore` — never mocked (house rule). Features are created first so
|
|
510
|
-
* their real ids exist for the home page's `featureGrid` links and, via
|
|
511
|
-
* `media`, for their own `coverImage`.
|
|
512
|
-
*/
|
|
513
|
-
async function seedSaasDemoContent(ctx) {
|
|
514
|
-
const { db, defaultLocale, adminId, media } = ctx;
|
|
515
|
-
const featureStore = createContentStore({ db, collection: feature, defaultLocale });
|
|
516
|
-
const pageStore = createContentStore({ db, collection: page, defaultLocale });
|
|
517
|
-
const featureIdBySlug = new Map();
|
|
518
|
-
for (const demo of SAAS_DEMO_FEATURES) {
|
|
519
|
-
const cover = media[`feature-${demo.slug}`];
|
|
520
|
-
const created = await featureStore.create({
|
|
521
|
-
status: 'published',
|
|
522
|
-
createdBy: adminId,
|
|
523
|
-
values: {
|
|
524
|
-
name: demo.name,
|
|
525
|
-
slug: demo.slug,
|
|
526
|
-
description: demo.description,
|
|
527
|
-
icon: demo.icon,
|
|
528
|
-
...(cover === undefined ? {} : { coverImage: cover }),
|
|
529
|
-
},
|
|
530
|
-
});
|
|
531
|
-
featureIdBySlug.set(demo.slug, created.id);
|
|
532
|
-
}
|
|
533
|
-
for (const demo of buildSaasDemoPages(media, featureIdBySlug)) {
|
|
534
|
-
await pageStore.create({
|
|
535
|
-
status: 'published',
|
|
536
|
-
createdBy: adminId,
|
|
537
|
-
values: { title: demo.title, slug: demo.slug },
|
|
538
|
-
blocks: { blocks: demo.blocks.map(toBlockZoneEntry) },
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
export const saasContentPack = {
|
|
543
|
-
collections: SAAS_COLLECTIONS,
|
|
544
|
-
recommendedAgents: SAAS_RECOMMENDED_AGENTS,
|
|
545
|
-
seedDemoContent: seedSaasDemoContent,
|
|
546
|
-
defaultTheme: '@cogenta/theme-saas',
|
|
547
|
-
menus: SAAS_MENUS,
|
|
548
|
-
siteSettings: SAAS_SITE_SETTINGS,
|
|
549
|
-
mediaSpecs: SAAS_MEDIA_SPECS,
|
|
550
|
-
};
|
|
551
|
-
//# sourceMappingURL=saas.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"saas.js","sourceRoot":"","sources":["../../src/blueprints/saas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type DatabaseHandle, type Logger } from '@cogenta/core';
|
|
2
|
-
/**
|
|
3
|
-
* Seeds a blueprint's `siteSettings` (L25 task A0b, D4) through the real
|
|
4
|
-
* `SiteSettingsStore` (`@cogenta/schema`) — `general.tagline`,
|
|
5
|
-
* `general.socialLinks`, `general.footerNote`, etc.
|
|
6
|
-
*
|
|
7
|
-
* Tolerant of a key the registry does not (yet) declare: another agent is
|
|
8
|
-
* extending `SITE_SETTINGS_REGISTRY` with `general.socialLinks`/
|
|
9
|
-
* `general.footerNote` in parallel with this task (Phase 0 — A0a), so a
|
|
10
|
-
* blueprint naming one of those keys before that lands must not fail the
|
|
11
|
-
* whole scaffold — it logs a warning and moves on. Any other failure (a
|
|
12
|
-
* value that fails the key's own schema, which is a real bug in the
|
|
13
|
-
* blueprint) still throws.
|
|
14
|
-
*/
|
|
15
|
-
/** Returns how many of `values` were actually written — the rest were unknown keys, logged and skipped. */
|
|
16
|
-
export declare function seedSiteSettings(db: DatabaseHandle, defaultLocale: string, values: Readonly<Record<string, unknown>>, adminId: string | null, logger: Logger): Promise<number>;
|
|
17
|
-
//# sourceMappingURL=site-settings-seed.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"site-settings-seed.d.ts","sourceRoot":"","sources":["../../src/blueprints/site-settings-seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAQ9E;;;;;;;;;;;;GAYG;AACH,2GAA2G;AAC3G,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,cAAc,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { CogentaError } from '@cogenta/core';
|
|
2
|
-
import { createSiteSettingsStore, ensureSiteSettingsTables, SITE_SETTINGS_SITE_SCOPE, siteSettingByKey, } from '@cogenta/schema';
|
|
3
|
-
/**
|
|
4
|
-
* Seeds a blueprint's `siteSettings` (L25 task A0b, D4) through the real
|
|
5
|
-
* `SiteSettingsStore` (`@cogenta/schema`) — `general.tagline`,
|
|
6
|
-
* `general.socialLinks`, `general.footerNote`, etc.
|
|
7
|
-
*
|
|
8
|
-
* Tolerant of a key the registry does not (yet) declare: another agent is
|
|
9
|
-
* extending `SITE_SETTINGS_REGISTRY` with `general.socialLinks`/
|
|
10
|
-
* `general.footerNote` in parallel with this task (Phase 0 — A0a), so a
|
|
11
|
-
* blueprint naming one of those keys before that lands must not fail the
|
|
12
|
-
* whole scaffold — it logs a warning and moves on. Any other failure (a
|
|
13
|
-
* value that fails the key's own schema, which is a real bug in the
|
|
14
|
-
* blueprint) still throws.
|
|
15
|
-
*/
|
|
16
|
-
/** Returns how many of `values` were actually written — the rest were unknown keys, logged and skipped. */
|
|
17
|
-
export async function seedSiteSettings(db, defaultLocale, values, adminId, logger) {
|
|
18
|
-
const entries = Object.entries(values);
|
|
19
|
-
if (entries.length === 0)
|
|
20
|
-
return 0;
|
|
21
|
-
await ensureSiteSettingsTables(db);
|
|
22
|
-
const store = createSiteSettingsStore({ db });
|
|
23
|
-
let written = 0;
|
|
24
|
-
for (const [key, value] of entries) {
|
|
25
|
-
const definition = siteSettingByKey(key);
|
|
26
|
-
if (definition === undefined) {
|
|
27
|
-
logger.warn('skipping a blueprint site setting the registry does not declare', { key });
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const locale = definition.scope === 'site' ? SITE_SETTINGS_SITE_SCOPE : defaultLocale;
|
|
31
|
-
try {
|
|
32
|
-
await store.set(key, locale, value, adminId);
|
|
33
|
-
written++;
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
if (error instanceof CogentaError && error.code === 'SITE_SETTING_UNKNOWN') {
|
|
37
|
-
logger.warn('skipping a blueprint site setting the registry does not declare', { key });
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
throw error;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return written;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=site-settings-seed.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"site-settings-seed.js","sourceRoot":"","sources":["../../src/blueprints/site-settings-seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,eAAe,CAAA;AAC9E,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB;;;;;;;;;;;;GAYG;AACH,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,aAAqB,EACrB,MAAyC,EACzC,OAAsB,EACtB,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAElC,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACvF,SAAQ;QACV,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa,CAAA;QACrF,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAO,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAC3E,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;gBACvF,SAAQ;YACV,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|