SveltyCMS icon indicating copy to clipboard operation
SveltyCMS copied to clipboard

Designing a Ultimate Token System for SveltyCMS

Open Rar9 opened this issue 3 months ago • 6 comments

As a Content Editor, I want to insert dynamic, contextual data into input fields using a simple UI, so that I can create consistent, SEO-friendly content (like URL slugs and meta titles) without manual effort.

As a Developer, I want a secure, extensible, and permission-aware token system, so that I can provide powerful features to editors while maintaining system stability and security. This is a phased plan to build a robust and scalable token system.

Foundational Engine (The Core Services)

##​ Define Core Types: Create the TypeScript definitions that will power the system. This includes the enhanced TokenDefinition and a new ModifierDefinition (details in the next section).

##​ Implement the Token Service: Build the central replaceTokens(template, context) service. It will use regex to find {{...}} placeholders and a helper to access nested data. At this stage, it will just handle direct replacement.

Implement the Dynamic Token Registry:

Build the getAvailableTokens(schema, user, config) service. This is the brain that discovers tokens by introspecting: ​Collection schemas (entry.) ​Collection settings (collection.) ​Public config (site.) ​User data (user.) and system globals (now).

The User Experience (UI & Integration)

##​ Build the <TokenSelector /> Component: Create the Svelte component with fuzzy search, collapsible groups, and a rich display for each token's name, description, and the token string itself.

##​ Initial Widget Integration: Enhance the Input widget with a token: boolean option in its Params. When true, display a trigger button that opens the <TokenSelector />.

​Permissions Integration:

Refactor the TokenRegistry to perform the user role permission check against the field's permissions object, filtering the token list accordingly.

Advanced Functionality (Modifiers & Power Features)

##​ Implement the Modifier Engine: Upgrade the TokenService to parse for the | pipe character. Create a library of modifier functions that can be dynamically called.

​Build Initial Modifier Library:

​Text:

upper, lower, capitalize, truncate(length), slugify

​Date:

date(format) (using a library like date-fns)

​Logical: default('fallback value')

​Implement Slug Feature:

Create or enhance a Slug widget that takes a pattern in its configuration. The widget's Svelte component will use the TokenService to reactively update its value when the source fields (like the title) change.

Expansion (Scalability & Extensibility)

Implement Advanced Modifiers:

​Image Manipulation:

Create an image_style('style_name') modifier. The token would provide an image ID/path, and the modifier would call a backend service to return a URL for a transformed image (e.g., thumbnail, banner). This leverages your MEDIASERVER_URL config.

​Relational Data: Implement a related('field_name') modifier. This would allow chaining, like {{entry.author_id | related('name')}} to fetch and display the author's name from a related collection.

​Developer API:

Enhance WidgetFunction type to allow custom widgets to register their own tokens and modifiers, making the system truly extensible.

​Performance Optimization:

For very large sites, implement caching for the getAvailableTokens function. The list of tokens for a specific collection and user role is static, so it can be cached to improve UI performance.

Rar9 avatar Sep 26 '25 05:09 Rar9

Proposal: Scalable, Secure, and Editor-Friendly Token System

I propose a robust and extensible token system that empowers content editors to insert dynamic, contextual data directly into input fields — while giving developers full control over security, scalability, and system behavior. This solution will create a seamless bridge between editor usability and developer governance, ensuring that the system remains consistent, secure, and adaptable as your platform grows.

Phase 1 — Foundational Engine (Core Infrastructure) Objective

Lay the technical foundation with clean architecture, strong typing, and secure data handling.

Approach

Define Core Types: Establish a consistent model for tokens and modifiers that can evolve without breaking changes.

Token Service: Build the central replaceTokens() engine that parses and replaces tokens dynamically using a robust template parsing mechanism.

Dynamic Token Registry: Implement a discovery service that introspects the CMS schema, user data, and configuration to dynamically expose tokens like:

entry. → current collection fields

collection. → collection metadata

site. → global config

user. → logged-in user context

now. → current date/time

Outcome

A solid, modular service that other parts of the CMS can build upon — ensuring all token replacements are consistent and secure across the entire platform.

Phase 2 — User Experience (UI & Integration) Objective

Empower editors with a simple, intuitive interface to discover and insert tokens effortlessly.

Approach

Token Picker Component (Svelte):

