cms

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 22, 2025 License: MIT Imports: 13 Imported by: 6

README

go-cms

go-cms is a modular, headless CMS toolkit for Go. It bundles reusable services for content, pages, blocks, widgets, menus, localization, and static generation so you can embed editorial workflows in any Go application.

Table of Contents

Features

  • Composable services: opt into content, page, widget, or menu modules independently.
  • Storage flexibility: switch between "in memory" or Bun backed SQL repositories without touching application code.
  • Localization first: every entity carries locale-aware translations and fallbacks.
  • Authoring experience: versioning, scheduling, visibility rules, and reusable blocks keep editors productive.
  • Static publishing: generate locale-aware static bundles or wire services into a dynamic site.
  • Observability hooks: structured logging interfaces and command callbacks integrate with existing telemetry.

Installation

go get github.com/goliatone/go-cms

Quick Start

package main

import (
	"context"

	"github.com/goliatone/go-cms"
	"github.com/goliatone/go-cms/internal/content"
	"github.com/goliatone/go-cms/internal/di"
	"github.com/goliatone/go-cms/internal/pages"
	"github.com/google/uuid"
)

func main() {
	ctx := context.Background()

	cfg := cms.DefaultConfig()
	cfg.DefaultLocale = "en"
	cfg.I18N.Locales = []string{"en", "es"}

	container := di.NewContainer(cfg)
	contentSvc := container.ContentService()
	pageSvc := container.PageService()

	authorID := uuid.New()
	articleType, err := contentSvc.CreateContentType(ctx, content.CreateContentTypeRequest{
		Name: "Article",
		Slug: "article",
		Schema: map[string]any{
			"fields": []map[string]any{
				{"name": "title", "type": "string", "required": true},
				{"name": "body", "type": "text", "required": true},
			},
		},
		CreatedBy: authorID,
		UpdatedBy: authorID,
	})
	if err != nil {
		panic(err)
	}

	article, err := contentSvc.Create(ctx, content.CreateContentRequest{
		ContentTypeID: articleType.ID,
		Slug:          "hello-world",
		Status:        "published",
		CreatedBy:     authorID,
		UpdatedBy:     authorID,
		Translations: []content.ContentTranslationInput{
			{
				Locale:  "en",
				Title:   "Hello World",
				Content: map[string]any{"body": "Content goes here"},
			},
		},
	})
	if err != nil {
		panic(err)
	}

	_, err = pageSvc.Create(ctx, pages.CreatePageRequest{
		ContentID:  article.ID,
		Slug:       "hello-world",
		Status:     "published",
		CreatedBy:  authorID,
		UpdatedBy:  authorID,
		Translations: []pages.PageTranslationInput{
			{Locale: "en", Title: "Hello World", Path: "/hello-world"},
		},
	})
	if err != nil {
		panic(err)
	}
}

See cmd/example/main.go for a more complete walkthrough.

Core Concepts

Content Types & Content

Define schemas that describe editorial data. Content records reference a type and store localized payloads.

contentType, _ := contentSvc.CreateContentType(ctx, content.CreateContentTypeRequest{
	Name: "Article",
	Slug: "article",
	Schema: map[string]any{
		"fields": []map[string]any{
			{"name": "title", "type": "string", "required": true},
			{"name": "body", "type": "text", "required": true},
			{"name": "tags", "type": "array"},
		},
	},
	CreatedBy: authorID,
	UpdatedBy: authorID,
})
Pages

Pages form the site map. They link to content, choose templates, and emit locale-aware routes with SEO metadata.

page, _ := pageSvc.Create(ctx, pages.CreatePageRequest{
	ContentID:  article.ID,
	TemplateID: articleTemplateID,
	Slug:       "getting-started",
	Status:     "published",
	ParentID:   &docsPageID,
	CreatedBy:  authorID,
	UpdatedBy:  authorID,
	Translations: []pages.PageTranslationInput{
		{
			Locale: "en",
			Title:  "Getting Started",
			Path:   "/docs/getting-started",
			MetaDescription: "Learn how to get started",
		},
	},
})
Blocks

