{"_id":"@bigin-io/renderer-core","_rev":"2-5d051224a63019a60bb577767a6a1dff","name":"@bigin-io/renderer-core","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@bigin-io/renderer-core","version":"1.0.0","license":"UNLICENSED","_id":"@bigin-io/renderer-core@1.0.0","maintainers":[{"name":"maichitam","email":"tammai.it@gmail.com"},{"name":"tammai.bigin","email":"tam.mai@bigin.vn"}],"homepage":"https://github.com/bigin-io/ssg-site-factory#readme","bugs":{"url":"https://github.com/bigin-io/ssg-site-factory/issues"},"dist":{"shasum":"e0d67fa4344c09b05cee5722db0887b1c339cb68","tarball":"https://registry.npmjs.org/@bigin-io/renderer-core/-/renderer-core-1.0.0.tgz","fileCount":334,"integrity":"sha512-kKMROln4dPbnyOUmOFL3SryHPnaUJixdmJQqf5Y1itPtOJjd68+T08kAv/jNEVUuwPUURs8mP6utgv1f5wCyFw==","signatures":[{"sig":"MEUCIQDNZncb9st1KVmeshFkVIqriVo6aKnzUzErBo2R1HiA3AIgJmWF5NAL1l9Spr0doJpNBRXh1mkdJe0ehulwLaqg+34=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":565194},"main":"./dist/index.js","type":"module","_from":"file:C:/Users/Admin/AppData/Local/Temp/sf-publish/bigin-io-renderer-core-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./seo":{"types":"./dist/seo/index.d.ts","default":"./dist/seo/index.js"},"./i18n":{"types":"./dist/i18n/index.d.ts","default":"./dist/i18n/index.js"},"./node":{"types":"./dist/node/index.d.ts","default":"./dist/node/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","default":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","default":"./dist/icons/index.js"},"./media":{"types":"./dist/media/index.d.ts","default":"./dist/media/index.js"},"./pages":{"types":"./dist/pages/index.d.ts","default":"./dist/pages/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","default":"./dist/theme/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./images":{"types":"./dist/images/index.d.ts","default":"./dist/images/index.js"},"./policy":{"types":"./dist/policy/index.d.ts","default":"./dist/policy/index.js"},"./search":{"types":"./dist/search/index.d.ts","default":"./dist/search/index.js"},"./content":{"types":"./dist/content/index.d.ts","default":"./dist/content/index.js"},"./markdown":{"types":"./dist/markdown/index.d.ts","default":"./dist/markdown/index.js"},"./sections":{"types":"./dist/sections/index.d.ts","default":"./dist/sections/index.js"},"./analytics":{"types":"./dist/analytics/index.d.ts","default":"./dist/analytics/index.js"},"./migration":{"types":"./dist/migration/index.d.ts","default":"./dist/migration/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"maichitam","email":"tammai.it@gmail.com"},"_resolved":"C:\\Users\\Admin\\AppData\\Local\\Temp\\sf-publish\\bigin-io-renderer-core-1.0.0.tgz","_integrity":"sha512-kKMROln4dPbnyOUmOFL3SryHPnaUJixdmJQqf5Y1itPtOJjd68+T08kAv/jNEVUuwPUURs8mP6utgv1f5wCyFw==","repository":{"url":"git+https://github.com/bigin-io/ssg-site-factory.git","type":"git","directory":"packages/renderer-core"},"_npmVersion":"11.2.0","description":"The framework-agnostic half of both renderers: theme derivation, section chrome, SEO, i18n routes, the image-variant planner, media transform URLs, markdown, icons, and the form/analytics/search mounts","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"yaml":"^2.9.0","sharp":"^0.35.4","micromark":"^4.0.2","@iconify-json/lucide":"1.2.127","@bigin-io/site-worker":"^1.0.0","@bigin-io/site-contract":"^1.0.0","micromark-extension-gfm":"^3.0.0","@fontsource/ibm-plex-mono":"5.3.0","@fontsource-variable/fraunces":"5.3.0","@fontsource-variable/google-sans-flex":"5.3.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","axe-core":"^4.13.0","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/renderer-core_1.0.0_1788517245524_0.673194277092773","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bigin-io/renderer-core","version":"1.0.1","description":"The framework-agnostic half of both renderers: theme derivation, section chrome, SEO, i18n routes, the image-variant planner, media transform URLs, markdown, icons, and the form/analytics/search mounts","license":"UNLICENSED","type":"module","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/bigin-io/ssg-site-factory.git","directory":"packages/renderer-core"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./analytics":{"types":"./dist/analytics/index.d.ts","default":"./dist/analytics/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./content":{"types":"./dist/content/index.d.ts","default":"./dist/content/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","default":"./dist/forms/index.js"},"./i18n":{"types":"./dist/i18n/index.d.ts","default":"./dist/i18n/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","default":"./dist/icons/index.js"},"./images":{"types":"./dist/images/index.d.ts","default":"./dist/images/index.js"},"./markdown":{"types":"./dist/markdown/index.d.ts","default":"./dist/markdown/index.js"},"./media":{"types":"./dist/media/index.d.ts","default":"./dist/media/index.js"},"./migration":{"types":"./dist/migration/index.d.ts","default":"./dist/migration/index.js"},"./pages":{"types":"./dist/pages/index.d.ts","default":"./dist/pages/index.js"},"./policy":{"types":"./dist/policy/index.d.ts","default":"./dist/policy/index.js"},"./search":{"types":"./dist/search/index.d.ts","default":"./dist/search/index.js"},"./sections":{"types":"./dist/sections/index.d.ts","default":"./dist/sections/index.js"},"./seo":{"types":"./dist/seo/index.d.ts","default":"./dist/seo/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","default":"./dist/theme/index.js"},"./node":{"types":"./dist/node/index.d.ts","default":"./dist/node/index.js"},"./package.json":"./package.json"},"dependencies":{"@fontsource-variable/fraunces":"5.3.0","@fontsource-variable/google-sans-flex":"5.3.1","@fontsource/ibm-plex-mono":"5.3.0","@iconify-json/lucide":"1.2.127","micromark":"^4.0.2","micromark-extension-gfm":"^3.0.0","sharp":"^0.35.4","yaml":"^2.9.0","@bigin-io/site-worker":"^1.0.1","@bigin-io/site-contract":"^1.0.1"},"devDependencies":{"@types/jsdom":"^30.0.0","axe-core":"^4.13.0","jsdom":"^30.0.1"},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""},"_id":"@bigin-io/renderer-core@1.0.1","bugs":{"url":"https://github.com/bigin-io/ssg-site-factory/issues"},"homepage":"https://github.com/bigin-io/ssg-site-factory#readme","_integrity":"sha512-DOJyGzM0PpqBNriY8evI+5tFEsX71+wy4wFmeE3X0gtG3hhCJzqhkSFFQ/ZBsXiY+55dVmpcMlJKqsgriHsV0Q==","_resolved":"C:\\Users\\Admin\\AppData\\Local\\Temp\\sf-publish\\bigin-io-renderer-core-1.0.1.tgz","_from":"file:C:/Users/Admin/AppData/Local/Temp/sf-publish/bigin-io-renderer-core-1.0.1.tgz","_nodeVersion":"22.14.0","_npmVersion":"11.2.0","dist":{"integrity":"sha512-DOJyGzM0PpqBNriY8evI+5tFEsX71+wy4wFmeE3X0gtG3hhCJzqhkSFFQ/ZBsXiY+55dVmpcMlJKqsgriHsV0Q==","shasum":"b06c3bfec5696cc87a41051cc91265a75e0085b3","tarball":"https://registry.npmjs.org/@bigin-io/renderer-core/-/renderer-core-1.0.1.tgz","fileCount":334,"unpackedSize":565194,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDlIVUxwQ/kMgy8i9cFAVnfYqDohAjzkMqRjEU+uReRuAiAwaL/3Y+Q9XH83U2/LkPGM5b8/Mi0xLqQTaTWn4vySEA=="}]},"_npmUser":{"name":"maichitam","email":"tammai.it@gmail.com"},"directories":{},"maintainers":[{"name":"maichitam","email":"tammai.it@gmail.com"},{"name":"tammai.bigin","email":"tam.mai@bigin.vn"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/renderer-core_1.0.1_1788517745877_0.3903761355145763"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-04T10:20:45.389Z","modified":"2026-09-04T10:29:06.207Z","1.0.0":"2026-09-04T10:20:45.720Z","1.0.1":"2026-09-04T10:29:06.020Z"},"bugs":{"url":"https://github.com/bigin-io/ssg-site-factory/issues"},"license":"UNLICENSED","homepage":"https://github.com/bigin-io/ssg-site-factory#readme","repository":{"type":"git","url":"git+https://github.com/bigin-io/ssg-site-factory.git","directory":"packages/renderer-core"},"description":"The framework-agnostic half of both renderers: theme derivation, section chrome, SEO, i18n routes, the image-variant planner, media transform URLs, markdown, icons, and the form/analytics/search mounts","maintainers":[{"name":"maichitam","email":"tammai.it@gmail.com"},{"name":"tammai.bigin","email":"tam.mai@bigin.vn"}],"readme":"# `@bigin-io/renderer-core`\n\nThe rendering half of the renderer. `@bigin-io/renderer-nuxt` is the *binding*\nhalf — the framework-facing layer over this package plus\n`@bigin-io/site-contract` (ADR-1, ADR-13, ADR-13a).\n\n**Story 7.0a withdrew the second renderer.** `@bigin-io/renderer-next` was the\nother binding half and its last release is `0.7.0`, which stays installable;\n`site.config`'s `renderer` field now has one legal value. This package keeps its\nboundary for two reasons that do not depend on a second renderer:\n`@bigin-io/site-tools` consumes it, and the rule ADR-13a actually states is that\na module belongs here when it neither imports **nor structurally describes** a\nframework — which is a property of the module, not a headcount of consumers.\n\nExtracted from `renderer-nuxt` in story 1.11: **58 of its 70 modules and 5,461\nof its 7,223 lines**. The twelve that stayed are almost entirely `@nuxt/kit`\nwiring — which is why this package is named for what it is rather than as a\ntoolkit.\n\n## The rule for what belongs here\n\n> **Is this rendering, or is this framework binding?**\n\nThat question decides the package, and it is the primary test. Import-purity is\nnecessary and *not sufficient*: `setup.ts` imports nothing framework-shaped and\nis nevertheless the Nuxt module's body, described structurally instead of\nimported. Module-level is not sufficient either: a module can be rendering and\nstill carry one export that is binding.\n\nA question cannot run in CI, so two guards enforce it — see\n`test/boundary.test.ts`:\n\n1. **Structural, both ways.** No module here may name a framework token\n   (`@nuxt/`, `addTemplate`, `#site-factory/`, `.vue`, `:locale`, …). And every\n   module in `renderer-nuxt/src` *must* name one, or sit on a two-entry\n   exemption table with a written reason — because a module that could have\n   moved and did not is a boundary decided by inertia.\n2. **Literal.** No module here may contain `/_nuxt`, `/_next`, `__nuxt`,\n   `__next`, `.vue` or a `:locale` route segment.\n\nWhen the guards and the question disagree, **the question wins and the guard\nwidens**. That has already happened once: the literal rule's first draft flagged\n`og:locale` in `seo/meta.ts`, which is an Open Graph property and plainly\nrendering. The fix was a tighter pattern, not an exemption — exempting the file\nwould have taught the guard the wrong thing and blinded it to a real `:locale`\nnext door.\n\n## Entry points\n\n`.` is `paths`; the rest mirror the areas: `/analytics`, `/config`, `/content`,\n`/forms`, `/i18n`, `/icons`, `/images`, `/markdown`, `/media`, `/migration`,\n`/pages`, `/search`, `/sections`, `/seo`, `/theme`.\n\n### `/node` is separate on purpose\n\n`sharp` is Node-only, and the other entries are reachable from a browser graph\nthrough the section components. A value import that dragged it in would ship a\nnative image encoder to a visitor — the same failure as 4.5a's `API_PREFIX`,\nwhere one value import cost 83.9 KB raw of Zod and the Turnstile verifier in a\nbrowser bundle, one package boundary down.\n\nSo the filesystem, `sharp` and the build-time emitters live behind\n`@bigin-io/renderer-core/node`, and a test walks the real transitive import\ngraph of every other entry to prove the package does not appear. It is not left\nto a bundler's tree-shaking.\n\n**`satori` was the other one, and it is gone (story 7.0b).** It was an optional\npeer, deferred behind a dynamic import, because `canGenerateOgImages()` required\na heading face whose format is not `woff2` and all three design presets declare\n`woff2` only — so no site could ever draw an OG card. The generator is withdrawn\nrather than fixed. `sharp` stays and is a real dependency: ADR-12's build-time\nimage pipeline applies to both tiers and never had anything to do with cards.\n\n## What a renderer must supply\n\nThree things this package deliberately refuses to know, because each one names a\nframework and each fails differently when shared:\n\n| Supplied by the renderer | Used by | What happens if the kit held it |\n| --- | --- | --- |\n| `RendererIdentity` (`renderer`, `packageName`, `siblingPackageName`) | `loadSiteConfig` | Every Next build rejects a correct `renderer: 'next'` config and tells the author to install Nuxt |\n| The internal-path list (`/_nuxt/`, `__nuxt_content`) | `isPageRoute` | Next's build assets reach `sitemap.xml` and get OG cards drawn for them |\n| The build-asset globs (`/_nuxt/*`) | `renderHeadersFile`, `headerRules` | A Next site caches a directory it does not have and never caches `/_next/static/*`, which is content-hashed — invisibly, forever, with nothing failing |\n\nThe third is the one worth remembering: both sites serve correct bytes, so no\ntest, gate or parity check catches it. It was found by a guard, not by review.\n\n## Fonts and icons\n\nThe bundled families and the Lucide collection are dependencies **here**, not of\na renderer, because bundling them is rendering: both renderers must ship the\nidentical bytes for parity (NFR-7, story 1.10). A Next site gets Google Sans\nFlex, Fraunces, IBM Plex Mono and Lucide without asking, with the `vietnamese`\nsubset included and no third-party request on any page.\n","readmeFilename":"README.md"}