mirror of
https://github.com/logos-co/logos-web.git
synced 2026-08-31 14:11:12 +00:00
* docs: add page-copy single-source spec and implementation plan * feat(content): add typed home section schemas and migrate home copy into content Add 7 bespoke home* section schemas (+ techStack ctas) to the page section union and populate content/pages/en/home.json with home copy moved verbatim from messages. * refactor(web): source home page copy from @repo/content; drop home namespace from messages Feed every home section from content via findSection/data props (replacing next-intl getTranslations), remove the home namespace from messages/en.json, and add a regression guard plus content-based tests. Render output unchanged. * docs: add get-started/movement page-copy dedup spec and plan * feat(content): add get-started & movement section schemas and content docs Move get-started/movement page copy verbatim into content/pages so it is single-sourced in @repo/content. * refactor(web): source get-started/movement copy from content; drop those namespaces from messages Feed both pages from content via findSection/data props (replacing next-intl), switch them to content-based metadata, delete pages.getStarted/movement from messages, and add content-based tests + ownership guard. Render unchanged. * docs: add navbar-pages CMS copy spec and plan * feat(content): add navbar page section schemas + Pages docs (book, brand-kit, research, node-programme, lambda-prize, manifesto, media, podcast, broadcast, tech-stack explorer) * refactor(web): source navbar pages copy from content; drop those namespaces from messages Migrate book, brand-kit, research (incl. rich-text via a tagged-text renderer), node-programme, lambda-prize, manifesto, media, podcast, logos-broadcast-network, and the tech-stack explorer to read copy from content via findSection/data props and content-based metadata; remove the migrated pages.* namespaces from messages; update guards + contracts. Render output unchanged. * feat(web): source activist/coalition pages copy from content (CMS title/description) Migrate activistBuilder, activistLeaderSteward, and coalitionPartner page metadata from next-intl messages.pages.* into @repo/content PageCopy JSON, following the established bookCopy pattern. - Add activistBuilderCopySectionSchema, activistLeaderStewardCopySectionSchema, coalitionPartnerCopySectionSchema to packages/content/src/schemas/pages.ts and wire them into the pageSectionSchema discriminated union - Create content/pages/en/activist-builder.json, activist-leader-steward.json, coalition-partner.json with verbatim title/description/heading values from the old messages namespace - Switch all three route pages from createTranslatedPageMetadata to createPageMetadata(ROUTE), removing the NAMESPACE constant - Remove activistBuilder, activistLeaderSteward, coalitionPartner from apps/web/messages/en.json pages object - Add schema parse tests, renderToStaticMarkup page tests, messages ownership guards, and content-route contract entries for all three pages * chore(web): remove dead faq (pages.faq + unused FaqSection components) * fix: remove stale faq links * fix: pass payload env through turbo build * fix: preserve lambda prize support labels * fix: preserve live copy after master rebase * fix: address page copy review feedback * refactor: move design guide copy to content * feat: add schemas for home and page copy sections - Introduced home section schemas including homeSocialProof, homeChoosePath, homeDecide, homeStartBuilding, homeAbout, homeUseCases, and homeBuilderPortal. - Added page copy section schemas such as getStartedCopy, movementCopy, bookCopy, designGuideCopy, activistBuilderCopy, activistLeaderStewardCopy, coalitionPartnerCopy, researchCopy, nodeProgrammeCopy, lambdaPrizeCopy, mediaCopy, podcastCopy, broadcastCopy, and manifestoCopy. - Created shared schema for section keys to maintain consistency across sections. * chore(web): remove dead pages.faq from messages * fix: resolve page copy migration conflicts * fix: source connect form page copy from content * fix: remove duplicated afform page copy exports * fix: stop generating afform page copy exports * fix(cms): require only server actions key * fix(cms): load env files before build validation * fix(cms): make env loader available during build * fix(cms): load next env via require * test(cms): isolate missing env validation * feat: add homepage testnet highlight * fix: restore lambda prize support links
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { readFileSync } from 'node:fs'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
import { describe, expect, test } from 'vitest'
|
|
|
|
import { EXTERNAL_URLS, ROUTES } from '@/constants/routes'
|
|
|
|
import nodeProgrammeContent from '../../../../content/pages/en/node-programme.json' with { type: 'json' }
|
|
|
|
const readNodeProgrammePageSource = () =>
|
|
readFileSync(
|
|
fileURLToPath(
|
|
new URL('../[locale]/node-programme/page.tsx', import.meta.url)
|
|
),
|
|
'utf8'
|
|
)
|
|
|
|
type NodeProgrammeCopySection = {
|
|
componentType: 'nodeProgrammeCopy'
|
|
key: string
|
|
hero: { title: string; guideCta: string }
|
|
signup: { roles: string[] }
|
|
stack: { items: unknown[] }
|
|
useCases: { items: unknown[] }
|
|
}
|
|
|
|
describe('node programme page contract', () => {
|
|
test('uses the British English public route', () => {
|
|
expect(ROUTES.nodeProgramme).toBe('/node-programme')
|
|
})
|
|
|
|
test('has copy for the signup form and imported source sections', () => {
|
|
const section = nodeProgrammeContent.sections[0] as NodeProgrammeCopySection
|
|
|
|
// Hero wording can change freely; only require it to be present text.
|
|
expect(typeof section.hero.title).toBe('string')
|
|
expect(section.hero.title.trim().length).toBeGreaterThan(0)
|
|
|
|
// Roles are functional form values (submitted to the signup API), so they
|
|
// must stay non-empty strings. The set can grow, so we only require the
|
|
// core roles to be present rather than pinning the exact list.
|
|
const { roles } = section.signup
|
|
expect(Array.isArray(roles)).toBe(true)
|
|
expect(roles.length).toBeGreaterThan(0)
|
|
roles.forEach((role) => {
|
|
expect(typeof role).toBe('string')
|
|
expect(role.trim().length).toBeGreaterThan(0)
|
|
})
|
|
expect(roles).toEqual(
|
|
expect.arrayContaining(['Node operator', 'Builder'])
|
|
)
|
|
expect(section.stack.items).toHaveLength(3)
|
|
expect(section.useCases.items).toHaveLength(5)
|
|
})
|
|
|
|
test('links the hero CTA group to the node operator guide', () => {
|
|
const section = nodeProgrammeContent.sections[0] as NodeProgrammeCopySection
|
|
const pageSource = readNodeProgrammePageSource()
|
|
|
|
expect(section.hero.guideCta).toBe('Node operator guide')
|
|
expect(EXTERNAL_URLS.nodeOperatorGuide).toBe(
|
|
'https://docs.logos.co/run-a-node'
|
|
)
|
|
expect(pageSource).toContain('href={EXTERNAL_URLS.nodeOperatorGuide}')
|
|
expect(pageSource).toContain('{data.hero.guideCta}')
|
|
})
|
|
})
|