Blocks are reusable fragments that can be attached to pages or content regions with translations.

definition, _ := blockSvc.RegisterDefinition(ctx, blocks.RegisterDefinitionInput{
	Name: "call_to_action",
	Schema: map[string]any{
		"fields": []string{"headline", "description", "button_text", "button_url"},
	},
})

instance, _ := blockSvc.CreateInstance(ctx, blocks.CreateInstanceInput{
	DefinitionID: definition.ID,
	PageID:       &page.ID,
	Region:       "main",
	Position:     1,
	CreatedBy:    authorID,
	UpdatedBy:    authorID,
})
Widgets

Widgets add behavioral components with scheduling, visibility rules, and per-area placement.

widgetSvc.RegisterAreaDefinition(ctx, widgets.RegisterAreaDefinitionInput{
	Code:  "sidebar.primary",
	Name:  "Primary Sidebar",
	Scope: widgets.AreaScopeGlobal,
})

widget, _ := widgetSvc.CreateInstance(ctx, widgets.CreateInstanceInput{
	DefinitionID: newsletterWidgetDefID,
	Configuration: map[string]any{
		"headline": "Stay Updated",
	},
	VisibilityRules: map[string]any{
		"audience": []string{"guest"},
	},
	CreatedBy: authorID,
	UpdatedBy: authorID,
})

widgetSvc.AssignWidgetToArea(ctx, widgets.AssignWidgetToAreaInput{
	AreaCode:   "sidebar.primary",
	InstanceID: widget.ID,
})

Enable built-in definitions and version retention through configuration:

cfg := cms.DefaultConfig()
cfg.Features.Widgets = true
cfg.Widgets.Definitions = []cms.WidgetDefinitionConfig{
	{
		Name: "promo_banner",
		Schema: map[string]any{
			"fields": []any{
				map[string]any{"name": "headline"},
				map[string]any{"name": "cta_text"},
			},
		},
		Defaults: map[string]any{"cta_text": "Sign up"},
		Category: "marketing",
	},
}
cfg.Features.Versioning = true
cfg.Retention = cms.RetentionConfig{Content: 5, Pages: 3, Blocks: 2}
Menus

Menus generate navigation trees with locale-aware labels and URL resolution.

menu, _ := menuSvc.CreateMenu(ctx, menus.CreateMenuInput{
	Code:      "primary",
	CreatedBy: authorID,
	UpdatedBy: authorID,
})

menuSvc.AddMenuItem(ctx, menus.AddMenuItemInput{
	MenuID:   menu.ID,
	Position: 0,
	Target: map[string]any{
		"type": "page",
		"slug": "about",
	},
	Translations: []menus.MenuItemTranslationInput{
		{Locale: "en", Label: "About Us"},
		{Locale: "es", Label: "Acerca de"},
	},
})
Localization Helpers

Locales, translations, and fallbacks are available across services. cfg.I18N.Locales drives validation, and helpers such as generator.TemplateContext.Helpers.WithBaseURL simplify template routing. Use cfg.I18N.RequireTranslations (defaults to true) to keep the legacy “at least one translation” guard, or flip it to false for staged rollouts; pair it with cfg.I18N.DefaultLocaleRequired when you need to relax the fallback-locale constraint. Both flags are ignored when cfg.I18N.Enabled is false. Every create/update DTO exposes AllowMissingTranslations so workflow transitions or importers can bypass enforcement for a single operation while global defaults remain strict.

Static Site Generation

The generator composes CMS services to emit pre-rendered HTML, assets, and sitemaps. It honours locale routing, draft visibility, and storage abstractions so you can stream output to disk, S3-compatible buckets, or custom storage backends.

Programmatic usage requires github.com/goliatone/go-cms/internal/generator.

cfg := cms.DefaultConfig()
cfg.Generator.Enabled = true
cfg.Generator.OutputDir = "./dist"
cfg.Generator.BaseURL = "https://example.com"
cfg.Generator.Incremental = true
cfg.Generator.CopyAssets = true

