{"_id":"@airdraft/content","_rev":"8-169184ea76041a2a4aa49493bdbec2c3","name":"@airdraft/content","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@airdraft/content","version":"0.1.0","license":"MIT","_id":"@airdraft/content@0.1.0","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"c0884eccb7eeb61a046c7f64f76515edd4f5248b","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.0.tgz","fileCount":17,"integrity":"sha512-RHF5seEEWZH6sm18qCkOJksh8/cv29e3kYZwkkajaj/XH7/OYFDsxulLYZYsqU9nzdb6LMm0mee6OE2pVI9Jfw==","signatures":[{"sig":"MEYCIQChVM6bWsuUzAKCcYYEzDVD2kXQW9vnT/xBJUx7B08e1wIhAKpPtCQxBHBz+EcIoo3OePMIBAfE7u73Nd9oGjwDQ31m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14505},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e1bd5fa8af9b2903024c39a0fa945e49f87754d3","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0","dompurify":"^3.2.6","isomorphic-dompurify":"^2.26.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/dompurify":"^3.0.5"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.0_1779454113899_0.2185881925736224","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@airdraft/content","version":"0.1.1","license":"MIT","_id":"@airdraft/content@0.1.1","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"5c9b578db7f4ec33d5e4d8344adf2833ebd86c29","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.1.tgz","fileCount":17,"integrity":"sha512-dcmWQlM5pJ1I64K2kdDjw40tLaOtkz8vN1LNvJ9m3onbuhqbofMS0O3BW/IT/F54Efg1uMlvUmf5I1WJFMKxtA==","signatures":[{"sig":"MEUCIQDQvtnXveLKBHfQi4378P9QPIILkUThdGcC2BssfbSlEwIgM9dwl79Hs9DRZcdUHMMvfs/m1BMNYbtf5zNJP6knOe0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19732},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"6777564297bb73b703d6922246b86d73dfc4df9a","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.1_1779520780768_0.4086864554382177","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@airdraft/content","version":"0.1.2","license":"MIT","_id":"@airdraft/content@0.1.2","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"9813a27b28d400e17d9c04a4bd3b193ebca2cfd6","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.2.tgz","fileCount":18,"integrity":"sha512-Nebomd35tpwWVLK959/ZBptaQyct7leb0JuubCkv7cHw+dz19ei4+xRc8LEOhxf0B9xPmL4ECOdRgR/4Oj2LUg==","signatures":[{"sig":"MEYCIQCe6ggr+SfTUTNc3KODiNFuVzKk+OOfjz5gxzTO/AhLEAIhANB25CZl58KYpi5JtGPlX+e4PMstxTQg1fS8dp+tbxTx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20197},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"277e16b37c997996b49d90ec64fa3f5c023f4d0a","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.2_1779521530835_0.700510311155524","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@airdraft/content","version":"0.1.3","license":"MIT","_id":"@airdraft/content@0.1.3","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"c5b10b9b73c2208c74104c05647884aab299a67f","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.3.tgz","fileCount":18,"integrity":"sha512-7vgSzjQhX2ueSIHX+5C2+yFbT35YjLzwJIcGsq8akINTd//mZeNkOG9shUG2Ld+NRarZANJbznvbrt3vY6SEgw==","signatures":[{"sig":"MEQCIDR1xZ1mp6dTEZr/irIzj6vQeZwPT2ARAShhM+WMmnOyAiBBHTq9gTaZt6R7aRuNAdrNBF8smQYOceCGhzKaUf9Raw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33318},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8d692f6e9c48b0c7886d404b7bbc9f1b0a79ca7b","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.3_1779557382515_0.7393463424411577","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@airdraft/content","version":"0.1.4","license":"MIT","_id":"@airdraft/content@0.1.4","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"f4f7195c202eb4a1dbbd3ec9caed8b6a4e9c8283","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.4.tgz","fileCount":18,"integrity":"sha512-HK/+RjgEYqX3TM9NmWSwD+NVZjoXcqRlBmROjPtTQi8YgRzRCutkn5L9umjlTjQd6xXKe8ur9uM+cuNX2REgwA==","signatures":[{"sig":"MEUCIA6tMT68E4JlNku0m5jsoex3HAnT2h2eg2zcIYx6HZvIAiEAktiP2KxM1sytmNBV/i9hOvHj/7AQUjdykYe0tLXg0FU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33927},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"88185ba7e7a5ed54561a09a53f6d13367587bbfb","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.4_1779564383926_0.557646989243002","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@airdraft/content","version":"0.1.5","license":"MIT","_id":"@airdraft/content@0.1.5","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"53b8b63ed8dacd73f095ed0bf0c7468dad0c7467","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.5.tgz","fileCount":19,"integrity":"sha512-sFziLMeHYHovqgBaxsIjMZ5X3jH6k5Fu9PxvLHCuNTvkbzPuzzeobejhHm2TUO3yGOOlV3JYUDtiYWvbTtSHIQ==","signatures":[{"sig":"MEUCIAEEjAaNOdi45aQZeUTn1qZ6f1XEguJSreOVtaXoNiQzAiEA/G8hab6UprvyZYZxrn1zMNRFq851yXtsg3V4oNXuOd4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38791},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"829aab190f831c8d252be75e35c26b42715babe2","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.5_1779570855516_0.6534934405299335","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@airdraft/content","version":"0.1.6","license":"MIT","_id":"@airdraft/content@0.1.6","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"dist":{"shasum":"826bfe4e48dfe21fff6edcde31080f39595c635f","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.6.tgz","fileCount":19,"integrity":"sha512-t+TwB59kh5TtRVTL7Kyt+82OOloQy6JH9gd0x9XUBQ2SgapWgpPXZI3d3QbFIb8nsyo7m47/cUPUN8NwoUw6FA==","signatures":[{"sig":"MEUCICWFN5CINkJycSUQ8PmYjSQAMFk6cvpN/nDO4WeXWnmhAiEAyLka0xhqY5t1ueJAGN3yK1VY5zpalADEhhkYTobqMPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44133},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8c9d4744b92db08fa725d40bc50f9ef0f1392e59","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","release":"standard-version","typecheck":"tsc --noEmit","release:major":"standard-version --release-as major","release:minor":"standard-version --release-as minor","release:patch":"standard-version --release-as patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"_npmVersion":"11.9.0","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","directories":{},"_nodeVersion":"24.14.0","dependencies":{"marked":"^12.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/content_0.1.6_1780221057911_0.9918245500712488","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@airdraft/content","version":"0.1.7","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc","dev":"tsc --watch","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","release":"standard-version","release:patch":"standard-version --release-as patch","release:minor":"standard-version --release-as minor","release:major":"standard-version --release-as major"},"publishConfig":{"access":"public"},"license":"MIT","dependencies":{"marked":"^12.0.0"},"devDependencies":{"typescript":"^5.7.2"},"gitHead":"9fdb3e0fbca1e58bb84aca8dd92155d0057ca4b1","_id":"@airdraft/content@0.1.7","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-h2Y6SscJyujpCo9yRkjjTl5qNVdQIHZNpW1S9ZSZx5NwqPHLK9q5AMoyfqvf0eUc9gMzwqZ97KOoX4TszXeb+A==","shasum":"f371222e35d7dc2f48da52337a0b9d65d6c1bb4d","tarball":"https://registry.npmjs.org/@airdraft/content/-/content-0.1.7.tgz","fileCount":19,"unpackedSize":47623,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICbxDhj6oeyKGTOj0bTA9QUf18YNGki56SikhIQZfHFgAiEA2+4EKF/tIuhltrhMn9D7UCqW3GR92FCl5fuTjcESFdM="}]},"_npmUser":{"name":"miracleio","email":"miracleficient@gmail.com"},"directories":{},"maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/content_0.1.7_1782407226092_0.7029312173020923"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-22T12:48:33.742Z","modified":"2026-06-25T17:07:06.432Z","0.1.0":"2026-05-22T12:48:34.039Z","0.1.1":"2026-05-23T07:19:40.902Z","0.1.2":"2026-05-23T07:32:10.976Z","0.1.3":"2026-05-23T17:29:42.659Z","0.1.4":"2026-05-23T19:26:24.067Z","0.1.5":"2026-05-23T21:14:15.646Z","0.1.6":"2026-05-31T09:50:58.045Z","0.1.7":"2026-06-25T17:07:06.289Z"},"license":"MIT","description":"Airdraft framework-agnostic content rendering utilities — URL resolution, Markdown parsing, relation helpers","maintainers":[{"name":"miracleio","email":"miracleficient@gmail.com"}],"readme":"# @airdraft/content\n\nFramework-agnostic pure functions for resolving and parsing Airdraft CMS content. No React required — safe to use in server actions, API routes, `generateMetadata`, middleware, or any non-React context.\n\n## Installation\n\n```bash\nnpm install @airdraft/content\n```\n\n## Media / Image\n\n```ts\nimport {\n  resolveMediaUrl,\n  resolveMediaUrls,\n  resolveImageDimensions,\n} from '@airdraft/content'\n```\n\n### `resolveMediaUrl(fieldName, data)`\n\nResolves a single `media` or `image` field to a URL string.\n\nResolution chain (first truthy wins):\n1. `data[\"{field}_media\"].url` — managed media object URL\n2. `data[\"{field}_url\"]` — raw URL stored alongside the key\n3. `data[\"{field}\"]` as string — raw storage key, prefixed with `/` if relative\n\n```ts\nconst url = resolveMediaUrl('cover', entry.data)\n// → 'https://cdn.example.com/covers/my-post.jpg' | undefined\n```\n\nUseful for `<meta property=\"og:image\">`, `next/image` `src`, or any place you need the URL value rather than a rendered element.\n\n### `resolveMediaUrls(fieldName, data)`\n\nResolves a `media` field with `multiple: true` to an array of URLs.\n\nResolution chain:\n1. `data[\"{field}_medias\"]` — injected `MediaItem[]` → extracts `.url` from each\n2. `data[\"{field}_urls\"]` — injected `string[]`\n3. `data[\"{field}\"]` — raw `string[]` or JSON-encoded `string[]`\n\n```ts\nconst urls = resolveMediaUrls('gallery', entry.data)\n// → ['https://...', 'https://...']\n```\n\n### `resolveImageDimensions(fieldName, data)`\n\nReads `width` and `height` from the `{field}_media` sidecar object. Returns `undefined` when the media object is absent or has no dimension data.\n\n```ts\nconst dims = resolveImageDimensions('cover', entry.data)\n// → { width: 1200, height: 630 } | undefined\n```\n\nCombine with `resolveMediaUrl` to pass explicit dimensions to `next/image` and avoid layout shift:\n\n```tsx\nconst url  = resolveMediaUrl('cover', entry.data)\nconst dims = resolveImageDimensions('cover', entry.data)\n\n// In a Next.js page / generateMetadata:\nreturn {\n  openGraph: { images: [{ url, ...dims }] },\n}\n\n// Or in a component:\n<Image src={url} alt=\"cover\" width={dims?.width ?? 800} height={dims?.height ?? 450} />\n```\n\n### `resolveImageUrl` (alias)\n\nLegacy alias for `resolveMediaUrl`. Prefer `resolveMediaUrl` for new `media`-typed fields.\n\n---\n\n## Body / Rich-text\n\n```ts\nimport { parseMarkdown, parseText } from '@airdraft/content'\n```\n\n### `parseMarkdown(text)`\n\nParses a Markdown string to an HTML string via `marked`. Safe for use with `dangerouslySetInnerHTML` — content is CMS-authored, not user-supplied.\n\n```ts\nconst html = parseMarkdown(entry.data.body)\n// → '<h1>Hello</h1><p>World</p>'\n```\n\n### `parseText(text)`\n\nSplits a plain `text` field into paragraphs (split on `\\n\\n`). Returns `string[]`. Useful when you want to render paragraphs manually without dangerouslySetInnerHTML.\n\n```ts\nconst paragraphs = parseText(entry.data.excerpt)\n// → ['First paragraph.', 'Second paragraph.']\n```\n\n---\n\n## Relations\n\n```ts\nimport { resolveRelation, resolveRelations } from '@airdraft/content'\n```\n\n### `resolveRelation(fieldName, data)`\n\nResolves the display label for a single `relation` field. Handles both expanded entry objects (returned when `expand=true`) and raw slug strings.\n\nLabel priority: `name` → `title` → `label` → `slug`.\n\n```ts\nconst label = resolveRelation('author', entry.data)\n// → 'Jane Doe' | 'jane-doe' | null\n```\n\n### `resolveRelations(fieldName, data)`\n\nSame as `resolveRelation` but for `relations` (multi-relation) fields. Returns `string[]`.\n\n```ts\nconst labels = resolveRelations('authors', entry.data)\n// → ['Jane Doe', 'John Smith']\n```\n\n---\n\n## Notes\n\n- All functions are synchronous and have no side effects.\n- `resolveImageUrl` / `resolveMediaUrl` / `resolveMediaUrls` are used internally by `@airdraft/react-content` field components. Call them directly when you need the resolved value in logic rather than in JSX.\n- `parseMarkdown` uses `marked` under the hood. To customise rendering (syntax highlighting, custom link targets, etc.) use the `render` prop on `<BodyField>` from `@airdraft/react-content` instead.\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md).\n","readmeFilename":"README.md"}