@sonicjs-cms/core 2.7.0 → 2.8.0

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.
Files changed (96) hide show
  1. package/dist/{app-DV27cjPy.d.cts → app-CYEm1ytG.d.cts} +1 -0
  2. package/dist/{app-DV27cjPy.d.ts → app-CYEm1ytG.d.ts} +1 -0
  3. package/dist/{chunk-DNHJS6RN.js → chunk-34QIAULP.js} +4 -4
  4. package/dist/{chunk-DNHJS6RN.js.map → chunk-34QIAULP.js.map} +1 -1
  5. package/dist/{chunk-Y3EWJQ4D.js → chunk-3E76TKR5.js} +3 -3
  6. package/dist/{chunk-Y3EWJQ4D.js.map → chunk-3E76TKR5.js.map} +1 -1
  7. package/dist/{chunk-YRFAQ6MI.cjs → chunk-5CENPGR2.cjs} +219 -14
  8. package/dist/chunk-5CENPGR2.cjs.map +1 -0
  9. package/dist/{chunk-MYB5RY7H.cjs → chunk-5HMR2SJW.cjs} +4 -4
  10. package/dist/{chunk-MYB5RY7H.cjs.map → chunk-5HMR2SJW.cjs.map} +1 -1
  11. package/dist/{chunk-YHW27CBV.cjs → chunk-6FHNRRJ3.cjs} +190 -2
  12. package/dist/chunk-6FHNRRJ3.cjs.map +1 -0
  13. package/dist/{chunk-UISZ2MBW.js → chunk-BAWMAS5S.js} +5438 -1443
  14. package/dist/chunk-BAWMAS5S.js.map +1 -0
  15. package/dist/{chunk-F332TENF.js → chunk-CJYFSKH7.js} +4 -190
  16. package/dist/chunk-CJYFSKH7.js.map +1 -0
  17. package/dist/{chunk-3YNNVSMC.js → chunk-G44QUVNM.js} +90 -2
  18. package/dist/chunk-G44QUVNM.js.map +1 -0
  19. package/dist/{chunk-E2BXLXPW.cjs → chunk-GPTMGUFN.cjs} +4 -4
  20. package/dist/{chunk-E2BXLXPW.cjs.map → chunk-GPTMGUFN.cjs.map} +1 -1
  21. package/dist/chunk-H7AMQWVI.js +2466 -0
  22. package/dist/chunk-H7AMQWVI.js.map +1 -0
  23. package/dist/{chunk-CLIH2T74.js → chunk-J5WGMRSU.js} +189 -3
  24. package/dist/chunk-J5WGMRSU.js.map +1 -0
  25. package/dist/{chunk-L2IDZI7F.js → chunk-JDFPB6UW.js} +219 -14
  26. package/dist/chunk-JDFPB6UW.js.map +1 -0
  27. package/dist/{chunk-Y72M3MVX.cjs → chunk-MNFY6DWY.cjs} +13 -200
  28. package/dist/chunk-MNFY6DWY.cjs.map +1 -0
  29. package/dist/chunk-S6K2H2TS.cjs +2470 -0
  30. package/dist/chunk-S6K2H2TS.cjs.map +1 -0
  31. package/dist/{chunk-EHSZ6TAN.cjs → chunk-SHCYIZAN.cjs} +9 -2
  32. package/dist/chunk-SHCYIZAN.cjs.map +1 -0
  33. package/dist/{chunk-GRN3GHUG.js → chunk-VCH6HXVP.js} +9 -2
  34. package/dist/chunk-VCH6HXVP.js.map +1 -0
  35. package/dist/{chunk-7FOAMNTI.cjs → chunk-VNLR35GO.cjs} +90 -2
  36. package/dist/chunk-VNLR35GO.cjs.map +1 -0
  37. package/dist/{chunk-J7F3NPAP.cjs → chunk-YE2MU7CN.cjs} +5192 -1194
  38. package/dist/chunk-YE2MU7CN.cjs.map +1 -0
  39. package/dist/index.cjs +201 -607
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +3 -3
  42. package/dist/index.d.ts +3 -3
  43. package/dist/index.js +67 -473
  44. package/dist/index.js.map +1 -1
  45. package/dist/middleware.cjs +23 -23
  46. package/dist/middleware.d.cts +1 -1
  47. package/dist/middleware.d.ts +1 -1
  48. package/dist/middleware.js +2 -2
  49. package/dist/migrations-7JGSFOCM.cjs +13 -0
  50. package/dist/{migrations-LEMFV2ND.cjs.map → migrations-7JGSFOCM.cjs.map} +1 -1
  51. package/dist/migrations-YB77VTVF.js +4 -0
  52. package/dist/{migrations-RKQES6XY.js.map → migrations-YB77VTVF.js.map} +1 -1
  53. package/dist/{plugin-bootstrap-CB-xaBfK.d.ts → plugin-bootstrap-C7Mj00Ud.d.ts} +2455 -1
  54. package/dist/{plugin-bootstrap-U-cw9jn3.d.cts → plugin-bootstrap-DKB5f8-E.d.cts} +2455 -1
  55. package/dist/plugins.cjs +14 -14
  56. package/dist/plugins.js +2 -2
  57. package/dist/routes.cjs +39 -27
  58. package/dist/routes.d.cts +126 -53
  59. package/dist/routes.d.ts +126 -53
  60. package/dist/routes.js +7 -7
  61. package/dist/services.cjs +14 -14
  62. package/dist/services.d.cts +1 -1
  63. package/dist/services.d.ts +1 -1
  64. package/dist/services.js +2 -2
  65. package/dist/templates.cjs +25 -17
  66. package/dist/templates.d.cts +21 -1
  67. package/dist/templates.d.ts +21 -1
  68. package/dist/templates.js +2 -2
  69. package/dist/utils.cjs +14 -14
  70. package/dist/utils.js +1 -1
  71. package/migrations/014_fix_plugin_registry.sql +1 -1
  72. package/migrations/020_add_email_plugin.sql +1 -1
  73. package/migrations/026_add_otp_login.sql +1 -1
  74. package/migrations/029_add_forms_system.sql +184 -0
  75. package/migrations/030_add_turnstile_to_forms.sql +14 -0
  76. package/package.json +2 -2
  77. package/dist/chunk-3YNNVSMC.js.map +0 -1
  78. package/dist/chunk-7FOAMNTI.cjs.map +0 -1
  79. package/dist/chunk-AYPF6C4D.cjs +0 -76
  80. package/dist/chunk-AYPF6C4D.cjs.map +0 -1
  81. package/dist/chunk-CLIH2T74.js.map +0 -1
  82. package/dist/chunk-EHSZ6TAN.cjs.map +0 -1
  83. package/dist/chunk-F332TENF.js.map +0 -1
  84. package/dist/chunk-GRN3GHUG.js.map +0 -1
  85. package/dist/chunk-J7F3NPAP.cjs.map +0 -1
  86. package/dist/chunk-L2IDZI7F.js.map +0 -1
  87. package/dist/chunk-UISZ2MBW.js.map +0 -1
  88. package/dist/chunk-V3KVSEG6.js +0 -74
  89. package/dist/chunk-V3KVSEG6.js.map +0 -1
  90. package/dist/chunk-Y72M3MVX.cjs.map +0 -1
  91. package/dist/chunk-YHW27CBV.cjs.map +0 -1
  92. package/dist/chunk-YRFAQ6MI.cjs.map +0 -1
  93. package/dist/migrations-LEMFV2ND.cjs +0 -13
  94. package/dist/migrations-RKQES6XY.js +0 -4
  95. package/migrations/025_rename_mdxeditor_to_easy_mdx.sql +0 -22
  96. /package/migrations/{029_ai_search_plugin.sql → 031_ai_search_plugin.sql} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/sdk/plugin-builder.ts","../src/plugins/core-plugins/turnstile-plugin/manifest.json","../src/plugins/core-plugins/turnstile-plugin/services/turnstile.ts"],"names":[],"mappings":"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","file":"chunk-J5WGMRSU.js","sourcesContent":["/**\n * Plugin Builder SDK\n *\n * Provides a fluent API for building SonicJS plugins\n *\n * @packageDocumentation\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport { Plugin, PluginBuilderOptions, PluginRoutes, PluginMiddleware, PluginModel, PluginService, PluginAdminPage, PluginComponent, PluginHook, PluginMenuItem } from '../types'\n\n/**\n * Fluent builder for creating SonicJS plugins.\n *\n * @beta This API is in beta and may change in future releases.\n *\n * @example\n * ```typescript\n * import { PluginBuilder } from '@sonicjs-cms/core'\n *\n * const plugin = PluginBuilder.create({\n * name: 'my-plugin',\n * version: '1.0.0',\n * description: 'My custom plugin'\n * })\n * .addRoute('/api/my-plugin', routes)\n * .addHook('content:save', handler)\n * .lifecycle({ activate: async () => console.log('Activated!') })\n * .build()\n * ```\n */\nexport class PluginBuilder {\n private plugin: Partial<Plugin>\n\n constructor(options: PluginBuilderOptions) {\n this.plugin = {\n name: options.name,\n version: options.version,\n description: options.description,\n author: options.author,\n dependencies: options.dependencies,\n routes: [],\n middleware: [],\n models: [],\n services: [],\n adminPages: [],\n adminComponents: [],\n menuItems: [],\n hooks: []\n }\n }\n\n /**\n * Create a new plugin builder\n */\n static create(options: PluginBuilderOptions): PluginBuilder {\n return new PluginBuilder(options)\n }\n\n /**\n * Add metadata to the plugin\n */\n metadata(metadata: {\n description?: string\n author?: Plugin['author']\n license?: string\n compatibility?: string\n dependencies?: string[]\n }): PluginBuilder {\n Object.assign(this.plugin, metadata)\n return this\n }\n\n /**\n * Add routes to plugin\n */\n addRoutes(routes: PluginRoutes[]): PluginBuilder {\n this.plugin.routes = [...(this.plugin.routes || []), ...routes]\n return this\n }\n\n /**\n * Add a single route to plugin\n */\n addRoute(path: string, handler: Hono, options?: {\n description?: string\n requiresAuth?: boolean\n roles?: string[]\n priority?: number\n }): PluginBuilder {\n const route: PluginRoutes = {\n path,\n handler,\n ...options\n }\n this.plugin.routes = [...(this.plugin.routes || []), route]\n return this\n }\n\n /**\n * Add middleware to plugin\n */\n addMiddleware(middleware: PluginMiddleware[]): PluginBuilder {\n this.plugin.middleware = [...(this.plugin.middleware || []), ...middleware]\n return this\n }\n\n /**\n * Add a single middleware to plugin\n */\n addSingleMiddleware(name: string, handler: any, options?: {\n description?: string\n priority?: number\n routes?: string[]\n global?: boolean\n }): PluginBuilder {\n const middleware: PluginMiddleware = {\n name,\n handler,\n ...options\n }\n this.plugin.middleware = [...(this.plugin.middleware || []), middleware]\n return this\n }\n\n /**\n * Add models to plugin\n */\n addModels(models: PluginModel[]): PluginBuilder {\n this.plugin.models = [...(this.plugin.models || []), ...models]\n return this\n }\n\n /**\n * Add a single model to plugin\n */\n addModel(name: string, options: {\n tableName: string\n schema: z.ZodSchema\n migrations: string[]\n relationships?: PluginModel['relationships']\n extendsContent?: boolean\n }): PluginBuilder {\n const model: PluginModel = {\n name,\n ...options\n }\n this.plugin.models = [...(this.plugin.models || []), model]\n return this\n }\n\n /**\n * Add services to plugin\n */\n addServices(services: PluginService[]): PluginBuilder {\n this.plugin.services = [...(this.plugin.services || []), ...services]\n return this\n }\n\n /**\n * Add a single service to plugin\n */\n addService(name: string, implementation: any, options?: {\n description?: string\n dependencies?: string[]\n singleton?: boolean\n }): PluginBuilder {\n const service: PluginService = {\n name,\n implementation,\n ...options\n }\n this.plugin.services = [...(this.plugin.services || []), service]\n return this\n }\n\n /**\n * Add admin pages to plugin\n */\n addAdminPages(pages: PluginAdminPage[]): PluginBuilder {\n this.plugin.adminPages = [...(this.plugin.adminPages || []), ...pages]\n return this\n }\n\n /**\n * Add a single admin page to plugin\n */\n addAdminPage(path: string, title: string, component: string, options?: {\n description?: string\n permissions?: string[]\n icon?: string\n menuItem?: PluginMenuItem\n }): PluginBuilder {\n const page: PluginAdminPage = {\n path,\n title,\n component,\n ...options\n }\n this.plugin.adminPages = [...(this.plugin.adminPages || []), page]\n return this\n }\n\n /**\n * Add admin components to plugin\n */\n addComponents(components: PluginComponent[]): PluginBuilder {\n this.plugin.adminComponents = [...(this.plugin.adminComponents || []), ...components]\n return this\n }\n\n /**\n * Add a single admin component to plugin\n */\n addComponent(name: string, template: (props: any) => string, options?: {\n description?: string\n propsSchema?: z.ZodSchema\n }): PluginBuilder {\n const component: PluginComponent = {\n name,\n template,\n ...options\n }\n this.plugin.adminComponents = [...(this.plugin.adminComponents || []), component]\n return this\n }\n\n /**\n * Add menu items to plugin\n */\n addMenuItems(items: PluginMenuItem[]): PluginBuilder {\n this.plugin.menuItems = [...(this.plugin.menuItems || []), ...items]\n return this\n }\n\n /**\n * Add a single menu item to plugin\n */\n addMenuItem(label: string, path: string, options?: {\n icon?: string\n order?: number\n parent?: string\n permissions?: string[]\n }): PluginBuilder {\n const menuItem: PluginMenuItem = {\n label,\n path,\n ...options\n }\n this.plugin.menuItems = [...(this.plugin.menuItems || []), menuItem]\n return this\n }\n\n /**\n * Add hooks to plugin\n */\n addHooks(hooks: PluginHook[]): PluginBuilder {\n this.plugin.hooks = [...(this.plugin.hooks || []), ...hooks]\n return this\n }\n\n /**\n * Add a single hook to plugin\n */\n addHook(name: string, handler: any, options?: {\n priority?: number\n description?: string\n }): PluginBuilder {\n const hook: PluginHook = {\n name,\n handler,\n ...options\n }\n this.plugin.hooks = [...(this.plugin.hooks || []), hook]\n return this\n }\n\n /**\n * Add lifecycle hooks\n */\n lifecycle(hooks: {\n install?: Plugin['install']\n uninstall?: Plugin['uninstall']\n activate?: Plugin['activate']\n deactivate?: Plugin['deactivate']\n configure?: Plugin['configure']\n }): PluginBuilder {\n Object.assign(this.plugin, hooks)\n return this\n }\n\n /**\n * Build the plugin\n */\n build(): Plugin {\n // Validate required fields\n if (!this.plugin.name || !this.plugin.version) {\n throw new Error('Plugin name and version are required')\n }\n\n return this.plugin as Plugin\n }\n}\n\n/**\n * Helper functions for common plugin patterns.\n *\n * @beta This API is in beta and may change in future releases.\n */\nexport class PluginHelpers {\n /**\n * Create a REST API route for a model.\n *\n * @experimental This method returns placeholder routes. Full implementation coming soon.\n */\n static createModelAPI(modelName: string, options?: {\n basePath?: string\n permissions?: {\n read?: string[]\n write?: string[]\n delete?: string[]\n }\n }): Hono {\n const app = new Hono()\n const basePath = options?.basePath || `/${modelName.toLowerCase()}`\n\n // GET /models - List all\n app.get('/', async (c) => {\n // Implementation would depend on the model service\n return c.json({ message: `List ${modelName} items` })\n })\n\n // GET /models/:id - Get by ID\n app.get('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Get ${modelName} with ID: ${id}` })\n })\n\n // POST /models - Create new\n app.post('/', async (c) => {\n return c.json({ message: `Create new ${modelName}` })\n })\n\n // PUT /models/:id - Update\n app.put('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Update ${modelName} with ID: ${id}` })\n })\n\n // DELETE /models/:id - Delete\n app.delete('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Delete ${modelName} with ID: ${id}` })\n })\n\n return app\n }\n\n /**\n * Create an admin CRUD interface for a model.\n *\n * @experimental This method generates basic admin page structures. Full implementation coming soon.\n */\n static createAdminInterface(modelName: string, options?: {\n icon?: string\n permissions?: string[]\n fields?: Array<{\n name: string\n type: string\n label: string\n required?: boolean\n }>\n }): {\n pages: PluginAdminPage[]\n menuItems: PluginMenuItem[]\n } {\n const basePath = `/admin/${modelName.toLowerCase()}`\n const displayName = modelName.charAt(0).toUpperCase() + modelName.slice(1)\n\n const pages: PluginAdminPage[] = [\n {\n path: basePath,\n title: `${displayName} List`,\n component: `${modelName}List`,\n permissions: options?.permissions,\n icon: options?.icon\n },\n {\n path: `${basePath}/new`,\n title: `New ${displayName}`,\n component: `${modelName}Form`,\n permissions: options?.permissions\n },\n {\n path: `${basePath}/:id`,\n title: `Edit ${displayName}`,\n component: `${modelName}Form`,\n permissions: options?.permissions\n }\n ]\n\n const menuItems: PluginMenuItem[] = [\n {\n label: displayName,\n path: basePath,\n icon: options?.icon,\n permissions: options?.permissions\n }\n ]\n\n return { pages, menuItems }\n }\n\n /**\n * Create a database migration for a model\n */\n static createMigration(tableName: string, fields: Array<{\n name: string\n type: 'TEXT' | 'INTEGER' | 'REAL' | 'BLOB'\n nullable?: boolean\n primaryKey?: boolean\n unique?: boolean\n defaultValue?: string\n }>): string {\n const columns = fields.map(field => {\n let definition = `${field.name} ${field.type}`\n \n if (field.primaryKey) definition += ' PRIMARY KEY'\n if (field.unique) definition += ' UNIQUE'\n if (!field.nullable && !field.primaryKey) definition += ' NOT NULL'\n if (field.defaultValue) definition += ` DEFAULT ${field.defaultValue}`\n \n return definition\n }).join(',\\n ')\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns},\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n);\n\nCREATE TRIGGER IF NOT EXISTS ${tableName}_updated_at\n AFTER UPDATE ON ${tableName}\nBEGIN\n UPDATE ${tableName} SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\nEND;\n `.trim()\n }\n\n /**\n * Create a Zod schema for a model\n */\n static createSchema(fields: Array<{\n name: string\n type: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object'\n optional?: boolean\n required?: boolean\n validation?: any\n items?: any\n properties?: Record<string, any>\n }>): z.ZodSchema {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n const applyValidation = (field: any, schema: z.ZodTypeAny) => {\n if (field.validation) {\n if (field.type === 'string' && field.validation.min) {\n schema = (schema as z.ZodString).min(field.validation.min)\n }\n if (field.type === 'string' && field.validation.max) {\n schema = (schema as z.ZodString).max(field.validation.max)\n }\n if (field.type === 'string' && field.validation.email) {\n schema = (schema as z.ZodString).email()\n }\n if (field.type === 'string' && field.validation.url) {\n schema = (schema as z.ZodString).url()\n }\n }\n return schema\n }\n\n const buildSchema = (field: any): z.ZodTypeAny => {\n let schema: z.ZodTypeAny\n\n switch (field.type) {\n case 'string':\n schema = z.string()\n break\n case 'number':\n schema = z.number()\n break\n case 'boolean':\n schema = z.boolean()\n break\n case 'date':\n schema = z.date()\n break\n case 'array':\n if (field.items?.blocks && typeof field.items.blocks === 'object') {\n const discriminator = typeof field.items.discriminator === 'string' && field.items.discriminator\n ? field.items.discriminator\n : 'blockType'\n const blockSchemas = Object.entries(field.items.blocks).map(([blockName, blockDef]: [string, any]) => {\n const properties = blockDef?.properties && typeof blockDef.properties === 'object'\n ? blockDef.properties\n : {}\n const blockShape: Record<string, z.ZodTypeAny> = {\n [discriminator]: z.literal(blockName)\n }\n\n Object.entries(properties).forEach(([propertyName, propertyConfigRaw]) => {\n const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === 'object'\n ? propertyConfigRaw as Record<string, any>\n : {}\n const propertySchema = buildSchema({\n ...propertyConfig,\n optional: propertyConfig.required === false\n })\n blockShape[propertyName] = propertySchema\n })\n\n return z.object(blockShape)\n })\n\n if (blockSchemas.length === 1 && blockSchemas[0]) {\n schema = z.array(blockSchemas[0])\n } else if (blockSchemas.length > 1) {\n schema = z.array(z.union(blockSchemas as unknown as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]))\n } else {\n schema = z.array(z.any())\n }\n break\n }\n if (field.items) {\n schema = z.array(buildSchema(field.items))\n break\n }\n schema = z.array(z.any())\n break\n case 'object':\n if (field.properties && typeof field.properties === 'object') {\n const objectShape: Record<string, z.ZodTypeAny> = {}\n Object.entries(field.properties).forEach(([propertyName, propertyConfigRaw]) => {\n const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === 'object'\n ? propertyConfigRaw as Record<string, any>\n : {}\n objectShape[propertyName] = buildSchema({\n ...propertyConfig,\n optional: propertyConfig.required === false\n })\n })\n schema = z.object(objectShape)\n break\n }\n schema = z.object({})\n break\n default:\n schema = z.any()\n }\n\n schema = applyValidation(field, schema)\n\n if (field.optional || field.required === false) {\n schema = schema.optional()\n }\n\n return schema\n }\n\n for (const field of fields) {\n shape[field.name] = buildSchema(field)\n }\n\n return z.object(shape)\n }\n}\n\n/**\n * Common plugin templates for rapid plugin development.\n *\n * @beta This API is in beta and may change in future releases.\n * @experimental Templates are provided as starting points and may require customization.\n */\nexport class PluginTemplates {\n /**\n * Create a simple content type plugin\n */\n static contentType(name: string, fields: Array<{\n name: string\n type: string\n label: string\n required?: boolean\n }>): Plugin {\n const builder = PluginBuilder.create({\n name: `${name}-content-type`,\n version: '1.0.0',\n description: `${name} content type plugin`\n })\n\n // Create model\n const schema = PluginHelpers.createSchema(\n fields.map(f => ({\n name: f.name,\n type: f.type as any,\n optional: !f.required\n }))\n )\n\n const migration = PluginHelpers.createMigration(\n name.toLowerCase(),\n fields.map(f => ({\n name: f.name,\n type: 'TEXT',\n nullable: !f.required\n }))\n )\n\n builder.addModel(name, {\n tableName: name.toLowerCase(),\n schema,\n migrations: [migration],\n extendsContent: true\n })\n\n // Create API routes\n const apiRoutes = PluginHelpers.createModelAPI(name)\n builder.addRoute(`/api/${name.toLowerCase()}`, apiRoutes)\n\n // Create admin interface\n const { pages, menuItems } = PluginHelpers.createAdminInterface(name, {\n fields\n })\n builder.addAdminPages(pages)\n builder.addMenuItems(menuItems)\n\n return builder.build()\n }\n\n /**\n * Create an analytics plugin\n */\n static analytics(name: string, options?: {\n endpoints?: string[]\n dashboard?: boolean\n }): Plugin {\n const builder = PluginBuilder.create({\n name: `${name}-analytics`,\n version: '1.0.0',\n description: `${name} analytics plugin`\n })\n\n // Add middleware to track requests\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n await next()\n const duration = Date.now() - start\n \n // Log analytics data\n console.info(`Analytics: ${c.req.method} ${c.req.path} - ${duration}ms`)\n }, {\n global: true,\n priority: 1\n })\n\n // Add analytics API\n const analyticsAPI = new Hono()\n analyticsAPI.get('/stats', (c) => {\n return c.json({ message: 'Analytics stats' })\n })\n builder.addRoute('/api/analytics', analyticsAPI)\n\n // Add dashboard if requested\n if (options?.dashboard) {\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboard',\n {\n description: 'View analytics and statistics',\n icon: 'chart-bar'\n }\n )\n\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 100\n })\n }\n\n return builder.build()\n }\n}\n","{\n \"id\": \"turnstile\",\n \"name\": \"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 \"icon\": \"shield-check\",\n \"homepage\": \"https://developers.cloudflare.com/turnstile/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\"settings:write\", \"admin:access\"],\n \"dependencies\": [],\n \"configSchema\": {\n \"siteKey\": {\n \"type\": \"string\",\n \"label\": \"Site Key\",\n \"description\": \"Your Cloudflare Turnstile site key (public)\",\n \"required\": true\n },\n \"secretKey\": {\n \"type\": \"string\",\n \"label\": \"Secret Key\",\n \"description\": \"Your Cloudflare Turnstile secret key (private)\",\n \"required\": true,\n \"sensitive\": true\n },\n \"theme\": {\n \"type\": \"select\",\n \"label\": \"Widget Theme\",\n \"description\": \"Visual theme for the Turnstile widget\",\n \"default\": \"auto\",\n \"options\": [\n { \"value\": \"light\", \"label\": \"Light\" },\n { \"value\": \"dark\", \"label\": \"Dark\" },\n { \"value\": \"auto\", \"label\": \"Auto\" }\n ]\n },\n \"size\": {\n \"type\": \"select\",\n \"label\": \"Widget Size\",\n \"description\": \"Size of the Turnstile widget\",\n \"default\": \"normal\",\n \"options\": [\n { \"value\": \"normal\", \"label\": \"Normal\" },\n { \"value\": \"compact\", \"label\": \"Compact\" }\n ]\n },\n \"mode\": {\n \"type\": \"select\",\n \"label\": \"Widget Mode\",\n \"description\": \"Managed: Adaptive challenge. Non-Interactive: Always visible, minimal friction. Invisible: No visible widget\",\n \"default\": \"managed\",\n \"options\": [\n { \"value\": \"managed\", \"label\": \"Managed (Recommended)\" },\n { \"value\": \"non-interactive\", \"label\": \"Non-Interactive\" },\n { \"value\": \"invisible\", \"label\": \"Invisible\" }\n ]\n },\n \"appearance\": {\n \"type\": \"select\",\n \"label\": \"Appearance\",\n \"description\": \"When the Turnstile challenge is executed. Always: Verifies immediately. Execute: Challenge on form submit. Interaction Only: Only after user interaction\",\n \"default\": \"always\",\n \"options\": [\n { \"value\": \"always\", \"label\": \"Always\" },\n { \"value\": \"execute\", \"label\": \"Execute\" },\n { \"value\": \"interaction-only\", \"label\": \"Interaction Only\" }\n ]\n },\n \"preClearance\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Pre-clearance\",\n \"description\": \"Issue a clearance cookie that bypasses Cloudflare Firewall Rules (as if the user passed a challenge on your proxied site)\",\n \"default\": false\n },\n \"preClearanceLevel\": {\n \"type\": \"select\",\n \"label\": \"Pre-clearance Level\",\n \"description\": \"Controls which Cloudflare Firewall Rules the clearance cookie bypasses. Only applies if Pre-clearance is enabled\",\n \"default\": \"managed\",\n \"options\": [\n { \"value\": \"interactive\", \"label\": \"Interactive - Bypasses Interactive, Managed & JS Challenge Rules\" },\n { \"value\": \"managed\", \"label\": \"Managed - Bypasses Managed & JS Challenge Rules\" },\n { \"value\": \"non-interactive\", \"label\": \"Non-interactive - Bypasses JS Challenge Rules only\" }\n ]\n },\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Turnstile\",\n \"description\": \"Enable or disable Turnstile verification globally\",\n \"default\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"href\": \"/admin/plugins/turnstile/settings\",\n \"parentId\": \"plugins\",\n \"order\": 100\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport manifest from '../manifest.json'\n\nexport interface TurnstileSettings {\n siteKey: string\n secretKey: string\n theme?: 'light' | 'dark' | 'auto'\n size?: 'normal' | 'compact'\n mode?: 'managed' | 'non-interactive' | 'invisible'\n appearance?: 'always' | 'execute' | 'interaction-only'\n preClearance?: boolean\n preClearanceLevel?: 'interactive' | 'managed' | 'non-interactive'\n enabled: boolean\n}\n\nexport interface TurnstileVerificationResponse {\n success: boolean\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'error-codes'?: string[] // Cloudflare API uses kebab-case for this field\n challenge_ts?: string\n hostname?: string\n}\n\nexport class TurnstileService {\n private db: D1Database\n private readonly VERIFY_URL = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'\n\n constructor(db: D1Database) {\n this.db = db\n }\n\n /**\n * Get Turnstile settings from database\n */\n async getSettings(): Promise<TurnstileSettings | null> {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind(manifest.id)\n .first<{ settings: string }>()\n\n if (!plugin || !plugin.settings) {\n return null\n }\n\n return JSON.parse(plugin.settings) as TurnstileSettings\n } catch (error) {\n console.error('Error getting Turnstile settings:', error)\n return null\n }\n }\n\n /**\n * Verify a Turnstile token with Cloudflare\n */\n async verifyToken(token: string, remoteIp?: string): Promise<{ success: boolean; error?: string }> {\n try {\n const settings = await this.getSettings()\n\n if (!settings) {\n return { success: false, error: 'Turnstile not configured' }\n }\n\n if (!settings.enabled) {\n // Turnstile disabled, allow through\n return { success: true }\n }\n\n if (!settings.secretKey) {\n return { success: false, error: 'Turnstile secret key not configured' }\n }\n\n const formData = new FormData()\n formData.append('secret', settings.secretKey)\n formData.append('response', token)\n if (remoteIp) {\n formData.append('remoteip', remoteIp)\n }\n\n const response = await fetch(this.VERIFY_URL, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n return { success: false, error: 'Turnstile verification request failed' }\n }\n\n const result: TurnstileVerificationResponse = await response.json()\n\n if (!result.success) {\n const errorCode = result['error-codes']?.[0] || 'unknown-error'\n return { success: false, error: `Turnstile verification failed: ${errorCode}` }\n }\n\n return { success: true }\n } catch (error) {\n console.error('Error verifying Turnstile token:', error)\n return { success: false, error: 'Turnstile verification error' }\n }\n }\n\n /**\n * Save Turnstile settings to database\n */\n async saveSettings(settings: TurnstileSettings): Promise<void> {\n try {\n await this.db\n .prepare(`UPDATE plugins SET settings = ?, updated_at = ? WHERE id = ?`)\n .bind(JSON.stringify(settings), Date.now(), manifest.id)\n .run()\n console.log('Turnstile settings saved successfully')\n } catch (error) {\n console.error('Error saving Turnstile settings:', error)\n throw new Error('Failed to save Turnstile settings')\n }\n }\n\n /**\n * Check if Turnstile is enabled\n */\n async isEnabled(): Promise<boolean> {\n const settings = await this.getSettings()\n return settings?.enabled === true && !!settings.siteKey && !!settings.secretKey\n }\n}\n"]}
@@ -915,7 +915,7 @@ INSERT OR IGNORE INTO plugins (
915
915
  'Core analytics tracking and reporting plugin with page views and event tracking',
916
916
  '1.0.0',
917
917
  'SonicJS Team',
918
- 'analytics',
918
+ 'seo',
919
919
  '\u{1F4CA}',
920
920
  'active',
921
921
  TRUE,
@@ -1200,7 +1200,7 @@ INSERT OR IGNORE INTO plugins (
1200
1200
  'Send transactional emails using Resend',
1201
1201
  '1.0.0-beta.1',
1202
1202
  'SonicJS Team',
1203
- 'communication',
1203
+ 'utilities',
1204
1204
  '\u{1F4E7}',
1205
1205
  'inactive',
1206
1206
  TRUE,
@@ -1387,13 +1387,6 @@ INSERT OR IGNORE INTO plugins (
1387
1387
  );
1388
1388
  `
1389
1389
  },
1390
- {
1391
- id: "025",
1392
- name: "Rename Mdxeditor To Easy Mdx",
1393
- filename: "025_rename_mdxeditor_to_easy_mdx.sql",
1394
- description: "Migration 025: Rename Mdxeditor To Easy Mdx",
1395
- sql: "-- Rename mdxeditor-plugin to easy-mdx\n-- Migration: 025_rename_mdxeditor_to_easy_mdx\n-- Description: Update plugin ID from mdxeditor-plugin to easy-mdx to reflect the change to EasyMDE editor\n\n-- Update the plugin record if it exists with the old ID\nUPDATE plugins\nSET\n id = 'easy-mdx',\n name = 'easy-mdx',\n display_name = 'EasyMDE Markdown Editor',\n description = 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.'\nWHERE id = 'mdxeditor-plugin';\n\n-- Update any plugin_hooks references\nUPDATE plugin_hooks\nSET plugin_id = 'easy-mdx'\nWHERE plugin_id = 'mdxeditor-plugin';\n\n-- Update any plugin_activity_log references\nUPDATE plugin_activity_log\nSET plugin_id = 'easy-mdx'\nWHERE plugin_id = 'mdxeditor-plugin';\n"
1396
- },
1397
1390
  {
1398
1391
  id: "026",
1399
1392
  name: "Add Otp Login",
@@ -1433,7 +1426,7 @@ INSERT OR IGNORE INTO plugins (
1433
1426
  'Passwordless authentication via email one-time codes',
1434
1427
  '1.0.0-beta.1',
1435
1428
  'SonicJS Team',
1436
- 'authentication',
1429
+ 'security',
1437
1430
  '\u{1F522}',
1438
1431
  'inactive',
1439
1432
  TRUE,
@@ -1489,9 +1482,221 @@ WHERE id = 'news-collection' AND schema LIKE '%"slug":{"type":"string"%';
1489
1482
  },
1490
1483
  {
1491
1484
  id: "029",
1485
+ name: "Add Forms System",
1486
+ filename: "029_add_forms_system.sql",
1487
+ description: "Migration 029: Add Forms System",
1488
+ sql: `-- Migration: 029_add_forms_system.sql
1489
+ -- Description: Add Form.io integration for advanced form building
1490
+ -- Date: January 23, 2026
1491
+ -- Phase: 1 - Database Schema
1492
+
1493
+ -- =====================================================
1494
+ -- Table: forms
1495
+ -- Description: Stores form definitions and configuration
1496
+ -- =====================================================
1497
+
1498
+ CREATE TABLE IF NOT EXISTS forms (
1499
+ id TEXT PRIMARY KEY,
1500
+ name TEXT NOT NULL UNIQUE, -- Machine name (e.g., "contact-form")
1501
+ display_name TEXT NOT NULL, -- Human name (e.g., "Contact Form")
1502
+ description TEXT, -- Optional description
1503
+ category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)
1504
+
1505
+ -- Form.io schema (JSON)
1506
+ formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema
1507
+
1508
+ -- Settings
1509
+ settings TEXT, -- JSON: {
1510
+ -- emailNotifications: true,
1511
+ -- notifyEmail: "admin@example.com",
1512
+ -- successMessage: "Thank you!",
1513
+ -- redirectUrl: "/thank-you",
1514
+ -- allowAnonymous: true,
1515
+ -- requireAuth: false,
1516
+ -- maxSubmissions: null,
1517
+ -- submitButtonText: "Submit",
1518
+ -- saveProgress: true,
1519
+ -- webhookUrl: null
1520
+ -- }
1521
+
1522
+ -- Status & Management
1523
+ is_active INTEGER DEFAULT 1, -- Active/inactive flag
1524
+ is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)
1525
+ managed INTEGER DEFAULT 0, -- Code-managed (like collections)
1526
+
1527
+ -- Metadata
1528
+ icon TEXT, -- Optional icon for admin UI
1529
+ color TEXT, -- Optional color (hex) for admin UI
1530
+ tags TEXT, -- JSON array of tags
1531
+
1532
+ -- Stats
1533
+ submission_count INTEGER DEFAULT 0, -- Total submissions received
1534
+ view_count INTEGER DEFAULT 0, -- Form views (optional tracking)
1535
+
1536
+ -- Ownership
1537
+ created_by TEXT REFERENCES users(id), -- User who created the form
1538
+ updated_by TEXT REFERENCES users(id), -- User who last updated
1539
+
1540
+ -- Timestamps
1541
+ created_at INTEGER NOT NULL,
1542
+ updated_at INTEGER NOT NULL
1543
+ );
1544
+
1545
+ -- Indexes for forms
1546
+ CREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);
1547
+ CREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);
1548
+ CREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);
1549
+ CREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);
1550
+ CREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);
1551
+
1552
+ -- =====================================================
1553
+ -- Table: form_submissions
1554
+ -- Description: Stores submitted form data
1555
+ -- =====================================================
1556
+
1557
+ CREATE TABLE IF NOT EXISTS form_submissions (
1558
+ id TEXT PRIMARY KEY,
1559
+ form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,
1560
+
1561
+ -- Submission data
1562
+ submission_data TEXT NOT NULL, -- JSON: The actual form data submitted
1563
+
1564
+ -- Submission metadata
1565
+ status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam
1566
+ submission_number INTEGER, -- Sequential number per form
1567
+
1568
+ -- User information (if authenticated)
1569
+ user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)
1570
+ user_email TEXT, -- Email from form (or user account)
1571
+
1572
+ -- Tracking information
1573
+ ip_address TEXT, -- IP address of submitter
1574
+ user_agent TEXT, -- Browser user agent
1575
+ referrer TEXT, -- Page that referred to form
1576
+ utm_source TEXT, -- UTM tracking params
1577
+ utm_medium TEXT,
1578
+ utm_campaign TEXT,
1579
+
1580
+ -- Review/Processing
1581
+ reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed
1582
+ reviewed_at INTEGER, -- Review timestamp
1583
+ review_notes TEXT, -- Admin notes
1584
+
1585
+ -- Flags
1586
+ is_spam INTEGER DEFAULT 0, -- Spam flag
1587
+ is_archived INTEGER DEFAULT 0, -- Archived flag
1588
+
1589
+ -- Timestamps
1590
+ submitted_at INTEGER NOT NULL,
1591
+ updated_at INTEGER NOT NULL
1592
+ );
1593
+
1594
+ -- Indexes for submissions
1595
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);
1596
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);
1597
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);
1598
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);
1599
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);
1600
+ CREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);
1601
+
1602
+ -- Trigger to auto-increment submission_number per form
1603
+ CREATE TRIGGER IF NOT EXISTS set_submission_number
1604
+ AFTER INSERT ON form_submissions
1605
+ BEGIN
1606
+ UPDATE form_submissions
1607
+ SET submission_number = (
1608
+ SELECT COUNT(*)
1609
+ FROM form_submissions
1610
+ WHERE form_id = NEW.form_id
1611
+ AND id <= NEW.id
1612
+ )
1613
+ WHERE id = NEW.id;
1614
+ END;
1615
+
1616
+ -- Trigger to update form submission_count
1617
+ CREATE TRIGGER IF NOT EXISTS increment_form_submission_count
1618
+ AFTER INSERT ON form_submissions
1619
+ BEGIN
1620
+ UPDATE forms
1621
+ SET submission_count = submission_count + 1,
1622
+ updated_at = unixepoch() * 1000
1623
+ WHERE id = NEW.form_id;
1624
+ END;
1625
+
1626
+ -- =====================================================
1627
+ -- Table: form_files (Optional)
1628
+ -- Description: Link form submissions to uploaded files
1629
+ -- =====================================================
1630
+
1631
+ CREATE TABLE IF NOT EXISTS form_files (
1632
+ id TEXT PRIMARY KEY,
1633
+ submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,
1634
+ media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,
1635
+ field_name TEXT NOT NULL, -- Form field that uploaded this file
1636
+ uploaded_at INTEGER NOT NULL
1637
+ );
1638
+
1639
+ -- Indexes for form files
1640
+ CREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);
1641
+ CREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);
1642
+
1643
+ -- =====================================================
1644
+ -- Sample Data: Create a default contact form
1645
+ -- =====================================================
1646
+
1647
+ INSERT OR IGNORE INTO forms (
1648
+ id,
1649
+ name,
1650
+ display_name,
1651
+ description,
1652
+ category,
1653
+ formio_schema,
1654
+ settings,
1655
+ is_active,
1656
+ is_public,
1657
+ created_at,
1658
+ updated_at
1659
+ ) VALUES (
1660
+ 'default-contact-form',
1661
+ 'contact',
1662
+ 'Contact Form',
1663
+ 'A simple contact form for getting in touch',
1664
+ 'contact',
1665
+ '{"components":[]}',
1666
+ '{"emailNotifications":false,"successMessage":"Thank you for your submission!","submitButtonText":"Submit","requireAuth":false}',
1667
+ 1,
1668
+ 1,
1669
+ unixepoch() * 1000,
1670
+ unixepoch() * 1000
1671
+ );
1672
+ `
1673
+ },
1674
+ {
1675
+ id: "030",
1676
+ name: "Add Turnstile To Forms",
1677
+ filename: "030_add_turnstile_to_forms.sql",
1678
+ description: "Migration 030: Add Turnstile To Forms",
1679
+ sql: `-- Add Turnstile configuration to forms table
1680
+ -- This allows per-form Turnstile settings with global fallback
1681
+
1682
+ -- Add columns (D1 may not support CHECK constraints in ALTER TABLE)
1683
+ ALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;
1684
+ ALTER TABLE forms ADD COLUMN turnstile_settings TEXT;
1685
+
1686
+ -- Set default to inherit global settings for existing forms
1687
+ UPDATE forms
1688
+ SET turnstile_settings = '{"inherit":true}'
1689
+ WHERE turnstile_settings IS NULL;
1690
+
1691
+ -- Add index for faster lookups
1692
+ CREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);
1693
+ `
1694
+ },
1695
+ {
1696
+ id: "031",
1492
1697
  name: "Ai Search Plugin",
1493
- filename: "029_ai_search_plugin.sql",
1494
- description: "Migration 029: Ai Search Plugin",
1698
+ filename: "031_ai_search_plugin.sql",
1699
+ description: "Migration 031: Ai Search Plugin",
1495
1700
  sql: "-- AI Search plugin settings\nCREATE TABLE IF NOT EXISTS ai_search_settings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n enabled BOOLEAN DEFAULT 0,\n ai_mode_enabled BOOLEAN DEFAULT 1,\n selected_collections TEXT, -- JSON array of collection IDs to index\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\n autocomplete_enabled BOOLEAN DEFAULT 1,\n cache_duration INTEGER DEFAULT 1, -- hours\n results_limit INTEGER DEFAULT 20,\n index_media BOOLEAN DEFAULT 0,\n index_status TEXT, -- JSON object with status per collection\n last_indexed_at INTEGER,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Search history/analytics\nCREATE TABLE IF NOT EXISTS ai_search_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query TEXT NOT NULL,\n mode TEXT, -- 'ai' or 'keyword'\n results_count INTEGER,\n user_id INTEGER,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Index metadata tracking (per collection)\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n collection_name TEXT NOT NULL, -- Cache collection name for display\n total_items INTEGER DEFAULT 0,\n indexed_items INTEGER DEFAULT 0,\n last_sync_at INTEGER,\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\n error_message TEXT,\n UNIQUE(collection_id)\n);\n\n-- Indexes for performance\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\n"
1496
1701
  }
1497
1702
  ];
@@ -1901,5 +2106,5 @@ var MigrationService = class {
1901
2106
  };
1902
2107
 
1903
2108
  export { MigrationService };
1904
- //# sourceMappingURL=chunk-L2IDZI7F.js.map
1905
- //# sourceMappingURL=chunk-L2IDZI7F.js.map
2109
+ //# sourceMappingURL=chunk-JDFPB6UW.js.map
2110
+ //# sourceMappingURL=chunk-JDFPB6UW.js.map