module, err := cms.New(cfg)
if err != nil {
	log.Fatal(err)
}

result, err := module.Generator().Build(context.Background(), generator.BuildOptions{})
if err != nil {
	log.Fatal(err)
}

log.Printf("built %d pages across %d locales", result.PagesBuilt, len(result.Locales))

Templates receive generator.TemplateContext with resolved dependencies:

{{ define "page" }}
<html lang="{{ .Page.Locale.Code }}">
  <head>
    <title>{{ .Page.Translation.Title }}</title>
  </head>
  <body>
    {{ range .Page.Blocks }}{{ template .TemplatePath . }}{{ end }}
    {{ range $code, $menu := .Page.Menus }}
      {{ template "menu" (dict "code" $code "nodes" $menu) }}
    {{ end }}
  </body>
</html>
{{ end }}

Troubleshooting tips:

  • static: static command handlers not configured — ensure bootstrap.Options.EnableCommands is true and the generator feature is enabled.
  • static: static sitemap handler not configured — enable Config.Generator.GenerateSitemap or provide --output / --base-url.
  • Missing telemetry — attach a ResultCallback that logs or forwards metrics.
  • Custom storage integration — set bootstrap.Options.Storage to an implementation of interfaces.StorageProvider.

Markdown Import & Sync

Opt into file-based content ingestion without committing to a full static workflow.

cfg := cms.DefaultConfig()
cfg.Features.Markdown = true
cfg.Markdown = cms.MarkdownConfig{
	Enabled:        true,
	ContentDir:     "./content",
	DefaultLocale:  "en",
	Locales:        []string{"en", "es"},
	LocalePatterns: map[string]string{"es": "es/**/*.md"},
	Pattern:        "**/*.md",
	Recursive:      true,
}

module, err := cms.New(cfg)
if err != nil {
	log.Fatal(err)
}

mdSvc := module.Markdown()

CLI helpers live under cmd/markdown:

# Import a single document without touching pages
go run ./cmd/markdown/import \
  --path ./content/en/about.md \
  --content-type $CONTENT_TYPE_ID \
  --author $AUTHOR_ID

# Sync a directory, updating content and optionally creating pages
go run ./cmd/markdown/sync \
  --dir ./content \
  --content-type $CONTENT_TYPE_ID \
  --author $AUTHOR_ID \
  --create-pages \
  --template $TEMPLATE_ID \
  --update-existing

examples/web/ shows how to wire the markdown service into startup and cron flows. The default adapter currently performs a delete-and-recreate for page updates; swap in an alternative once granular update hooks land in pages.Service.

Configuration

Most features are toggled on the shared configuration struct.

cfg := cms.DefaultConfig()

cfg.DefaultLocale = "en"
cfg.Content.PageHierarchy = true

cfg.I18N.Enabled = true
cfg.I18N.Locales = []string{"en", "es", "fr"}

cfg.Storage.Provider = "bun" // or "memory"

cfg.Cache.Enabled = true
cfg.Cache.DefaultTTL = time.Minute * 5

cfg.Features.Widgets = true

cfg.Navigation.RouteConfig = &urlkit.Config{...}
cfg.Navigation.URLKit.DefaultGroup = "frontend"
cfg.Navigation.URLKit.LocaleGroups = map[string]string{
	"es": "frontend.es",
}

cfg.Features.Shortcodes = true
cfg.Shortcodes.Enabled = true
cfg.Shortcodes.Cache.Enabled = true
cfg.Shortcodes.Cache.Provider = "shortcodes" // resolve via di.WithShortcodeCacheProvider
cfg.Markdown.ProcessShortcodes = true

Use di.WithShortcodeCacheProvider to register named cache implementations (Redis, in-memory) for shortcodes and di.WithShortcodeMetrics to feed render telemetry into your monitoring stack.

Managing Storage Profiles at Runtime

Manage storage profiles at runtime through the storage admin service; wire it into your own router or command stack without importing internal/ packages:

module, err := cms.New(cfg)
if err != nil {
	log.Fatal(err)
}

