npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@koehler8/cms-ext-compliance

v1.0.0-beta.4

Published

Compliance extension for Vertex CMS — Cookie, Terms, and Privacy policy pages

Readme

Compliance Extension

First-party bundle that keeps the legal surfaces (cookies, terms of service, and privacy policy) out of the core component registry. Sites can mount these documents wherever needed without copying the SFCs or duplicating schema logic.

Quick Start

  • Add the components to a page with the object syntax so the loader can resolve the extension:
    "components": [
      "Header",
      { "name": "Terms", "source": "compliance" },
      { "name": "Cookies", "source": "compliance" },
      { "name": "Privacy", "source": "compliance" },
      "Footer"
    ]
  • Each component reads its content block from the matching config key (terms, cookies, privacy). Define those fields under pages.<page>.content or shared.content in your site JSON.

Component Catalog

| Component | Location | Config Key | Allowed Pages | Notes | |-----------|----------|------------|---------------|-------| | Terms | extensions/compliance/components/Terms.vue | terms | terms | Renders rich-text body copy for the Terms of Service route. Supports HTML/markdown mixed content plus optional metadata (headings, updated date) defined inside the config block. | | Cookies | extensions/compliance/components/Cookies.vue | cookies | cookies | Cookie policy surface with sections, ordered lists, and callouts. Reads the cookieConsent helpers so buttons stay in sync with CookieConsent.vue. | | Privacy | extensions/compliance/components/Privacy.vue | privacy | privacy | Privacy policy layout with title, intro, and repeating section groups. Mirrored across locales by defining per-locale overrides for privacy. |

Tip: The manifest already maps each component to the config key above, so you only need to supply configKey in page configs when you want the component to pull data from an alternate field.

Content Expectations

  • Store legal copy under the matching config key:
    {
      "pages": {
        "privacy": {
          "components": ["Header", { "name": "Privacy", "source": "compliance" }, "Footer"]
        }
      },
      "shared": {
        "content": {
          "privacy": {
            "title": "Privacy Policy",
            "subtitle": "Updated January 2025",
            "sections": [
              { "heading": "Data We Collect", "body": "<p>...</p>" }
            ]
          }
        }
      }
    }
  • Sections accept HTML strings and simple arrays (bullets, listItems) so CMS tooling can render rich copy without new Vue components.
  • Route metadata (pages.privacy.meta.title, etc.) still lives beside the page definition just like any core component page.

Localization

  • Follow the normal locale override pattern described in docs/configuration.md. For example, sites/<token>/config/<token>-es.json can override just the privacy block for /es/privacy while inheriting the base English copy for any undefined fields.
  • Because legal copy often changes per market, keep locale files scoped to the page-level content to avoid accidental overwrites across sites.

Related References

  • Manifest schema and validation rules: docs/extensions.md
  • Site configuration fundamentals: docs/configuration.md
  • Routing behaviour for /privacy, /terms, /cookies: docs/architecture.md

Contributing

See CONTRIBUTING.md for guidelines.

License

MIT