Fuzzy search and grouping by context (Entry, Site, User, System).

Clear visual display of token syntax and descriptions.

One-click insertion into any supported input field.

Widget Integration:

Enhance the Input and Slug widgets with a toggle (token: true) to enable token insertion.

Real-time preview showing how tokens resolve.

Permission Awareness:

Integrate user role checks directly into the Token Registry to ensure editors see only the tokens they are allowed to use.

Outcome

A polished, editor-friendly UI that simplifies complex dynamic content creation — minimizing manual errors and ensuring SEO consistency.

Phase 3 — Advanced Functionality (Modifiers & Power Features) Objective

Expand the token engine to handle transformations, relationships, and advanced logic through a modular modifier system.

Approach

Modifier Engine:

Introduce support for the | pipe syntax ({{entry.title | slugify}}).

Create a starter library of common modifiers:

Text: upper, lower, capitalize, truncate, slugify

Date: date(format) using a reliable date library

Logic: default('fallback value')

Slug Feature:

Build or enhance a reactive Slug widget that automatically updates based on linked fields (e.g., title).

Image and Relational Modifiers (Expansion Phase):

image_style('thumbnail') → Generates processed URLs via the media server.

related('author') → Dynamically fetches related data for display.

Outcome

A powerful and flexible engine that transforms simple placeholders into intelligent, automated, and SEO-optimized content — without developers hardcoding every pattern.

Phase 4 — Scalability & Extensibility Objective

Ensure long-term maintainability and developer empowerment.

Approach

Developer API: Allow custom widgets and modules to register their own tokens and modifiers.

Performance Optimization: Cache token lists per collection and user role to improve UI speed.

Security & Stability: Sandbox modifier execution and enforce strict permission validation before exposing tokens.

Outcome

A future-proof foundation that can support thousands of entries, multiple user roles, and custom integrations — without sacrificing speed or security.

Why Choose Me

I focus on building systems that balance UX, performance, and developer trust. With a deep understanding of both frontend architecture (Svelte, reactive design) and backend service patterns (TypeScript, role-based APIs, schema-driven discovery), I can lead this token system from concept to production with clean documentation, modular design, and clear integration paths for future expansion.

You’ll get:

A scalable, standards-compliant codebase

A clean UI experience for editors

A maintainable, secure engine for developers

And a system that naturally aligns with your SEO and automation goals

cristiano19960305 avatar Nov 07 '25 02:11 cristiano19960305

Hi

greenhub7 avatar Nov 07 '25 08:11 greenhub7

nice to meet you

On Fri, Nov 7, 2025 at 9:42 AM Diamond @.***> wrote:

greenhub7 left a comment (SveltyCMS/SveltyCMS#276) https://github.com/SveltyCMS/SveltyCMS/issues/276#issuecomment-3501323666

Hi

— Reply to this email directly, view it on GitHub https://github.com/SveltyCMS/SveltyCMS/issues/276#issuecomment-3501323666, or unsubscribe https://github.com/notifications/unsubscribe-auth/BOMPLZ7JGLPGVX4IBSC455T33RLP5AVCNFSM6AAAAACHRXE7D2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTKMBRGMZDGNRWGY . You are receiving this because you commented.Message ID: @.***>

eaglecodes1996 avatar Nov 11 '25 15:11 eaglecodes1996

Nice to meet you too who are you?

greenhub7 avatar Nov 11 '25 19:11 greenhub7

Where are you from? how is it going?

greenhub7 avatar Nov 12 '25 05:11 greenhub7

I'm doing good and you?

On Wed, Nov 12, 2025 at 6:43 AM Diamond @.***> wrote:

greenhub7 left a comment (SveltyCMS/SveltyCMS#276) https://github.com/SveltyCMS/SveltyCMS/issues/276#issuecomment-3520122943

Where are you from? how is it going?

— Reply to this email directly, view it on GitHub https://github.com/SveltyCMS/SveltyCMS/issues/276#issuecomment-3520122943, or unsubscribe https://github.com/notifications/unsubscribe-auth/BOMPLZZEBR6QNCT3TJI7WXT34LCJXAVCNFSM6AAAAACHRXE7D2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTKMRQGEZDEOJUGM . You are receiving this because you commented.Message ID: @.***>

eaglecodes1996 avatar Nov 12 '25 05:11 eaglecodes1996