storageAdmin := module.StorageAdmin()

profiles, err := storageAdmin.ListProfiles(ctx)
if err != nil {
	log.Fatal(err)
}

preview, err := storageAdmin.PreviewProfile(ctx, storage.Profile{
	Name:     "rotated",
	Provider: "bun",
	Config: storage.Config{
		Name:   "rotated",
		Driver: "sqlite3",
		DSN:    "file:/var/lib/cms/rotated.sqlite?_fk=1",
	},
})
if err != nil {
	log.Fatalf("preview failed: %v", err)
}

log.Printf("provider supports reload=%v", preview.Capabilities.SupportsReload)

err = storageAdmin.ApplyConfig(ctx, cms.StorageConfig{
	Profiles: []storage.Profile{
		{
			Name:        "rotated",
			Provider:    "bun",
			Description: "Primary writer",
			Default:     true,
			Config: storage.Config{
				Name:   "rotated",
				Driver: "sqlite3",
				DSN:    "file:/var/lib/cms/rotated.sqlite?_fk=1",
			},
		},
	},
	Aliases: map[string]string{"content": "rotated"},
})
if err != nil {
	log.Fatalf("apply config failed: %v", err)
}
  • No routes or controllers ship with the module mount these helpers in your own go-router, chi, gRPC, or command stacks next to the rest of your admin UI.
  • Schemas() returns JSON schemas for profile/config payloads so UIs can validate forms client side.
  • Audit events (storage_profile_created/updated/deleted) and container logs (storage.profile_activated, storage.profile_activate_failed) provide the telemetry required for the dashboards referenced in TODO_TSK.md.
Workflow Engine Configuration

The workflow subsystem externalises lifecycle decisions so hosts can add review, translation, or bespoke approval steps without touching page services. Enable the default engine or register your own through configuration:

cfg.Workflow.Enabled = true            // enable lifecycle orchestration (default)
cfg.Workflow.Provider = "simple"       // use the built-in engine
cfg.Workflow.Definitions = []cms.WorkflowDefinitionConfig{
	{
		Entity: "page",
		States: []cms.WorkflowStateConfig{
			{Name: "draft", Initial: true},
			{Name: "review"},
			{Name: "translated"},
			{Name: "published", Terminal: true},
		},
		Transitions: []cms.WorkflowTransitionConfig{
			{Name: "submit_review", From: "draft", To: "review"},
			{Name: "translate", From: "review", To: "translated"},
			{Name: "publish", From: "translated", To: "published"},
		},
	},
}

When cfg.Workflow.Provider is set to custom, provide an interfaces.WorkflowEngine via di.WithWorkflowEngine during module construction. To pull definitions from storage, implement interfaces.WorkflowDefinitionStore and pass it to di.WithWorkflowDefinitionStore. Store provided definitions override configuration entries for matching entity types.

engine := myengine.New(customDeps...)
definitions := mystore.NewWorkflowDefinitionStore(db)

container := di.NewContainer(cfg,
	di.WithWorkflowEngine(engine),
	di.WithWorkflowDefinitionStore(definitions),
)

pageSvc := container.PageService()

For go-command/flow-powered state machines, wrap the external engine with the CMS adapter in internal/workflow/adapter to preserve DTOs, guard hooks, and action-generated events/notifications:

import (
	cmsadapter "github.com/goliatone/go-cms/internal/workflow/adapter"
)

flowEngine := buildFlowStateMachine() // engine exposing Transition/AvailableTransitions/RegisterWorkflow

workflowEngine, _ := cmsadapter.NewEngine(flowEngine,
	cmsadapter.WithAuthorizer(myAuthorizer{}), // evaluates guard strings on transitions
	cmsadapter.WithActionRegistry(cmsadapter.ActionRegistry{
		"page::publish": publishAction, // actions can emit events/notifications into TransitionResult
	}),
)

cfg.Workflow.Provider = "custom"
container := di.NewContainer(cfg,
	di.WithWorkflowEngine(workflowEngine),
)

