@aceccarello/portable-text-to-lexical
v0.1.0
Published
Convert Sanity Portable Text to Payload Lexical JSON (library-first).
Maintainers
Readme
@aceccarello/portable-text-to-lexical
Convert Sanity Portable Text to Payload Lexical JSON. Library-first (no CLI) with a Markdown-first pipeline and configurable behavior.
Install
pnpm add @aceccarello/portable-text-to-lexical
# peer deps (expected in the host app)
pnpm add payload @payloadcms/richtext-lexicalUsage (programmatic)
import {
portableTextToLexical,
portableTextToPlainText,
portableTextToMarkdown,
} from '@aceccarello/portable-text-to-lexical'
import { getPayload } from 'payload'
import config from './payload.config'
const payload = await getPayload({ config })
// 1) Plain text helper
const plain = portableTextToPlainText(portableText)
// 2) Markdown preview/helper (useful for debugging/analytics)
const markdown = portableTextToMarkdown(portableText, {
includeDefaultSerializers: true,
// serializers: { types: { ...customTypes } },
// preprocess: { markdown: (md) => md },
})
// 3) Convert to Payload Lexical JSON (SerializedEditorState)
const editorState = await portableTextToLexical(portableText, {
// Prefer passing a real SanitizedConfig from a running Payload instance
payloadConfig: payload.config,
// Optional hooks & customization
// features: [YourCustomFeature],
// preprocess: { markdown: (md) => md },
// postprocess: (json) => json,
// onMarkdown: (md) => console.log(md),
// serializers: { types: { ...customTypes } },
includeDefaultSerializers: true,
})Notes:
- v0.1 requires either
payloadConfigas a realSanitizedConfig(i.e.,payload.configfrom a running server) or a pre-sanitized editor config viasanitizedEditorConfig. - Default serializers include lightweight support for common PT
code/codeBlockandimagenodes. You can add/override serializers.
Alternative: pre-sanitized editor config
If you already have (or want to compute) a sanitized editor config:
import {
sanitizeServerEditorConfig,
defaultEditorConfig,
defaultEditorFeatures,
} from '@payloadcms/richtext-lexical'
const sanitizedEditorConfig = await sanitizeServerEditorConfig(
{ ...defaultEditorConfig, features: defaultEditorFeatures },
payload.config // still pass the server's SanitizedConfig here
)
const editorState = await portableTextToLexical(portableText, {
sanitizedEditorConfig,
includeDefaultSerializers: true,
})API
portableTextToLexical(portableText, options)→SerializedEditorState(JSON)portableTextToMarkdown(portableText, options)→stringportableTextToPlainText(portableText)→string
Options (portableTextToLexical)
- payloadConfig:
Config | SanitizedConfig(must be a realSanitizedConfigat runtime:payload.config) - sanitizedEditorConfig: result of
sanitizeServerEditorConfig(...)(skippayloadConfigpath) - features: extend default server features array
- serializers: pass custom Portable Text serializers (from
@sanity/block-content-to-markdown) - includeDefaultSerializers: boolean, merge built-ins with your serializers (default: true)
- preprocess:
{ markdown?: (md: string) => string } - postprocess:
(json) => json - onMarkdown: observe intermediate Markdown
(md: string) => void
License
MIT © Alessandro Ceccarello
