JSPM

  • Created
  • Published
  • Downloads 1587
  • Score
    100M100P100Q79875F
  • License MIT

Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers

Package Exports

  • @sonicjs-cms/core
  • @sonicjs-cms/core/middleware
  • @sonicjs-cms/core/plugins
  • @sonicjs-cms/core/routes
  • @sonicjs-cms/core/services
  • @sonicjs-cms/core/templates
  • @sonicjs-cms/core/types
  • @sonicjs-cms/core/utils

Readme

@sonicjs/core

Core framework for SonicJS - A modern, TypeScript-first headless CMS built for Cloudflare's edge platform.

Features

  • 🚀 Edge-First: Runs on Cloudflare Workers for sub-50ms global response times
  • 📦 Zero Cold Starts: V8 isolates provide instant startup
  • 🔒 Type-Safe: Full TypeScript support with strict typing
  • 🔌 Plugin System: Extensible architecture with hooks and middleware
  • Three-Tier Caching: Memory, KV, and database layers for optimal performance
  • 🎨 Admin Interface: Beautiful glass morphism design system
  • 🔐 Authentication: JWT-based auth with role-based permissions
  • 📝 Content Management: Dynamic collections with versioning and workflows
  • 🖼️ Media Management: R2 storage with automatic CDN optimization
  • 📊 API Documentation: OpenAPI/Swagger with auto-generated docs

Installation

npm install @sonicjs/core

Peer Dependencies

npm install @cloudflare/workers-types hono drizzle-orm zod

Quick Start

1. Create a new SonicJS project

// src/index.ts
import { createSonicJSApp } from '@sonicjs/core'
import type { SonicJSConfig } from '@sonicjs/core'

const config: SonicJSConfig = {
  collections: {
    directory: './src/collections',
    autoSync: true
  },
  plugins: {
    directory: './src/plugins',
    autoLoad: true
  }
}

const app = createSonicJSApp(config)

export default app

2. Define a collection

// src/collections/posts.collection.ts
import type { CollectionConfig } from '@sonicjs/core'

export const postsCollection: CollectionConfig = {
  name: 'posts',
  fields: {
    title: {
      type: 'text',
      required: true,
      label: 'Title'
    },
    content: {
      type: 'rich_text',
      required: true,
      label: 'Content'
    },
    published: {
      type: 'boolean',
      default: false,
      label: 'Published'
    }
  }
}

3. Run migrations

npm run db:migrate

4. Start development server

npm run dev

Usage

Importing Core Modules

// Main API
import { createSonicJSApp } from '@sonicjs/core'
import type { SonicJSConfig } from '@sonicjs/core'

// Services
import { CollectionService, MigrationService } from '@sonicjs/core/services'

// Middleware
import { requireAuth, requireRole } from '@sonicjs/core/middleware'

// Types
import type {
  CollectionConfig,
  PluginConfig,
  User,
  Bindings
} from '@sonicjs/core'

// Utilities
import { validators, templateRenderer } from '@sonicjs/core/utils'

Custom Routes

import { Hono } from 'hono'
import { requireAuth } from '@sonicjs/core/middleware'
import type { Bindings } from '@sonicjs/core'

export const customRoutes = new Hono<{ Bindings: Bindings }>()

customRoutes.get('/custom', requireAuth(), async (c) => {
  return c.json({ message: 'Custom route' })
})

Custom Plugins

import type { Plugin } from '@sonicjs/core/plugins'

export class MyPlugin implements Plugin {
  name = 'my-plugin'
  version = '1.0.0'
  description = 'My custom plugin'

  async onActivate() {
    console.log('Plugin activated!')
  }

  hooks = {
    'content.beforeSave': async (content) => {
      // Modify content before saving
      return content
    }
  }
}

Configuration

SonicJS Config

interface SonicJSConfig {
  // Collections configuration
  collections?: {
    directory: string
    autoSync: boolean
  }

  // Plugins configuration
  plugins?: {
    directory: string
    autoLoad: boolean
  }

  // Custom routes
  routes?: Array<{
    path: string
    handler: Hono
  }>

  // Custom middleware
  middleware?: {
    beforeAuth?: Array<MiddlewareHandler>
    afterAuth?: Array<MiddlewareHandler>
  }
}

API Reference

Services

  • CollectionService: Load and manage collections
  • MigrationService: Database migration management
  • PluginService: Plugin lifecycle management
  • Logger: Structured logging system

Middleware

  • requireAuth(): Require authentication
  • requireRole(roles): Require specific roles
  • requirePermission(permission): Require specific permission
  • bootstrapMiddleware(): Initialize application

Routes

  • apiRoutes: Public API endpoints
  • adminRoutes: Admin dashboard routes
  • authRoutes: Authentication routes

Migration from Standalone

If you're migrating from a standalone SonicJS project:

# 1. Install core package
npm install @sonicjs/core

# 2. Run migration tool
npx @sonicjs/migrate --from=current --to=1.0.0

# 3. Update src/index.ts with new config API
# 4. Run database migrations
npm run db:migrate

# 5. Test
npm run dev

See Migration Guide for detailed instructions.

Documentation

Examples

See the examples directory for complete examples:

  • Basic Setup: Simple SonicJS application
  • Custom Plugin: Building custom plugins
  • API Integration: Consuming the API
  • Advanced Configuration: Complex setups

Architecture

@sonicjs/core
├── services/       # Business logic layer
├── middleware/     # Request processing
├── routes/         # HTTP handlers
├── templates/      # Admin UI templates
├── plugins/        # Plugin system
├── types/          # TypeScript definitions
├── utils/          # Utility functions
└── migrations/     # Database migrations

Contributing

Contributions welcome! See CONTRIBUTING.md.

License

MIT © SonicJS Team

Support

Changelog

See CHANGELOG.md for version history.


Built with ❤️ by the SonicJS Team