Additional guides:

  • Observability & logging: docs/LOGGING_GUIDE.md
  • Static bootstrapper: cmd/static/internal/bootstrap
  • DI wiring options: internal/di/options.go

Architecture & Extensibility

internal/
├── content/     # Content entities and content types
├── pages/       # Page hierarchy and routing
├── blocks/      # Reusable content fragments
├── widgets/     # Dynamic behavioral components
├── menus/       # Navigation structures
├── i18n/        # Internationalization helpers
├── adapters/    # Integrations (storage, rendering)
└── di/          # Dependency injection container

pkg/
├── interfaces/  # Public abstractions
└── testsupport/ # Shared fixtures and helpers
  • Repository pattern — every module ships "in memory" and Bun backed repositories; the container picks based on cfg.Storage.Provider.
  • Dependency injectiondi.NewContainer wires services. Override dependencies with functional options:
container := di.NewContainer(cfg,
	di.WithBunDB(db),
	di.WithCache(cache, serializer),
	di.WithPageService(customPageSvc),
)
  • Commandscmd/static and cmd/markdown expose features through go-command handlers; register additional commands through the same container.
Database Migrations

When using BunDB as the storage provider, the CMS provides embedded SQL migrations to create all required tables. The migrations follow Bun's naming convention and are embedded in the library binary.

import (
	"context"
	"database/sql"

	"github.com/goliatone/go-cms"
	persistence "github.com/goliatone/go-persistence-bun"
	"github.com/uptrace/bun"
	"github.com/uptrace/bun/dialect/sqlitedialect"
	"github.com/uptrace/bun/driver/sqliteshim"
)

// Open database connection
db, err := sql.Open(sqliteshim.ShimName, "file:cms.db?cache=shared")
if err != nil {
	panic(err)
}

// Create Bun client with migrations
client, err := persistence.New(cfg.Persistence, db, sqlitedialect.New())
if err != nil {
	panic(err)
}

// Register CMS migrations
client.RegisterSQLMigrations(cms.GetMigrationsFS())

// Run migrations
if err := client.Migrate(context.Background()); err != nil {
	panic(err)
}

// Check migration status
if report := client.Report(); report != nil && !report.IsZero() {
	fmt.Printf("Applied migrations: %s\n", report.String())
}

The CMS includes migrations for all core tables:

  • Locales and content types
  • Contents with translations and versions
  • Themes and templates
  • Pages with translations and versions
  • Block definitions, instances, translations, and versions
  • Widget definitions, instances, translations, areas, and placements
  • Menus, menu items, and menu item translations

CLI Reference

# Static generator commands
go run ./cmd/static build   --output ./dist --locale en,es
go run ./cmd/static diff    --page <page-id> --locale en
go run ./cmd/static build   --assets
go run ./cmd/static sitemap

# Markdown import/sync
go run ./cmd/markdown import ...
go run ./cmd/markdown sync ...

# Example application
go run ./cmd/example
go run ./cmd/example shortcodes

Development

# Unit tests
go test ./...

# Package-specific tests
go test ./internal/content/...
go test ./internal/pages/...
go test ./internal/blocks/...
go test ./internal/widgets/...
go test ./internal/menus/...
go test ./internal/generator ./cms

# Coverage
./taskfile dev:cover

# Integration tests (require database)
go test -v ./internal/pages/... -run Integration

Verification

Run the workflow regression suite before shipping workflow changes. These commands exercise the externalized workflow engine (including generator integration) and require the full Go binary path provided in the task plan.

CMS_WORKFLOW_PROVIDER=custom \
CMS_WORKFLOW_ENGINE_ADDR=http://localhost:8080 \
go test ./internal/workflow/... ./internal/integration/...

Translation-related changes should also pass the full suite with the pinned toolchain:

go test ./...

To run the same suite via the task runner:

./taskfile workflow:test

When using the built-in engine, the environment variables can be omitted.

Requirements & Dependencies

  • Go 1.24+
  • Optional SQL backend supported by uptrace/bun (PostgreSQL, MySQL, SQLite)

