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

@kreatifklub/directus-extension-custom-link-json-interface

v1.0.7

Published

Directus interface extension for structured internal/external links in JSON fields

Readme

Directus Custom Link JSON Interface

Directus interface extension for json fields that manages repeatable link objects with:

  • Internal or external link type
  • Internal custom path or dynamic collection-based URL (id + slug)
  • External custom URL
  • Target (_self / _blank)
  • Title
  • Multiple rel values
  • Custom query parameters
  • URL and required-field validation

Compatibility

  • Directus 11.17.2 and newer within major 11 (^11.17.2)

Install

npm install
npm run build

Copy this extension folder into your Directus extensions directory (folder name should start with directus-extension-), then restart Directus.

Field Setup

  1. Create a field with type JSON.
  2. Choose interface Custom Link (JSON).
  3. Configure interface options:
  • Allowed Internal Collections
  • Selectable rel Values
  • Optional limits/defaults (Max Links, Default Target, etc.)

Global Settings (Singleton)

For centralized defaults across many fields:

  1. Create a singleton collection (for example link_interface_settings).
  2. Add fields with the exact keys below:
  • maxLinks
  • itemFetchLimit
  • requireTitle
  • requireHref
  • defaultTarget
  • defaultInternalPathTemplate
  • internalCollections (JSON)
  • externalCollections (JSON)
  • relChoices (JSON)
  1. In each field interface config:
  • Enable Use Global Settings
  • Set Global Settings Collection
  • Keep Override Global For This Field disabled to use global values
  • Enable Override Global For This Field when a specific field needs custom behavior

Stored JSON Shape

The field stores an array of link objects:

[
  {
    "type": "internal",
    "title": "Product Detail",
    "target": "_self",
    "rel": ["nofollow"],
    "queryParams": [
      { "key": "ref", "value": "homepage" }
    ],
    "internal": {
      "mode": "dynamic",
      "customPath": "",
      "collection": "products",
      "itemId": "42",
      "slugField": "handle",
      "slugValue": "air-conditioner",
      "titleValue": "Air Conditioner",
      "pathTemplate": "/{collection}/{id}/{slug}"
    },
    "href": "/products/42/air-conditioner?ref=homepage",
    "errors": []
  }
]

Notes

  • href is resolved by the interface for preview and output convenience.
  • errors contains current validation errors for each link entry.
  • Output includes only the active link branch (internal for internal links, external for external links).
  • Dynamic internal links default to handle and support slug (fallback), or any custom field via slugField.
  • External links are URL-only (for example https://google.com) and do not use collection item selection.
  • If you prefer to persist only selected properties, adapt toLinkValue() in src/interface.vue.