@sonicjs-cms/core 3.0.0-beta.7 → 3.0.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{filter-bar.template-DlVYMk-T.d.cts → admin-layout-catalyst.template-DrwDUfsE.d.cts} +25 -1
- package/dist/{filter-bar.template-DlVYMk-T.d.ts → admin-layout-catalyst.template-DrwDUfsE.d.ts} +25 -1
- package/dist/{chunk-LH7RKNUW.js → chunk-3AI73SGI.js} +10 -10
- package/dist/{chunk-LH7RKNUW.js.map → chunk-3AI73SGI.js.map} +1 -1
- package/dist/{chunk-BDDABDAB.cjs → chunk-4BTBSXMR.cjs} +2 -239
- package/dist/chunk-4BTBSXMR.cjs.map +1 -0
- package/dist/{chunk-POGSN5WI.js → chunk-4R2C35OT.js} +3 -3
- package/dist/{chunk-POGSN5WI.js.map → chunk-4R2C35OT.js.map} +1 -1
- package/dist/{chunk-WACUJVXY.cjs → chunk-7O443QPZ.cjs} +57 -11
- package/dist/chunk-7O443QPZ.cjs.map +1 -0
- package/dist/{chunk-XCPIXYOP.js → chunk-DF4YK3JX.js} +4 -4
- package/dist/{chunk-XCPIXYOP.js.map → chunk-DF4YK3JX.js.map} +1 -1
- package/dist/{chunk-WJTMTIYR.js → chunk-DNQYNBD5.js} +255 -3
- package/dist/chunk-DNQYNBD5.js.map +1 -0
- package/dist/{chunk-2RJDEVB3.cjs → chunk-GVGURCFM.cjs} +2 -2
- package/dist/{chunk-2RJDEVB3.cjs.map → chunk-GVGURCFM.cjs.map} +1 -1
- package/dist/{chunk-BYCBFBUG.js → chunk-HKF5IYA2.js} +2 -2
- package/dist/{chunk-BYCBFBUG.js.map → chunk-HKF5IYA2.js.map} +1 -1
- package/dist/{chunk-OECDF2RF.cjs → chunk-MJ63JSTU.cjs} +258 -2
- package/dist/chunk-MJ63JSTU.cjs.map +1 -0
- package/dist/{chunk-ISIRU7AK.cjs → chunk-OWNSD75H.cjs} +4 -4
- package/dist/{chunk-ISIRU7AK.cjs.map → chunk-OWNSD75H.cjs.map} +1 -1
- package/dist/{chunk-ZEZ245PW.js → chunk-RQ6N3FTV.js} +3 -236
- package/dist/chunk-RQ6N3FTV.js.map +1 -0
- package/dist/{chunk-GO2NICMM.cjs → chunk-TKIBLXSL.cjs} +237 -237
- package/dist/{chunk-GO2NICMM.cjs.map → chunk-TKIBLXSL.cjs.map} +1 -1
- package/dist/{chunk-GVHST4D7.js → chunk-VQJVZANG.js} +50 -4
- package/dist/chunk-VQJVZANG.js.map +1 -0
- package/dist/{chunk-2JOMHEKO.js → chunk-WNAFRK7Q.js} +3 -3
- package/dist/{chunk-2JOMHEKO.js.map → chunk-WNAFRK7Q.js.map} +1 -1
- package/dist/{chunk-5QVYEAVV.cjs → chunk-XXNQTYXA.cjs} +10 -10
- package/dist/{chunk-5QVYEAVV.cjs.map → chunk-XXNQTYXA.cjs.map} +1 -1
- package/dist/{chunk-7RY3YKI7.cjs → chunk-YAKNRVAB.cjs} +3 -3
- package/dist/{chunk-7RY3YKI7.cjs.map → chunk-YAKNRVAB.cjs.map} +1 -1
- package/dist/index.cjs +264 -260
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +33 -32
- package/dist/middleware.js +4 -3
- package/dist/migrations-6DQKC3RK.cjs +13 -0
- package/dist/{migrations-TBEFSZIV.cjs.map → migrations-6DQKC3RK.cjs.map} +1 -1
- package/dist/migrations-CCMGRLSD.js +4 -0
- package/dist/{migrations-IEWABLIP.js.map → migrations-CCMGRLSD.js.map} +1 -1
- package/dist/plugins.cjs +40 -40
- package/dist/plugins.js +3 -3
- package/dist/routes.cjs +28 -28
- package/dist/routes.js +8 -8
- package/dist/services.cjs +42 -42
- package/dist/services.d.cts +14 -1
- package/dist/services.d.ts +14 -1
- package/dist/services.js +3 -3
- package/dist/{telemetry-B9vIV4wh.d.cts → telemetry-Cku1ax74.d.cts} +1 -1
- package/dist/{telemetry-B9vIV4wh.d.ts → telemetry-Cku1ax74.d.ts} +1 -1
- package/dist/templates.d.cts +2 -24
- package/dist/templates.d.ts +2 -24
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils.cjs +8 -8
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-BDDABDAB.cjs.map +0 -1
- package/dist/chunk-GVHST4D7.js.map +0 -1
- package/dist/chunk-OECDF2RF.cjs.map +0 -1
- package/dist/chunk-WACUJVXY.cjs.map +0 -1
- package/dist/chunk-WJTMTIYR.js.map +0 -1
- package/dist/chunk-ZEZ245PW.js.map +0 -1
- package/dist/migrations-IEWABLIP.js +0 -4
- package/dist/migrations-TBEFSZIV.cjs +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/collection-registry.ts","../src/services/collection-loader.ts","../src/middleware/tenant.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-WJTMTIYR.js","sourcesContent":["/**\n * CollectionRegistry — in-memory registry of code-defined collections.\n *\n * Replaces the DB `collections` table as the source of truth for collection\n * metadata. Populated once at bootstrap from `loadCollectionConfigs()` (which\n * reads code-registered collections). Code-defined IDs are stable across envs:\n * `collection.id === collection.name`.\n */\n\nimport { CollectionConfig } from '../types/collection-config'\n\nexport interface CollectionRecord extends CollectionConfig {\n /** Stable id = collection.name. Always equals `name` for code-defined collections. */\n id: string\n}\n\nexport class CollectionRegistry {\n private byName = new Map<string, CollectionRecord>()\n private bySlug = new Map<string, CollectionRecord>()\n\n /**\n * Replace the registry contents with the given configs. Idempotent —\n * calling with the same configs twice yields the same state.\n */\n register(configs: CollectionConfig[]): void {\n this.byName.clear()\n this.bySlug.clear()\n for (const config of configs) {\n if (!config.name) continue\n const record: CollectionRecord = {\n ...config,\n id: config.name,\n slug: config.slug ?? config.name.replace(/_/g, '-'),\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true,\n }\n this.byName.set(record.name, record)\n this.bySlug.set(record.slug!, record)\n }\n }\n\n /** All registered collections (including inactive). */\n list(): CollectionRecord[] {\n return Array.from(this.byName.values())\n }\n\n /** Active collections only. */\n listActive(): CollectionRecord[] {\n return this.list().filter((c) => c.isActive !== false)\n }\n\n getByName(name: string): CollectionRecord | undefined {\n return this.byName.get(name)\n }\n\n /** For code-defined collections, id === name. */\n getById(id: string): CollectionRecord | undefined {\n return this.byName.get(id)\n }\n\n /** Look up by the URL slug (set in CollectionConfig.slug). Falls back to getByName if needed. */\n getBySlug(slug: string): CollectionRecord | undefined {\n return this.bySlug.get(slug)\n }\n\n /** Resolve a path segment to a record — tries slug first, then name. */\n getBySlugOrName(slugOrName: string): CollectionRecord | undefined {\n return this.bySlug.get(slugOrName) ?? this.byName.get(slugOrName)\n }\n\n isActive(name: string): boolean {\n const record = this.byName.get(name)\n return record?.isActive !== false && record !== undefined\n }\n\n size(): number {\n return this.byName.size\n }\n\n /** Test helper — wipe state. */\n clear(): void {\n this.byName.clear()\n this.bySlug.clear()\n }\n}\n\n/**\n * Map a registry record to the snake_case shape historically returned by\n * `SELECT * FROM collections`. Used by API routes during the consumer\n * migration so downstream clients see no schema drift.\n */\nexport interface CollectionRowShape {\n id: string\n name: string\n display_name: string\n description: string | null\n schema: any\n is_active: number\n managed: number\n source_type: string\n source_id: string | null\n created_at: number\n updated_at: number\n}\n\nexport function collectionRecordToRow(record: CollectionRecord): CollectionRowShape {\n return {\n id: record.id,\n name: record.name,\n display_name: record.displayName,\n description: record.description ?? null,\n schema: record.schema,\n is_active: record.isActive === false ? 0 : 1,\n managed: record.managed === false ? 0 : 1,\n source_type: 'code',\n source_id: null,\n created_at: 0,\n updated_at: 0,\n }\n}\n\n// Module-level singleton. Bootstrap populates; consumers read.\nlet instance: CollectionRegistry | null = null\n\nexport function getCollectionRegistry(): CollectionRegistry {\n if (!instance) {\n instance = new CollectionRegistry()\n }\n return instance\n}\n\n/** Test helper — reset singleton between tests. */\nexport function resetCollectionRegistry(): void {\n instance = null\n}\n","/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\nimport { getCollectionRegistry } from './collection-registry'\n\nexport interface VisibleCollection {\n name: string\n displayName: string\n}\n\n/** True when a code-registry collection should be hidden from user-facing menus. */\nexport function isCodeCollectionInternal(cfg: { internal?: boolean }): boolean {\n return cfg.internal === true\n}\n\n/** True when a document_types DB row should be hidden from user-facing menus. */\nexport function isDbDocTypeInternal(source?: string | null): boolean {\n return source === 'system' || source === 'plugin'\n}\n\n/**\n * Returns collections visible to users (non-internal) for UI menus like \"New Content\".\n * Canonical filtering logic shared with /admin/collections:\n * - Code registry: cfg.internal !== true\n * - DB document_types: source is not 'system' or 'plugin'\n * Code registry wins on name collisions.\n */\nexport async function getVisibleCollections(db: D1Database): Promise<VisibleCollection[]> {\n const codeRegistry = getCollectionRegistry().list()\n const codeMap = new Map<string, VisibleCollection>()\n for (const cfg of codeRegistry) {\n if (!isCodeCollectionInternal(cfg)) {\n codeMap.set(cfg.name, { name: cfg.name, displayName: cfg.displayName })\n }\n }\n\n let dbRows: any[] = []\n try {\n const { results } = await db.prepare(\n \"SELECT name, display_name, source FROM document_types WHERE is_active = 1 ORDER BY display_name\"\n ).all()\n dbRows = results ?? []\n } catch {\n // document_types may not exist in early dev\n }\n\n const merged = new Map<string, VisibleCollection>(codeMap)\n for (const row of dbRows) {\n if (!isDbDocTypeInternal(row.source) && !merged.has(row.name)) {\n merged.set(row.name, { name: String(row.name), displayName: String(row.display_name) })\n }\n }\n\n return Array.from(merged.values())\n}\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise<CollectionConfig[]> {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise<CollectionConfig | null> {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise<string[]> {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Tenant resolution middleware (multi-tenant plugin runtime).\n *\n * Sets `c.set('tenantId', ...)` for every request. While the multi-tenant plugin is inactive this\n * short-circuits to 'default', making behavior identical to single-tenant SonicJS. When active,\n * the tenant is resolved (first match wins) from:\n *\n * 1. the configured tenant header (API clients, default `X-Tenant-Id`)\n * 2. the `sonicjs-tenant` cookie (admin tenant switcher)\n * 3. an exact host -> tenant domain mapping (`q_tenant_domain`)\n * 4. a subdomain of the configured root domain (`acme.example.com` -> 'acme'), when enabled\n * 5. fallback: 'default'\n *\n * Every candidate is validated against the tenant registry (must exist AND be active); invalid\n * candidates fall through to the next source. Resolution state (plugin status + settings + tenant\n * map) is cached per isolate with a short TTL and invalidated by tenant/plugin writes in the same\n * isolate.\n *\n * `getDocumentRequestContext()` reads the resolved value — the document layer chokepoint stays the\n * single place tenant scope enters queries (R3).\n */\nimport type { Context, Next } from 'hono'\nimport { getCookie } from 'hono/cookie'\nimport { escapeHtml } from '../utils/sanitize'\n\nexport const TENANT_COOKIE = 'sonicjs-tenant'\nexport const TENANT_SWITCHER_MARKER = '<!-- TENANT_SWITCHER -->'\nexport const MULTI_TENANT_PLUGIN_ID = 'multi-tenant'\n\nconst CACHE_TTL_MS = 30_000\n\nexport interface TenantResolutionSettings {\n headerName: string\n subdomainResolution: boolean\n rootDomain: string\n}\n\ninterface TenantCacheEntry {\n pluginActive: boolean\n settings: TenantResolutionSettings\n /** slug -> { name, status } for all live tenant records. */\n tenants: Map<string, { name: string; status: string }>\n /** lowercased exact domain -> slug */\n domains: Map<string, string>\n fetchedAt: number\n}\n\nconst DEFAULT_SETTINGS: TenantResolutionSettings = {\n headerName: 'X-Tenant-Id',\n subdomainResolution: false,\n rootDomain: '',\n}\n\nlet cache: TenantCacheEntry | null = null\n\n/** Busts the per-isolate resolution cache. Called by tenant writes and plugin lifecycle changes. */\nexport function invalidateTenantCache(): void {\n cache = null\n}\n\nasync function loadTenantState(db: any): Promise<TenantCacheEntry> {\n const now = Date.now()\n if (cache && now - cache.fetchedAt < CACHE_TTL_MS) return cache\n\n let pluginActive = false\n let settings = DEFAULT_SETTINGS\n const tenants = new Map<string, { name: string; status: string }>()\n const domains = new Map<string, string>()\n\n try {\n const pluginRow = await db.prepare(\n `SELECT data FROM documents\n WHERE type_id = 'plugin' AND tenant_id = 'default' AND slug = ?\n AND q_plugin_status = 'active' AND is_current_draft = 1 AND deleted_at IS NULL`\n ).bind(MULTI_TENANT_PLUGIN_ID).first() as { data?: string } | null\n\n if (pluginRow) {\n pluginActive = true\n try {\n const data = typeof pluginRow.data === 'string' ? JSON.parse(pluginRow.data) : (pluginRow.data ?? {})\n const s = data.settings ?? {}\n settings = {\n headerName: typeof s.headerName === 'string' && s.headerName.trim() !== '' ? s.headerName.trim() : DEFAULT_SETTINGS.headerName,\n subdomainResolution: s.subdomainResolution === true,\n rootDomain: typeof s.rootDomain === 'string' ? s.rootDomain.trim().toLowerCase() : '',\n }\n } catch {\n settings = DEFAULT_SETTINGS\n }\n\n const { results } = await db.prepare(\n `SELECT slug, name, status, domain FROM auth_tenant`\n ).all()\n for (const row of (results ?? []) as any[]) {\n const status = row.status === 'inactive' ? 'inactive' : 'active'\n tenants.set(row.slug, { name: row.name || row.slug, status })\n if (row.domain && status === 'active') {\n domains.set(String(row.domain).toLowerCase(), row.slug)\n }\n }\n // The default tenant always resolves, even before its registry row is materialized.\n if (!tenants.has('default')) tenants.set('default', { name: 'Default', status: 'active' })\n }\n } catch {\n // DB not migrated/seeded yet (first boot): behave as single-tenant.\n pluginActive = false\n }\n\n cache = { pluginActive, settings, tenants, domains, fetchedAt: now }\n return cache\n}\n\nfunction isActiveTenant(state: TenantCacheEntry, slug: string | undefined | null): slug is string {\n if (!slug) return false\n const entry = state.tenants.get(slug)\n return !!entry && entry.status === 'active'\n}\n\n/**\n * Pure resolution, exported for tests. Returns the tenant slug for a request snapshot.\n *\n * When `opts.enforceMembership` is set (authed requests), every non-'default' candidate must also be\n * in `opts.memberSlugs` — an authed user can only resolve into tenants they belong to. Anonymous\n * requests (public API / content serving) pass `enforceMembership: false` so domain/header routing\n * to public content is unaffected. 'default' is always allowed.\n */\nexport function resolveTenantSlug(\n state: Pick<TenantCacheEntry, 'pluginActive' | 'settings' | 'tenants' | 'domains'>,\n req: { header: string | undefined; cookie: string | undefined; host: string | undefined },\n opts?: { memberSlugs?: Set<string>; enforceMembership?: boolean }\n): string {\n if (!state.pluginActive) return 'default'\n const full = state as TenantCacheEntry\n const enforce = opts?.enforceMembership === true\n const member = (slug: string): boolean =>\n !enforce || slug === 'default' || (opts?.memberSlugs?.has(slug) ?? false)\n const accept = (slug: string | undefined | null): slug is string =>\n isActiveTenant(full, slug) && member(slug)\n\n const header = req.header?.trim().toLowerCase()\n if (accept(header)) return header\n\n const cookie = req.cookie?.trim().toLowerCase()\n if (accept(cookie)) return cookie\n\n const host = req.host?.split(':')[0]?.toLowerCase() ?? ''\n if (host) {\n const bySlug = state.domains.get(host)\n if (accept(bySlug)) return bySlug\n\n const { subdomainResolution, rootDomain } = state.settings\n if (subdomainResolution && rootDomain && host.endsWith(`.${rootDomain}`)) {\n const sub = host.slice(0, -(rootDomain.length + 1))\n if (sub && !sub.includes('.') && accept(sub)) return sub\n }\n }\n\n return 'default'\n}\n\n/** slug -> the user's role in that tenant (excludes always-open 'default'). Empty on error/anon. */\nasync function loadMemberRoles(db: any, userId: string): Promise<Map<string, string>> {\n try {\n const { results } = await db.prepare(`\n SELECT t.slug, m.role FROM auth_tenant_member m\n JOIN auth_tenant t ON t.id = m.tenant_id\n WHERE m.user_id = ?\n `).bind(userId).all()\n return new Map((results ?? []).map((r: any) => [r.slug as string, (r.role as string) || 'viewer']))\n } catch {\n return new Map()\n }\n}\n\nexport function tenantMiddleware() {\n return async (c: Context<any>, next: Next) => {\n const db = (c as any).env?.DB\n if (!db) {\n c.set('tenantId', 'default')\n return next()\n }\n\n const state = await loadTenantState(db)\n\n // Membership gate: for authed requests, resolution is restricted to the user's tenants. Anon\n // requests (public API / content) skip enforcement so public routing is unchanged. Platform\n // super-admins bypass the gate entirely (access every tenant).\n const user = c.get('user') as { userId?: string; role?: string; isSuperAdmin?: boolean } | undefined\n let memberSlugs: Set<string> | undefined\n let memberRoles: Map<string, string> | undefined\n const enforceMembership = !!(user?.userId && state.pluginActive && !user.isSuperAdmin)\n if (user?.userId && state.pluginActive && !user.isSuperAdmin) {\n memberRoles = await loadMemberRoles(db, user.userId)\n memberSlugs = new Set(memberRoles.keys())\n }\n\n const tenantId = resolveTenantSlug(\n state,\n {\n header: c.req.header(state.settings.headerName),\n cookie: getCookie(c, TENANT_COOKIE),\n host: c.req.header('host'),\n },\n { memberSlugs, enforceMembership }\n )\n c.set('tenantId', tenantId)\n\n // Per-tenant RBAC: the role principal fed to the document ACL is the user's role IN the resolved\n // tenant. For the 'default' tenant or a super-admin, the global role applies (single-tenant\n // behavior). For a resolved non-default tenant the gate guarantees membership, so the map has it.\n if (user?.userId) {\n const role =\n tenantId === 'default' || user.isSuperAdmin\n ? user.role\n : memberRoles?.get(tenantId) ?? user.role\n c.set('tenantRole', role)\n }\n\n await next()\n\n // Inject the admin tenant switcher at the layout marker (same post-response pattern as\n // pluginMenuMiddleware). Inactive plugin → marker collapses to nothing via the else branch\n // only when the marker is present; non-admin/non-HTML responses are untouched.\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) return\n if (!c.res.headers.get('content-type')?.includes('text/html')) return\n\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n if (html.includes(TENANT_SWITCHER_MARKER)) {\n const replacement = state.pluginActive\n ? renderTenantSwitcher(state, tenantId, enforceMembership ? memberSlugs : undefined)\n : ''\n c.res = new Response(html.split(TENANT_SWITCHER_MARKER).join(replacement), { status, headers })\n } else {\n // Body was consumed by .text(); must rebuild the Response either way.\n c.res = new Response(html, { status, headers })\n }\n }\n}\n\nfunction renderTenantSwitcher(state: TenantCacheEntry, currentTenantId: string, memberSlugs?: Set<string>): string {\n const active = [...state.tenants.entries()]\n .filter(([slug, t]) => t.status === 'active' && (!memberSlugs || slug === 'default' || memberSlugs.has(slug)))\n .sort(([a], [b]) => (a === 'default' ? -1 : b === 'default' ? 1 : a.localeCompare(b)))\n\n const options = active\n .map(([slug, t]) =>\n `<option value=\"${escapeHtml(slug)}\" ${slug === currentTenantId ? 'selected' : ''}>${escapeHtml(t.name)}</option>`\n )\n .join('')\n\n return `\n <div class=\"border-b border-zinc-950/5 px-4 py-3 dark:border-white/5\" data-tenant-switcher>\n <label for=\"tenant-switcher-select\" class=\"mb-1 flex items-center gap-1.5 text-xs/5 font-medium text-zinc-500 dark:text-zinc-400\">\n <svg class=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3.75 21h16.5M4.5 3h15M5.25 3v18m13.5-18v18M9 6.75h1.5m-1.5 3h1.5m-1.5 3h1.5m3-6H15m-1.5 3H15m-1.5 3H15M9 21v-3.375c0-.621.504-1.125 1.125-1.125h3.75c.621 0 1.125.504 1.125 1.125V21\"/></svg>\n Tenant\n </label>\n <form method=\"POST\" action=\"/admin/tenants/switch\" data-tenant-switcher-form>\n <select\n id=\"tenant-switcher-select\"\n name=\"tenant\"\n onchange=\"this.form.requestSubmit ? this.form.requestSubmit() : this.form.submit()\"\n class=\"w-full rounded-lg border border-zinc-950/10 bg-white px-2 py-1.5 text-sm/5 text-zinc-950 dark:border-white/10 dark:bg-zinc-800 dark:text-white\"\n >${options}</select>\n <input type=\"hidden\" name=\"redirect\" value=\"\" data-tenant-switcher-redirect>\n </form>\n <script>\n (function () {\n var r = document.querySelector('[data-tenant-switcher-redirect]');\n if (r) r.value = window.location.pathname + window.location.search;\n })();\n </script>\n </div>`\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { invalidateTenantCache } from '../middleware/tenant'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nconst TENANT = 'default'\nconst TYPE_ID = 'plugin'\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise<PluginData[]> {\n const { results } = await this.db.prepare(`\n SELECT * FROM documents\n WHERE type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n ORDER BY json_extract(data, '$.isCore') DESC, title ASC\n `).bind(TYPE_ID, TENANT).all()\n return (results || []).map(mapDocumentToPlugin)\n }\n\n async getPlugin(pluginId: string): Promise<PluginData | null> {\n const row = await this.db.prepare(`\n SELECT * FROM documents\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(pluginId, TYPE_ID, TENANT).first()\n if (!row) return null\n return mapDocumentToPlugin(row)\n }\n\n async getPluginByName(name: string): Promise<PluginData | null> {\n return this.getPlugin(name)\n }\n\n async getPluginStats(): Promise<PluginStats> {\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n COUNT(CASE WHEN q_plugin_status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN q_plugin_status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN q_plugin_status = 'error' THEN 1 END) as errors\n FROM documents\n WHERE type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(TYPE_ID, TENANT).first() as any\n return {\n total: stats?.total || 0,\n active: stats?.active || 0,\n inactive: stats?.inactive || 0,\n errors: stats?.errors || 0,\n uninstalled: 0,\n }\n }\n\n async installPlugin(pluginData: Partial<PluginData>): Promise<PluginData> {\n const slug = pluginData.id || pluginData.name || `plugin-${Date.now()}`\n const docId = crypto.randomUUID()\n const now = Math.floor(Date.now() / 1000)\n const data = JSON.stringify({\n name: slug,\n displayName: pluginData.display_name || 'Unnamed Plugin',\n description: pluginData.description || '',\n version: pluginData.version || '1.0.0',\n author: pluginData.author || 'Unknown',\n category: pluginData.category || 'utilities',\n icon: pluginData.icon || '🔌',\n status: 'active',\n isCore: pluginData.is_core || false,\n settings: pluginData.settings || {},\n permissions: pluginData.permissions || [],\n dependencies: pluginData.dependencies || [],\n downloadCount: pluginData.download_count || 0,\n rating: pluginData.rating || 0,\n })\n // R5: 17 columns / 9 ? / 8 literals — verified\n await this.db.prepare(`\n INSERT INTO documents (\n id, root_id, type_id, version_number, is_current_draft, is_published, status,\n parent_root_id, slug, title, tenant_id, locale, translation_group_id,\n data, metadata, created_at, updated_at\n ) VALUES (\n ?, ?, ?, 1, 1, 1, 'published',\n '', ?, ?, ?, 'default', '',\n ?, '{}', ?, ?\n )\n `).bind(\n docId, docId, TYPE_ID,\n slug, pluginData.display_name || 'Unnamed Plugin', TENANT,\n data, now, now\n ).run()\n\n await this.logActivity(slug, 'installed', null, { version: pluginData.version })\n await this.logActivity(slug, 'activated', null)\n const installed = await this.getPlugin(slug)\n if (!installed) throw new Error('Failed to install plugin')\n return installed\n }\n\n /**\n * Ensure a definePlugin-registered plugin exists in the DB with active status.\n * No-op if already present. Used by admin routes to auto-register SDK plugins\n * that have never been explicitly installed.\n */\n async ensurePlugin(id: string, data: {\n displayName?: string\n description?: string\n author?: string\n version?: string\n }): Promise<PluginData> {\n const existing = await this.getPlugin(id)\n if (existing) return existing\n return this.installPlugin({\n id,\n name: id,\n display_name: data.displayName || id,\n description: data.description || '',\n author: data.author || '',\n version: data.version || '1.0.0',\n })\n }\n\n async uninstallPlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n if (plugin.status === 'active') await this.deactivatePlugin(pluginId)\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET deleted_at = ?, updated_at = ?, is_current_draft = 0, is_published = 0\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1\n `).bind(now, now, pluginId, TYPE_ID, TENANT).run()\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET data = json_set(data, '$.status', 'active', '$.activatedAt', ?, '$.errorMessage', null),\n updated_at = ?\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(now, now, pluginId, TYPE_ID, TENANT).run()\n // Sync status into the plugins table so isPluginActive() sees the change immediately.\n await this.db.prepare(`UPDATE plugins SET status = 'active' WHERE id = ?`).bind(pluginId).run().catch(() => {})\n // Plugin activation state feeds the tenant resolver cache (the multi-tenant plugin short-circuits\n // to single-tenant while inactive). The UI toggle does not run plugin lifecycle callbacks, so bust\n // the cache here. Cheap no-op for every other plugin.\n invalidateTenantCache()\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n await this.checkDependents(plugin.name)\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET data = json_set(data, '$.status', 'inactive', '$.activatedAt', null),\n updated_at = ?\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(now, pluginId, TYPE_ID, TENANT).run()\n // Sync status into the plugins table so isPluginActive() sees the change immediately.\n await this.db.prepare(`UPDATE plugins SET status = 'inactive' WHERE id = ?`).bind(pluginId).run().catch(() => {})\n invalidateTenantCache()\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET data = json_set(data, '$.settings', json(?)), updated_at = ?\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(JSON.stringify(settings), now, pluginId, TYPE_ID, TENANT).run()\n // Multi-tenant resolver settings (header name, subdomain config) live in plugin settings.\n invalidateTenantCache()\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async updatePluginVersion(pluginId: string, patch: { version: string; description: string; permissions: string[]; settings: any }): Promise<void> {\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET data = json_set(data,\n '$.version', ?,\n '$.description', ?,\n '$.permissions', json(?),\n '$.settings', json(?)\n ),\n updated_at = ?\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(\n patch.version, patch.description,\n JSON.stringify(patch.permissions), JSON.stringify(patch.settings || {}),\n now, pluginId, TYPE_ID, TENANT\n ).run()\n }\n\n async setPluginError(pluginId: string, error: string): Promise<void> {\n const now = Math.floor(Date.now() / 1000)\n await this.db.prepare(`\n UPDATE documents\n SET data = json_set(data, '$.status', 'error', '$.errorMessage', ?),\n updated_at = ?\n WHERE slug = ? AND type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(error, now, pluginId, TYPE_ID, TENANT).run()\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise<any[]> {\n try {\n const { results } = await this.db.prepare(`\n SELECT id, data, created_at FROM documents\n WHERE type_id = 'plugin_activity'\n AND tenant_id = ?\n AND is_current_draft = 1\n AND deleted_at IS NULL\n AND json_extract(data, '$.pluginId') = ?\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(TENANT, pluginId, limit).all()\n return (results || []).map((row: any) => {\n const d = typeof row.data === 'string' ? JSON.parse(row.data) : (row.data || {})\n return {\n id: row.id,\n action: d.action,\n userId: d.userId || null,\n details: d.details || null,\n timestamp: row.created_at,\n }\n })\n } catch {\n return []\n }\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise<void> {\n const id = `hook-${Date.now()}`\n await this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `).bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise<void> {\n const id = `route-${Date.now()}`\n await this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `).bind(id, pluginId, path, method, handlerName, JSON.stringify(middleware || [])).run()\n }\n\n async getPluginHooks(pluginId: string): Promise<any[]> {\n const { results } = await this.db.prepare(`\n SELECT * FROM plugin_hooks WHERE plugin_id = ? AND is_active = TRUE ORDER BY priority ASC\n `).bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise<any[]> {\n const { results } = await this.db.prepare(`\n SELECT * FROM plugin_routes WHERE plugin_id = ? AND is_active = TRUE\n `).bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise<void> {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise<void> {\n const { results } = await this.db.prepare(`\n SELECT slug, title FROM documents\n WHERE type_id = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n AND q_plugin_status = 'active'\n AND json_extract(data, '$.dependencies') LIKE ?\n `).bind(TYPE_ID, TENANT, `%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.title || p.slug).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise<void> {\n try {\n const docId = crypto.randomUUID()\n const now = Math.floor(Date.now() / 1000)\n // R5: 17 columns, 7 ? binds (docId×2, slug, title, data, now×2), 10 literals — verified\n const data = JSON.stringify({ pluginId, action, userId, details: details || null })\n await this.db.prepare(`\n INSERT INTO documents (\n id, root_id, type_id, version_number, is_current_draft, is_published, status,\n parent_root_id, slug, title, tenant_id, locale, translation_group_id,\n data, metadata, created_at, updated_at\n ) VALUES (\n ?, ?, 'plugin_activity', 1, 1, 1, 'published',\n '', ?, ?, 'default', 'default', '',\n ?, '{}', ?, ?\n )\n `).bind(docId, docId, docId, action, data, now, now).run()\n } catch {\n // Activity logging is best-effort; don't fail the main operation\n }\n }\n}\n\nfunction mapDocumentToPlugin(row: any): PluginData {\n const data = typeof row.data === 'string' ? JSON.parse(row.data) : (row.data || {})\n return {\n id: row.slug || data.name || row.root_id,\n name: data.name || row.slug || '',\n display_name: data.displayName || row.title || '',\n description: data.description || '',\n version: data.version || '1.0.0',\n author: data.author || 'Unknown',\n category: data.category || 'utilities',\n icon: data.icon || '🔌',\n status: data.status || 'inactive',\n is_core: data.isCore === true || data.isCore === 1,\n settings: data.settings,\n permissions: data.permissions,\n dependencies: data.dependencies,\n download_count: data.downloadCount || 0,\n rating: data.rating || 0,\n installed_at: row.created_at,\n activated_at: data.activatedAt || undefined,\n last_updated: row.updated_at,\n error_message: data.errorMessage || undefined,\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-06-19T01:07:29.726Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n /** When true, the plugin is auto-installed and activated on greenfield installs. */\n defaultActive?: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record<string, any>\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry> = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": {\n \"label\": \"Cache\",\n \"icon\": \"server\",\n \"path\": \"/admin/cache\",\n \"order\": 60\n }\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": true,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails via Cloudflare Email Service. Subscribes to auth lifecycle events (welcome, password reset, password changed) and runs a 5-minute reconciliation cron against the CF GraphQL Activity Log.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": true,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"provider\": \"cloudflare\",\n \"resendApiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\",\n \"cfAccountId\": \"\",\n \"cfEmailApiToken\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email\",\n \"order\": 80\n }\n },\n\n 'forms': {\n \"id\": \"forms\",\n \"codeName\": \"forms\",\n \"displayName\": \"Forms\",\n \"description\": \"Form builder with Form.io integration, Turnstile CAPTCHA support, and submission management\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"📋\",\n \"is_core\": true,\n \"permissions\": [\n \"forms:manage\",\n \"forms:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Forms\",\n \"icon\": \"document-text\",\n \"path\": \"/admin/forms\",\n \"order\": 30\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'lexical-editor': {\n \"id\": \"lexical-editor\",\n \"codeName\": \"lexical-editor\",\n \"displayName\": \"Lexical Rich Text Editor\",\n \"description\": \"Lexical editor integration for rich text editing. Default rich text editor for SonicJS — on by default for greenfield installs.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": true,\n \"defaultActive\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"standard\",\n \"placeholder\": \"Enter content...\"\n },\n \"adminMenu\": {\n \"label\": \"Lexical Editor\",\n \"icon\": \"pencil-square\",\n \"path\": \"/admin/plugins/lexical-editor\",\n \"order\": 80\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'multi-tenant': {\n \"id\": \"multi-tenant\",\n \"codeName\": \"multi-tenant\",\n \"displayName\": \"Multi-Tenant\",\n \"description\": \"Multi-tenancy for the document model: tenant registry, per-request tenant resolution (header, admin switcher cookie, or domain), and tenant-scoped content isolation. Off by default.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🏢\",\n \"is_core\": false,\n \"permissions\": [\n \"tenants.manage\",\n \"tenants.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"headerName\": \"X-Tenant-Id\",\n \"subdomainResolution\": false,\n \"rootDomain\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Tenants\",\n \"icon\": \"building-office\",\n \"path\": \"/admin/tenants\",\n \"order\": 80\n }\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'versioning': {\n \"id\": \"versioning\",\n \"codeName\": \"versioning\",\n \"displayName\": \"Versioning\",\n \"description\": \"View and restore content version history for types with versioning enabled.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🕑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\n// core-auth always bootstrapped. Plugins with defaultActive:true in manifest.json are also\n// auto-installed and activated on greenfield installs.\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n // Collect any registry entries marked defaultActive (e.g. lexical-editor)\n ...Object.values(PLUGIN_REGISTRY)\n .filter(e => e.defaultActive === true && e.id !== \"core-auth\")\n .map(e => e.id),\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS AND marked is_core=true are auto-installed.\n * Non-core plugins are available in the registry but not bootstrapped.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined && PLUGIN_REGISTRY[id]!.is_core === true)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise<void> {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise<void> {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin's version/description/permissions/settings\n */\n private async updatePlugin(plugin: CorePlugin): Promise<void> {\n await this.pluginService.updatePluginVersion(plugin.id, {\n version: plugin.version,\n description: plugin.description,\n permissions: plugin.permissions,\n settings: plugin.settings || {},\n });\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise<boolean> {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["getCacheService"],"mappings":"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","file":"chunk-ZEZ245PW.js","sourcesContent":["import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType<typeof drizzle>\n private enabled: boolean = true\n private configCache: Map<string, LogConfig> = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial<LogEntry>): Promise<void> {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial<LogEntry>): Promise<void> {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial<LogEntry>): Promise<void> {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial<LogEntry>): Promise<void> {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial<LogEntry>): Promise<void> {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial<LogEntry>\n ): Promise<void> {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial<LogEntry>): Promise<void> {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial<LogEntry>): Promise<void> {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial<LogEntry>\n ): Promise<void> {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise<LogConfig | null> {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial<LogConfig>): Promise<void> {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise<LogConfig[]> {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise<void> {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise<void> {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Cache Service Adapter\n *\n * Thin facade over the cache plugin's `CacheService` so route code can keep its\n * legacy `{ ttl, keyPrefix }` contract while writes land in the plugin's\n * singleton — that's the same registry the admin dashboard at /admin/cache reads\n * via `getAllCacheStats()`. Without this adapter the two caches would be split:\n * routes would write to one, the dashboard would read from another, and the UI\n * would always show zero entries.\n */\n\nimport {\n getCacheService as getPluginCacheService,\n type CacheService as PluginCacheService,\n} from '../plugins/cache/services/cache'\nimport type { CacheConfig as PluginCacheConfig } from '../plugins/cache/services/cache-config'\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nfunction toPluginConfig(config: CacheConfig): PluginCacheConfig {\n return {\n ttl: config.ttl,\n namespace: config.keyPrefix,\n // KV survives isolate evictions — required for the dashboard to show non-zero\n // counts across requests in production. Falls back to memory-only when the\n // CACHE_KV binding is missing (cache plugin handles the null case).\n kvEnabled: true,\n memoryEnabled: true,\n invalidateOn: [],\n version: 'v1',\n }\n}\n\nexport class CacheService {\n private config: CacheConfig\n private inner: PluginCacheService\n // Tracks expiry times so getWithSource can distinguish 'none' vs 'expired'.\n // The plugin returns source:'miss' for both cases; we differentiate here.\n private keyExpiry = new Map<string, number>()\n\n constructor(config: CacheConfig) {\n this.config = config\n this.inner = getPluginCacheService(toPluginConfig(config))\n }\n\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier !== undefined && identifier !== '') parts.push(identifier)\n return parts.join(':')\n }\n\n async get<T>(key: string): Promise<T | null> {\n return this.inner.get<T>(key)\n }\n\n async getWithSource<T>(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const result = await this.inner.getWithSource<T>(key)\n if (result.hit) {\n const out: { hit: boolean; data: T | null; source: string; ttl?: number } = {\n hit: true,\n data: result.data,\n source: result.source,\n }\n if (result.ttl !== undefined) out.ttl = result.ttl\n return out\n }\n // Plugin returns source:'miss' for both \"never set\" and \"expired\". Distinguish\n // by checking if we ever recorded an expiry for this key.\n const expiry = this.keyExpiry.get(key)\n if (expiry !== undefined) {\n this.keyExpiry.delete(key)\n return { hit: false, data: null, source: 'expired' }\n }\n return { hit: false, data: null, source: 'none' }\n }\n\n async set(key: string, value: any, ttl?: number): Promise<void> {\n const effectiveTtl = ttl ?? this.config.ttl\n this.keyExpiry.set(key, Date.now() + effectiveTtl * 1000)\n await this.inner.set(key, value, ttl !== undefined ? { ttl } : undefined)\n }\n\n async delete(key: string): Promise<void> {\n this.keyExpiry.delete(key)\n await this.inner.delete(key)\n }\n\n async invalidate(pattern: string): Promise<void> {\n // Clear expiry tracking for invalidated keys\n if (pattern.includes('*') || pattern.includes('?')) {\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$')\n for (const k of this.keyExpiry.keys()) {\n if (regex.test(k)) this.keyExpiry.delete(k)\n }\n } else {\n this.keyExpiry.delete(pattern)\n }\n await this.inner.invalidate(pattern)\n }\n\n async clear(): Promise<void> {\n this.keyExpiry.clear()\n await this.inner.clear()\n }\n\n async getOrSet<T>(key: string, callback: () => Promise<T>, ttl?: number): Promise<T> {\n const cached = await this.get<T>(key)\n if (cached !== null) return cached\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Default cache configurations for different data types.\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api',\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user',\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content',\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection',\n },\n}\n\n/**\n * Resolve a cache service for a config. Wraps the plugin's singleton so admin\n * dashboard stats and route-side writes share the same store.\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n\n/** Clear every cached value across all plugin singletons. Test/admin use only. */\nexport async function clearAllCacheInstances(): Promise<void> {\n const { clearAllCaches } = await import('../plugins/cache/services/cache')\n await clearAllCaches()\n}\n","export interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nconst TYPE_ID = 'site_settings'\nconst TENANT = 'default'\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get settings document for a category (general or security)\n */\n private async getSettingsDocument(category: string): Promise<any | null> {\n try {\n const row = await this.db.prepare(`\n SELECT data FROM documents\n WHERE type_id = ? AND slug = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(TYPE_ID, category, TENANT).first()\n\n if (!row) {\n return null\n }\n\n return JSON.parse((row as any).data)\n } catch (error) {\n console.error(`Error getting settings document for ${category}:`, error)\n return null\n }\n }\n\n /**\n * Save settings document for a category (general or security)\n */\n private async saveSettingsDocument(category: string, data: Record<string, any>): Promise<boolean> {\n try {\n const now = Math.floor(Date.now() / 1000)\n const jsonData = JSON.stringify(data)\n\n // Ensure document_types row exists (FK constraint on documents.type_id)\n await this.db.prepare(`\n INSERT OR IGNORE INTO document_types (id, name, display_name, description, schema, source, is_system, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n TYPE_ID, TYPE_ID, 'Site Settings',\n 'Global site configuration settings',\n '{}', 'system', 1, 1, now, now\n ).run()\n\n // Check if document already exists\n const existing = await this.db.prepare(`\n SELECT id FROM documents\n WHERE type_id = ? AND slug = ? AND tenant_id = ? AND is_current_draft = 1 AND deleted_at IS NULL\n `).bind(TYPE_ID, category, TENANT).first() as any\n\n if (existing) {\n // Update existing document\n await this.db.prepare(`\n UPDATE documents\n SET data = ?, updated_at = ?\n WHERE id = ? AND is_current_draft = 1\n `).bind(jsonData, now, existing.id).run()\n } else {\n // Create new document\n const docId = crypto.randomUUID()\n const rootId = docId\n const title = category === 'general' ? 'General Settings' : 'Security Settings'\n\n await this.db.prepare(`\n INSERT INTO documents (\n id, root_id, type_id, version_number, is_current_draft, is_published, status,\n parent_root_id, slug, title, tenant_id, locale, translation_group_id,\n data, metadata, created_at, updated_at\n ) VALUES (\n ?, ?, ?, 1, 1, 1, 'published',\n '', ?, ?, ?, 'default', '',\n ?, '{}', ?, ?\n )\n `).bind(\n docId, rootId, TYPE_ID,\n category, title, TENANT,\n jsonData, now, now\n ).run()\n }\n\n return true\n } catch (error) {\n console.error(`Error saving settings document for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise<GeneralSettings> {\n const settings = await this.getSettingsDocument('general')\n\n return {\n siteName: settings?.siteName || 'SonicJS AI',\n siteDescription: settings?.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings?.adminEmail || userEmail || 'admin@example.com',\n timezone: settings?.timezone || 'UTC',\n language: settings?.language || 'en',\n maintenanceMode: settings?.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial<GeneralSettings>): Promise<boolean> {\n const existing = await this.getSettingsDocument('general')\n const merged = { ...existing, ...settings }\n return await this.saveSettingsDocument('general', merged)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise<SecuritySettings> {\n const settings = await this.getSettingsDocument('security')\n\n return {\n jwtExpiresIn: settings?.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial<SecuritySettings>): Promise<boolean> {\n const existing = await this.getSettingsDocument('security')\n const merged = { ...existing, ...settings }\n return await this.saveSettingsDocument('security', merged)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial<TelemetryConfig>) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise<void> {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise<void> {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise<void> {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise<void> {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise<void> {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise<void> {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise<void> {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise<void> {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise<void> {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise<void> {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise<void> {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise<void> {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial<TelemetryConfig>): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial<TelemetryConfig>): Promise<TelemetryService> {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record<string, CategoryInfo> = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n },\n 'Collections': {\n title: 'Collections',\n description: 'Per-collection REST endpoints (auto-generated from registered collections)',\n icon: '📚'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record<string, RouteMeta> = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Explain how to run D1 migrations with Wrangler', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // Collection shorthand routes\n 'GET /api/:collection': { description: 'List items from a collection (shorthand route)', category: 'Collections', authentication: false },\n 'GET /api/:collection/:id': { description: 'Get a single item by ID from a collection', category: 'Collections', authentication: false },\n 'POST /api/:collection': { description: 'Create an item in a collection', category: 'Collections', authentication: true },\n 'PUT /api/:collection/:id': { description: 'Update an item in a collection', category: 'Collections', authentication: true },\n 'DELETE /api/:collection/:id': { description: 'Delete an item from a collection', category: 'Collections', authentication: true },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n if (path.match(/^\\/api\\/[^/]+(\\/:id)?$/) && !path.startsWith('/api/content') && !path.startsWith('/api/collections') && !path.startsWith('/api/media') && !path.startsWith('/api/search') && !path.startsWith('/api/system') && !path.startsWith('/api/health') && !path.startsWith('/api/documents') && !path.startsWith('/api/forms')) return 'Collections'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set<string>()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record<string, number> = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunk2RJDEVB3_cjs = require('./chunk-2RJDEVB3.cjs');
|
|
4
|
-
require('./chunk-IGJUBJBW.cjs');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(exports, "MigrationService", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function () { return chunk2RJDEVB3_cjs.MigrationService; }
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=migrations-TBEFSZIV.cjs.map
|
|
13
|
-
//# sourceMappingURL=migrations-TBEFSZIV.cjs.map
|