Key modules:

Further Reading

  • Examples: cmd/example/main.go, examples/web/
  • Logging & observability: docs/LOGGING_GUIDE.md
  • Feature walkthroughs: docs/FEAT_STATIC.md, docs/FEAT_MARKDOWN.md
  • Task-driven design: docs/CMS_TDD.md, docs/CMD_TDD.md

License

Copyright © 2025 goliatone - Licensed under the terms of LICENSE.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrThemesFeatureRequired                  = runtimeconfig.ErrThemesFeatureRequired
	ErrSchedulingFeatureRequiresVersioning    = runtimeconfig.ErrSchedulingFeatureRequiresVersioning
	ErrAdvancedCacheRequiresEnabledCache      = runtimeconfig.ErrAdvancedCacheRequiresEnabledCache
	ErrCommandsCronRequiresScheduling         = runtimeconfig.ErrCommandsCronRequiresScheduling
	ErrDefaultLocaleRequired                  = runtimeconfig.ErrDefaultLocaleRequired
	ErrLoggingProviderRequired                = runtimeconfig.ErrLoggingProviderRequired
	ErrLoggingProviderUnknown                 = runtimeconfig.ErrLoggingProviderUnknown
	ErrLoggingLevelInvalid                    = runtimeconfig.ErrLoggingLevelInvalid
	ErrLoggingFormatInvalid                   = runtimeconfig.ErrLoggingFormatInvalid
	ErrWorkflowProviderUnknown                = runtimeconfig.ErrWorkflowProviderUnknown
	ErrWorkflowProviderConfiguredWhenDisabled = runtimeconfig.ErrWorkflowProviderConfiguredWhenDisabled
)

Functions

func GetMigrationsFS added in v0.2.0

func GetMigrationsFS() embed.FS

GetMigrationsFS returns the embedded migration files for this package

Types

type BlockService

type BlockService = blocks.Service

BlockService exports the blocks service contract.

type CacheConfig

type CacheConfig = runtimeconfig.CacheConfig

type CommandsConfig

type CommandsConfig = runtimeconfig.CommandsConfig

type Config

type Config = runtimeconfig.Config

func DefaultConfig

func DefaultConfig() Config

type ContentConfig

type ContentConfig = runtimeconfig.ContentConfig

type ContentService

type ContentService = content.Service

ContentService exports the content service contract for consumers of the cms package.

type Features

type Features = runtimeconfig.Features

type GeneratorConfig

type GeneratorConfig = runtimeconfig.GeneratorConfig

type GeneratorService

type GeneratorService = generator.Service

GeneratorService exports the static site generator contract.

type I18NConfig

type I18NConfig = runtimeconfig.I18NConfig

type LoggingConfig

type LoggingConfig = runtimeconfig.LoggingConfig

type MarkdownConfig

type MarkdownConfig = runtimeconfig.MarkdownConfig

type MarkdownParserConfig

type MarkdownParserConfig = runtimeconfig.MarkdownParserConfig

type MediaService

type MediaService = media.Service

MediaService exports the media helper contract.

type MenuService = menus.Service

MenuService exports the menus service contract.

type Module

type Module struct {
	// contains filtered or unexported fields
}

Module represents the top level CMS runtime façade.

func New

func New(cfg Config, opts ...di.Option) (*Module, error)

New constructs a CMS module using the provided configuration and optional DI overrides.

func (*Module) Blocks

func (m *Module) Blocks() BlockService

Blocks returns the configured block service.

func (*Module) CommandHandlers

func (m *Module) CommandHandlers() []any

CommandHandlers returns copies of the registered command handlers, allowing callers to wire them into custom dispatchers when automatic registration is disabled.

func (*Module) Container

func (m *Module) Container() *di.Container

Container exposes the underlying DI container for advanced integrations.

func (*Module) Content

func (m *Module) Content() ContentService

Content returns the configured content service.

func (*Module) Generator

func (m *Module) Generator() GeneratorService

Generator returns the configured generator service.

func (*Module) Markdown

