{"_id":"@aceccarello/portable-text-to-lexical","_rev":"2-f4c24cbcf4c97188216a4f834cb29cbf","name":"@aceccarello/portable-text-to-lexical","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@aceccarello/portable-text-to-lexical","version":"0.0.1","keywords":["sanity","payload","lexical","portable text","migration"],"license":"MIT","_id":"@aceccarello/portable-text-to-lexical@0.0.1","maintainers":[{"name":"aceccarello.dev","email":"a.ceccarello.c@gmail.com"}],"dist":{"shasum":"50721f39df49ed66d873d90d98b9ef35873f4939","tarball":"https://registry.npmjs.org/@aceccarello/portable-text-to-lexical/-/portable-text-to-lexical-0.0.1.tgz","fileCount":9,"integrity":"sha512-nfJX9cygWmpXHHs/O3fXDZwX8ICMjSirZFIDxQLwk6t6EVlgQKDvbIe6xdvJ6gtZ0loIaa7MiT0eZ8DhBX0/Pw==","signatures":[{"sig":"MEUCICqQG/K59yT73aAHIBPNyoSWfNvDNZWz4D92Z+eJWfhCAiEA6ljISX1J3TqzRBclBUCO/3jW4KhNy/SQnOrnTUiqpyU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21178},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"589462631f43112cf238bad8cd5e0e2c357a7f22","scripts":{"build":"tsdown","prepublishOnly":"pnpm build"},"_npmUser":{"name":"aceccarello.dev","email":"a.ceccarello.c@gmail.com"},"_npmVersion":"10.9.2","description":"Convert Sanity Portable Text to Payload Lexical JSON (library-first).","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@sanity/block-content-to-markdown":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.14.1","typescript":"^5.8.3","@types/node":"^20.17.46","@payloadcms/richtext-lexical":"^3.49.0"},"peerDependencies":{"payload":"^3.49.0","@payloadcms/richtext-lexical":"^3.49.0"},"_npmOperationalInternal":{"tmp":"tmp/portable-text-to-lexical_0.0.1_1755382603346_0.86846925354229","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@aceccarello/portable-text-to-lexical","version":"0.1.0","description":"Convert Sanity Portable Text to Payload Lexical JSON (library-first).","license":"MIT","type":"module","engines":{"node":">=20"},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"publishConfig":{"access":"public"},"keywords":["sanity","payload","lexical","portable text","migration"],"peerDependencies":{"payload":"^3.49.0","@payloadcms/richtext-lexical":"^3.49.0"},"dependencies":{"@sanity/block-content-to-markdown":"^1.0.0"},"devDependencies":{"typescript":"^5.8.3","tsdown":"^0.14.1","@types/node":"^20.17.46","@payloadcms/richtext-lexical":"^3.49.0"},"scripts":{"build":"tsdown"},"_id":"@aceccarello/portable-text-to-lexical@0.1.0","_integrity":"sha512-d5WG+sG/fvkXn842G2w6WTTH3dIcglpSjskXtxJ5csqA/md5kNAmCZ8BMlKUYdQ+IikdsJV7RpEz4BGs74pt8w==","_resolved":"/private/var/folders/wh/my53rs611cbcq_6s_4knp8s00000gn/T/c6a2eefbf5226c26a22f0aafe52cb27e/aceccarello-portable-text-to-lexical-0.1.0.tgz","_from":"file:aceccarello-portable-text-to-lexical-0.1.0.tgz","_nodeVersion":"22.15.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-d5WG+sG/fvkXn842G2w6WTTH3dIcglpSjskXtxJ5csqA/md5kNAmCZ8BMlKUYdQ+IikdsJV7RpEz4BGs74pt8w==","shasum":"4510d4c9a6c5cbc7fa46c7d491ea2be95a6d52e7","tarball":"https://registry.npmjs.org/@aceccarello/portable-text-to-lexical/-/portable-text-to-lexical-0.1.0.tgz","fileCount":9,"unpackedSize":40772,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAy1KiZ5X+t9KNDRWm10/q6mgaJRBBlrxu48h4u3E5pgAiBF0XiMROk3mxLP5XStCY6FHcyleuSDft4tRrq3ldGhog=="}]},"_npmUser":{"name":"aceccarello.dev","email":"a.ceccarello.c@gmail.com"},"directories":{},"maintainers":[{"name":"aceccarello.dev","email":"a.ceccarello.c@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/portable-text-to-lexical_0.1.0_1755481048232_0.23872723120726635"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-16T22:16:43.211Z","modified":"2025-08-18T01:37:28.616Z","0.0.1":"2025-08-16T22:16:43.561Z","0.1.0":"2025-08-18T01:37:28.418Z"},"license":"MIT","keywords":["sanity","payload","lexical","portable text","migration"],"description":"Convert Sanity Portable Text to Payload Lexical JSON (library-first).","maintainers":[{"name":"aceccarello.dev","email":"a.ceccarello.c@gmail.com"}],"readme":"# @aceccarello/portable-text-to-lexical\n\nConvert Sanity Portable Text to Payload Lexical JSON. Library-first (no CLI) with a Markdown-first pipeline and configurable behavior.\n\n## Install\n\n```bash\npnpm add @aceccarello/portable-text-to-lexical\n# peer deps (expected in the host app)\npnpm add payload @payloadcms/richtext-lexical\n```\n\n## Usage (programmatic)\n\n```ts\nimport {\n  portableTextToLexical,\n  portableTextToPlainText,\n  portableTextToMarkdown,\n} from '@aceccarello/portable-text-to-lexical'\nimport { getPayload } from 'payload'\nimport config from './payload.config'\n\nconst payload = await getPayload({ config })\n\n// 1) Plain text helper\nconst plain = portableTextToPlainText(portableText)\n\n// 2) Markdown preview/helper (useful for debugging/analytics)\nconst markdown = portableTextToMarkdown(portableText, {\n  includeDefaultSerializers: true,\n  // serializers: { types: { ...customTypes } },\n  // preprocess: { markdown: (md) => md },\n})\n\n// 3) Convert to Payload Lexical JSON (SerializedEditorState)\nconst editorState = await portableTextToLexical(portableText, {\n  // Prefer passing a real SanitizedConfig from a running Payload instance\n  payloadConfig: payload.config,\n\n  // Optional hooks & customization\n  // features: [YourCustomFeature],\n  // preprocess: { markdown: (md) => md },\n  // postprocess: (json) => json,\n  // onMarkdown: (md) => console.log(md),\n  // serializers: { types: { ...customTypes } },\n  includeDefaultSerializers: true,\n})\n```\n\nNotes:\n- v0.1 requires either `payloadConfig` as a real `SanitizedConfig` (i.e., `payload.config` from a running server) or a pre-sanitized editor config via `sanitizedEditorConfig`.\n- Default serializers include lightweight support for common PT `code`/`codeBlock` and `image` nodes. You can add/override serializers.\n\n### Alternative: pre-sanitized editor config\n\nIf you already have (or want to compute) a sanitized editor config:\n\n```ts\nimport {\n  sanitizeServerEditorConfig,\n  defaultEditorConfig,\n  defaultEditorFeatures,\n} from '@payloadcms/richtext-lexical'\n\nconst sanitizedEditorConfig = await sanitizeServerEditorConfig(\n  { ...defaultEditorConfig, features: defaultEditorFeatures },\n  payload.config // still pass the server's SanitizedConfig here\n)\n\nconst editorState = await portableTextToLexical(portableText, {\n  sanitizedEditorConfig,\n  includeDefaultSerializers: true,\n})\n```\n\n## API\n- `portableTextToLexical(portableText, options)` → `SerializedEditorState` (JSON)\n- `portableTextToMarkdown(portableText, options)` → `string`\n- `portableTextToPlainText(portableText)` → `string`\n\n### Options (portableTextToLexical)\n- **payloadConfig**: `Config | SanitizedConfig` (must be a real `SanitizedConfig` at runtime: `payload.config`)\n- **sanitizedEditorConfig**: result of `sanitizeServerEditorConfig(...)` (skip `payloadConfig` path)\n- **features**: extend default server features array\n- **serializers**: pass custom Portable Text serializers (from `@sanity/block-content-to-markdown`)\n- **includeDefaultSerializers**: boolean, merge built-ins with your serializers (default: true)\n- **preprocess**: `{ markdown?: (md: string) => string }`\n- **postprocess**: `(json) => json`\n- **onMarkdown**: observe intermediate Markdown `(md: string) => void`\n\n## License\nMIT © Alessandro Ceccarello\n","readmeFilename":"README.md"}