func (m *Module) Markdown() interfaces.MarkdownService

Markdown returns the markdown service when configured.

func (*Module) Media

func (m *Module) Media() MediaService

Media returns the media helper used by the module.

func (*Module) Menus

func (m *Module) Menus() MenuService

Menus returns the configured menu service.

func (*Module) Pages

func (m *Module) Pages() PageService

Pages returns the configured page service.

func (*Module) Scheduler

func (m *Module) Scheduler() interfaces.Scheduler

Scheduler returns the scheduler used for publish automation.

func (*Module) Shortcodes added in v0.2.0

func (m *Module) Shortcodes() interfaces.ShortcodeService

Shortcodes returns the configured shortcode service.

func (*Module) StorageAdmin added in v0.2.0

func (m *Module) StorageAdmin() StorageAdminService

StorageAdmin returns the storage admin helper service.

func (*Module) Themes

func (m *Module) Themes() ThemeService

Themes returns the configured theme service.

func (*Module) TranslationsEnabled added in v0.2.0

func (m *Module) TranslationsEnabled() bool

TranslationsEnabled reports whether translations are globally enabled.

func (*Module) TranslationsRequired added in v0.2.0

func (m *Module) TranslationsRequired() bool

TranslationsRequired reports whether translations are required when enabled.

func (*Module) Widgets

func (m *Module) Widgets() WidgetService

Widgets returns the configured widget service.

func (*Module) WorkflowEngine added in v0.2.0

func (m *Module) WorkflowEngine() interfaces.WorkflowEngine

WorkflowEngine returns the configured workflow engine.

type NavigationConfig = runtimeconfig.NavigationConfig

type PageService

type PageService = pages.Service

PageService exports the pages service contract.

type RetentionConfig

type RetentionConfig = runtimeconfig.RetentionConfig

type ShortcodeCacheConfig added in v0.2.0

type ShortcodeCacheConfig = runtimeconfig.ShortcodeCacheConfig

type ShortcodeConfig added in v0.2.0

type ShortcodeConfig = runtimeconfig.ShortcodeConfig

type ShortcodeDefinitionConfig added in v0.2.0

type ShortcodeDefinitionConfig = runtimeconfig.ShortcodeDefinitionConfig

type ShortcodeSecurityConfig added in v0.2.0

type ShortcodeSecurityConfig = runtimeconfig.ShortcodeSecurityConfig

type StorageAdminService added in v0.2.0

type StorageAdminService = *adminstorage.Service

StorageAdminService exports the storage admin helper contract.

type StorageConfig

type StorageConfig = runtimeconfig.StorageConfig

type ThemeConfig

type ThemeConfig = runtimeconfig.ThemeConfig

type ThemeService

type ThemeService = themes.Service

ThemeService exports the themes service contract.

type URLKitResolverConfig

type URLKitResolverConfig = runtimeconfig.URLKitResolverConfig

type WidgetConfig

type WidgetConfig = runtimeconfig.WidgetConfig

type WidgetDefinitionConfig

type WidgetDefinitionConfig = runtimeconfig.WidgetDefinitionConfig

type WidgetService

type WidgetService = widgets.Service

WidgetService exports the widgets service contract.

type WorkflowConfig added in v0.2.0

type WorkflowConfig = runtimeconfig.WorkflowConfig

type WorkflowDefinitionConfig added in v0.2.0

type WorkflowDefinitionConfig = runtimeconfig.WorkflowDefinitionConfig

type WorkflowStateConfig added in v0.2.0

type WorkflowStateConfig = runtimeconfig.WorkflowStateConfig

type WorkflowTransitionConfig added in v0.2.0

type WorkflowTransitionConfig = runtimeconfig.WorkflowTransitionConfig

Directories

Path Synopsis
examples
static command
internal
di
markdown
Package markdown provides the concrete implementation of the Markdown ingestion workflows outlined in docs/FEAT_MARKDOWN.md.
Package markdown provides the concrete implementation of the Markdown ingestion workflows outlined in docs/FEAT_MARKDOWN.md.
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL