@intranefr/superbackend 1.4.3

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 (188) hide show
  1. package/.commiat +4 -0
  2. package/.env.example +47 -0
  3. package/README.md +110 -0
  4. package/index.js +94 -0
  5. package/package.json +67 -0
  6. package/public/css/styles.css +139 -0
  7. package/public/js/animations.js +41 -0
  8. package/sdk/error-tracking/browser/package.json +16 -0
  9. package/sdk/error-tracking/browser/src/core.js +270 -0
  10. package/sdk/error-tracking/browser/src/embed.js +18 -0
  11. package/sdk/error-tracking/browser/src/index.js +1 -0
  12. package/server.js +5 -0
  13. package/src/admin/endpointRegistry.js +300 -0
  14. package/src/controllers/admin.controller.js +321 -0
  15. package/src/controllers/adminAssets.controller.js +530 -0
  16. package/src/controllers/adminAssetsStorage.controller.js +260 -0
  17. package/src/controllers/adminEjsVirtual.controller.js +354 -0
  18. package/src/controllers/adminFeatureFlags.controller.js +155 -0
  19. package/src/controllers/adminHeadless.controller.js +1071 -0
  20. package/src/controllers/adminI18n.controller.js +604 -0
  21. package/src/controllers/adminJsonConfigs.controller.js +97 -0
  22. package/src/controllers/adminLlm.controller.js +273 -0
  23. package/src/controllers/adminMigration.controller.js +257 -0
  24. package/src/controllers/adminSeoConfig.controller.js +515 -0
  25. package/src/controllers/adminStats.controller.js +121 -0
  26. package/src/controllers/adminUploadNamespaces.controller.js +208 -0
  27. package/src/controllers/assets.controller.js +248 -0
  28. package/src/controllers/auth.controller.js +93 -0
  29. package/src/controllers/billing.controller.js +223 -0
  30. package/src/controllers/featureFlags.controller.js +35 -0
  31. package/src/controllers/forms.controller.js +217 -0
  32. package/src/controllers/globalSettings.controller.js +252 -0
  33. package/src/controllers/headlessCrud.controller.js +126 -0
  34. package/src/controllers/i18n.controller.js +12 -0
  35. package/src/controllers/invite.controller.js +249 -0
  36. package/src/controllers/jsonConfigs.controller.js +19 -0
  37. package/src/controllers/metrics.controller.js +149 -0
  38. package/src/controllers/notificationAdmin.controller.js +264 -0
  39. package/src/controllers/notifications.controller.js +131 -0
  40. package/src/controllers/org.controller.js +357 -0
  41. package/src/controllers/orgAdmin.controller.js +491 -0
  42. package/src/controllers/stripeAdmin.controller.js +410 -0
  43. package/src/controllers/user.controller.js +361 -0
  44. package/src/controllers/userAdmin.controller.js +277 -0
  45. package/src/controllers/waitingList.controller.js +167 -0
  46. package/src/controllers/webhook.controller.js +200 -0
  47. package/src/middleware/auth.js +66 -0
  48. package/src/middleware/errorCapture.js +170 -0
  49. package/src/middleware/headlessApiTokenAuth.js +57 -0
  50. package/src/middleware/org.js +108 -0
  51. package/src/middleware.js +901 -0
  52. package/src/models/ActionEvent.js +31 -0
  53. package/src/models/ActivityLog.js +41 -0
  54. package/src/models/Asset.js +84 -0
  55. package/src/models/AuditEvent.js +93 -0
  56. package/src/models/EmailLog.js +28 -0
  57. package/src/models/ErrorAggregate.js +72 -0
  58. package/src/models/FormSubmission.js +41 -0
  59. package/src/models/GlobalSetting.js +38 -0
  60. package/src/models/HeadlessApiToken.js +24 -0
  61. package/src/models/HeadlessModelDefinition.js +41 -0
  62. package/src/models/I18nEntry.js +77 -0
  63. package/src/models/I18nLocale.js +33 -0
  64. package/src/models/Invite.js +70 -0
  65. package/src/models/JsonConfig.js +46 -0
  66. package/src/models/Notification.js +60 -0
  67. package/src/models/Organization.js +57 -0
  68. package/src/models/OrganizationMember.js +43 -0
  69. package/src/models/StripeCatalogItem.js +77 -0
  70. package/src/models/StripeWebhookEvent.js +57 -0
  71. package/src/models/User.js +89 -0
  72. package/src/models/VirtualEjsFile.js +60 -0
  73. package/src/models/VirtualEjsFileVersion.js +43 -0
  74. package/src/models/VirtualEjsGroupChange.js +32 -0
  75. package/src/models/WaitingList.js +41 -0
  76. package/src/models/Webhook.js +63 -0
  77. package/src/models/Workflow.js +29 -0
  78. package/src/models/WorkflowExecution.js +12 -0
  79. package/src/routes/admin.routes.js +26 -0
  80. package/src/routes/adminAssets.routes.js +28 -0
  81. package/src/routes/adminAssetsStorage.routes.js +13 -0
  82. package/src/routes/adminAudit.routes.js +196 -0
  83. package/src/routes/adminEjsVirtual.routes.js +17 -0
  84. package/src/routes/adminErrors.routes.js +164 -0
  85. package/src/routes/adminFeatureFlags.routes.js +12 -0
  86. package/src/routes/adminHeadless.routes.js +38 -0
  87. package/src/routes/adminI18n.routes.js +22 -0
  88. package/src/routes/adminJsonConfigs.routes.js +15 -0
  89. package/src/routes/adminLlm.routes.js +12 -0
  90. package/src/routes/adminMigration.routes.js +81 -0
  91. package/src/routes/adminSeoConfig.routes.js +20 -0
  92. package/src/routes/adminUploadNamespaces.routes.js +13 -0
  93. package/src/routes/assets.routes.js +21 -0
  94. package/src/routes/auth.routes.js +12 -0
  95. package/src/routes/billing.routes.js +11 -0
  96. package/src/routes/errorTracking.routes.js +31 -0
  97. package/src/routes/featureFlags.routes.js +9 -0
  98. package/src/routes/forms.routes.js +9 -0
  99. package/src/routes/formsAdmin.routes.js +13 -0
  100. package/src/routes/globalSettings.routes.js +18 -0
  101. package/src/routes/headless.routes.js +15 -0
  102. package/src/routes/i18n.routes.js +8 -0
  103. package/src/routes/invite.routes.js +9 -0
  104. package/src/routes/jsonConfigs.routes.js +8 -0
  105. package/src/routes/log.routes.js +111 -0
  106. package/src/routes/metrics.routes.js +9 -0
  107. package/src/routes/notificationAdmin.routes.js +15 -0
  108. package/src/routes/notifications.routes.js +12 -0
  109. package/src/routes/org.routes.js +31 -0
  110. package/src/routes/orgAdmin.routes.js +20 -0
  111. package/src/routes/publicAssets.routes.js +7 -0
  112. package/src/routes/stripeAdmin.routes.js +20 -0
  113. package/src/routes/user.routes.js +22 -0
  114. package/src/routes/userAdmin.routes.js +15 -0
  115. package/src/routes/waitingList.routes.js +13 -0
  116. package/src/routes/waitingListAdmin.routes.js +9 -0
  117. package/src/routes/webhook.routes.js +32 -0
  118. package/src/routes/workflowWebhook.routes.js +54 -0
  119. package/src/routes/workflows.routes.js +110 -0
  120. package/src/services/assets.service.js +110 -0
  121. package/src/services/audit.service.js +62 -0
  122. package/src/services/auditLogger.js +165 -0
  123. package/src/services/ejsVirtual.service.js +614 -0
  124. package/src/services/email.service.js +351 -0
  125. package/src/services/errorLogger.js +221 -0
  126. package/src/services/featureFlags.service.js +202 -0
  127. package/src/services/forms.service.js +214 -0
  128. package/src/services/globalSettings.service.js +49 -0
  129. package/src/services/headlessApiTokens.service.js +158 -0
  130. package/src/services/headlessCrypto.service.js +31 -0
  131. package/src/services/headlessModels.service.js +356 -0
  132. package/src/services/i18n.service.js +314 -0
  133. package/src/services/i18nInferredKeys.service.js +337 -0
  134. package/src/services/jsonConfigs.service.js +392 -0
  135. package/src/services/llm.service.js +749 -0
  136. package/src/services/migration.service.js +581 -0
  137. package/src/services/migrationAssets/fsLocal.js +58 -0
  138. package/src/services/migrationAssets/index.js +134 -0
  139. package/src/services/migrationAssets/s3.js +75 -0
  140. package/src/services/migrationAssets/sftp.js +92 -0
  141. package/src/services/notification.service.js +212 -0
  142. package/src/services/objectStorage.service.js +514 -0
  143. package/src/services/seoConfig.service.js +402 -0
  144. package/src/services/storage.js +150 -0
  145. package/src/services/stripe.service.js +185 -0
  146. package/src/services/stripeHelper.service.js +264 -0
  147. package/src/services/uploadNamespaces.service.js +326 -0
  148. package/src/services/webhook.service.js +157 -0
  149. package/src/services/workflow.service.js +271 -0
  150. package/src/utils/asyncHandler.js +5 -0
  151. package/src/utils/encryption.js +80 -0
  152. package/src/utils/jwt.js +40 -0
  153. package/src/utils/orgRoles.js +156 -0
  154. package/src/utils/validation.js +26 -0
  155. package/src/utils/webhookRetry.js +93 -0
  156. package/views/admin-assets.ejs +444 -0
  157. package/views/admin-audit.ejs +283 -0
  158. package/views/admin-coolify-deploy.ejs +207 -0
  159. package/views/admin-dashboard-home.ejs +291 -0
  160. package/views/admin-dashboard.ejs +397 -0
  161. package/views/admin-ejs-virtual.ejs +280 -0
  162. package/views/admin-errors.ejs +368 -0
  163. package/views/admin-feature-flags.ejs +390 -0
  164. package/views/admin-forms.ejs +526 -0
  165. package/views/admin-global-settings.ejs +436 -0
  166. package/views/admin-headless.ejs +2020 -0
  167. package/views/admin-i18n-locales.ejs +221 -0
  168. package/views/admin-i18n.ejs +728 -0
  169. package/views/admin-json-configs.ejs +410 -0
  170. package/views/admin-llm.ejs +884 -0
  171. package/views/admin-metrics.ejs +274 -0
  172. package/views/admin-migration.ejs +814 -0
  173. package/views/admin-notifications.ejs +430 -0
  174. package/views/admin-organizations.ejs +984 -0
  175. package/views/admin-seo-config.ejs +673 -0
  176. package/views/admin-stripe-pricing.ejs +558 -0
  177. package/views/admin-test.ejs +342 -0
  178. package/views/admin-users.ejs +452 -0
  179. package/views/admin-waiting-list.ejs +547 -0
  180. package/views/admin-webhooks.ejs +329 -0
  181. package/views/admin-workflows.ejs +310 -0
  182. package/views/partials/admin-assets-script.ejs +2022 -0
  183. package/views/partials/admin-test-sidebar.ejs +14 -0
  184. package/views/partials/dashboard/nav-items.ejs +66 -0
  185. package/views/partials/dashboard/palette.ejs +63 -0
  186. package/views/partials/dashboard/sidebar.ejs +21 -0
  187. package/views/partials/dashboard/tab-bar.ejs +26 -0
  188. package/views/partials/footer.ejs +3 -0
@@ -0,0 +1,14 @@
1
+ <div class="w-80 bg-gray-800 text-white p-4 overflow-y-auto">
2
+ <h1 class="text-2xl font-bold mb-4">API Testing</h1>
3
+
4
+ <div class="mb-4">
5
+ <input
6
+ id="sidebar-search"
7
+ type="text"
8
+ placeholder="Search endpoints..."
9
+ class="w-full px-3 py-2 rounded bg-gray-900 text-white placeholder-gray-400 border border-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500"
10
+ />
11
+ </div>
12
+
13
+ <div class="space-y-2" id="endpoint-sidebar"></div>
14
+ </div>
@@ -0,0 +1,66 @@
1
+ <script>
2
+ (function() {
3
+ const adminPath = window.ADMIN_PATH || '<%= typeof adminPath !== "undefined" ? adminPath : "/admin" %>';
4
+ window.NAV_SECTIONS = [
5
+ {
6
+ title: 'Dashboard',
7
+ items: [
8
+ { id: 'overview', label: 'Overview', path: adminPath + '/stats/dashboard-home', icon: 'ti-layout-dashboard' },
9
+ ]
10
+ },
11
+ {
12
+ title: 'User Management',
13
+ items: [
14
+ { id: 'users', label: 'Users', path: adminPath + '/users', icon: 'ti-users' },
15
+ { id: 'orgs', label: 'Organizations', path: adminPath + '/organizations', icon: 'ti-building-community' },
16
+ { id: 'notifications', label: 'Notifications', path: adminPath + '/notifications', icon: 'ti-bell' },
17
+ { id: 'invites', label: 'Waiting List', path: adminPath + '/waiting-list', icon: 'ti-mail-forward' },
18
+ ]
19
+ },
20
+ {
21
+ title: 'Content & Config',
22
+ items: [
23
+ { id: 'i18n', label: 'I18n Entries', path: adminPath + '/i18n', icon: 'ti-language' },
24
+ { id: 'locales', label: 'I18n Locales', path: adminPath + '/i18n/locales', icon: 'ti-world' },
25
+ { id: 'json', label: 'JSON Configs', path: adminPath + '/json-configs', icon: 'ti-braces' },
26
+ { id: 'seo', label: 'SEO Config', path: adminPath + '/seo-config', icon: 'ti-search' },
27
+ { id: 'assets', label: 'Assets', path: adminPath + '/assets', icon: 'ti-photo' },
28
+ { id: 'headless', label: 'Headless CMS', path: adminPath + '/headless', icon: 'ti-table' },
29
+ ]
30
+ },
31
+ {
32
+ title: 'System & DevOps',
33
+ items: [
34
+ { id: 'settings', label: 'Global Settings', path: adminPath + '/global-settings', icon: 'ti-settings' },
35
+ { id: 'flags', label: 'Feature Flags', path: adminPath + '/feature-flags', icon: 'ti-flag' },
36
+ { id: 'ejs', label: 'Virtual EJS', path: adminPath + '/ejs-virtual', icon: 'ti-code' },
37
+ { id: 'migration', label: 'Migration', path: adminPath + '/migration', icon: 'ti-database-export' },
38
+ { id: 'webhooks', label: 'Webhooks', path: adminPath + '/webhooks', icon: 'ti-webhook' },
39
+ { id: 'coolify', label: 'Coolify Deploy', path: adminPath + '/coolify-deploy', icon: 'ti-rocket' },
40
+ ]
41
+ },
42
+ {
43
+ title: 'Monitoring & AI',
44
+ items: [
45
+ { id: 'audit', label: 'Audit Logs', path: adminPath + '/audit', icon: 'ti-history' },
46
+ { id: 'errors', label: 'Error Tracking', path: adminPath + '/errors', icon: 'ti-bug' },
47
+ { id: 'metrics', label: 'Metrics', path: adminPath + '/metrics', icon: 'ti-chart-bar' },
48
+ { id: 'llm', label: 'LLM/AI', path: adminPath + '/admin-llm', icon: 'ti-brain' },
49
+ ]
50
+ },
51
+ {
52
+ title: 'Billing & Forms',
53
+ items: [
54
+ { id: 'stripe', label: 'Stripe Pricing', path: adminPath + '/stripe-pricing', icon: 'ti-credit-card' },
55
+ { id: 'forms', label: 'Forms & Leads', path: adminPath + '/forms', icon: 'ti-forms' },
56
+ ]
57
+ },
58
+ {
59
+ title: 'Automation',
60
+ items: [
61
+ { id: 'workflows', label: 'Workflows', path: adminPath + '/workflows/all', icon: 'ti-robot' },
62
+ ]
63
+ }
64
+ ];
65
+ })();
66
+ </script>
@@ -0,0 +1,63 @@
1
+ <!-- Command Palette Component -->
2
+ <div v-if="showPalette" class="fixed inset-0 z-[100] flex items-start justify-center pt-[15vh] px-4">
3
+ <!-- Backdrop -->
4
+ <div class="fixed inset-0 bg-gray-900/50 backdrop-blur-sm" @click="closePalette"></div>
5
+
6
+ <!-- Palette Modal -->
7
+ <div class="relative w-full max-w-2xl bg-white rounded-xl shadow-2xl border border-gray-200 overflow-hidden flex flex-col">
8
+ <!-- Input -->
9
+ <div class="relative flex items-center px-4 py-4 border-b border-gray-200">
10
+ <i class="ti ti-search text-gray-400 text-xl mr-3"></i>
11
+ <input
12
+ ref="paletteInput"
13
+ v-model="paletteQuery"
14
+ type="text"
15
+ placeholder="Search modules... (↑↓ to navigate, Enter to select, Esc to close)"
16
+ class="flex-1 bg-transparent border-none focus:ring-0 text-lg text-gray-800"
17
+ @keydown.down.prevent="navigatePalette(1)"
18
+ @keydown.up.prevent="navigatePalette(-1)"
19
+ @keydown.enter.prevent="selectPaletteItem"
20
+ @keydown.esc="closePalette"
21
+ >
22
+ <div class="flex items-center gap-1 ml-4">
23
+ <kbd class="px-2 py-1 bg-gray-100 border border-gray-300 rounded text-xs text-gray-500 font-sans">ESC</kbd>
24
+ </div>
25
+ </div>
26
+
27
+ <!-- Results -->
28
+ <div class="max-height-[50vh] overflow-y-auto py-2">
29
+ <div v-if="filteredModules.length === 0" class="px-6 py-10 text-center text-gray-500">
30
+ <i class="ti ti-search-off text-4xl mb-2 opacity-20"></i>
31
+ <p>No modules found matching "{{ paletteQuery }}"</p>
32
+ </div>
33
+
34
+ <div v-else>
35
+ <button
36
+ v-for="(item, index) in filteredModules"
37
+ :key="item.id"
38
+ ref="resultItems"
39
+ @click="selectModule(item)"
40
+ @mouseover="paletteCursor = index"
41
+ :class="['w-full flex items-center px-6 py-3 text-left transition-colors', paletteCursor === index ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-gray-50']"
42
+ >
43
+ <i :class="['ti mr-4 text-xl', item.icon, paletteCursor === index ? 'text-blue-600' : 'text-gray-400']"></i>
44
+ <div class="flex-1">
45
+ <div class="font-medium">{{ item.label }}</div>
46
+ <div class="text-xs opacity-60">{{ item.sectionTitle }}</div>
47
+ </div>
48
+ <i v-if="paletteCursor === index" class="ti ti-corner-down-left text-blue-400"></i>
49
+ </button>
50
+ </div>
51
+ </div>
52
+
53
+ <!-- Footer -->
54
+ <div class="px-4 py-3 bg-gray-50 border-t border-gray-200 flex items-center justify-between text-[11px] text-gray-400">
55
+ <div class="flex gap-4">
56
+ <span><kbd class="bg-white border rounded px-1.5 py-0.5">↑↓</kbd> Navigate</span>
57
+ <span><kbd class="bg-white border rounded px-1.5 py-0.5">Enter</kbd> Select</span>
58
+ <span><kbd class="bg-white border rounded px-1.5 py-0.5">Esc</kbd> Close</span>
59
+ </div>
60
+ <div>Superbackend <span class="text-[10px] font-normal opacity-60 ml-1">(saasbackend)</span></div>
61
+ </div>
62
+ </div>
63
+ </div>
@@ -0,0 +1,21 @@
1
+ <!-- Sidebar Component -->
2
+ <aside class="w-64 bg-white border-r border-gray-200 flex flex-col overflow-y-auto shrink-0">
3
+ <nav class="flex-1 px-4 py-6 space-y-8">
4
+ <div v-for="section in navSections" :key="section.title">
5
+ <h3 class="px-4 text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2">
6
+ {{ section.title }}
7
+ </h3>
8
+ <div class="space-y-1">
9
+ <button
10
+ v-for="item in section.items"
11
+ :key="item.id"
12
+ @click="openTab(item)"
13
+ :class="['sidebar-link w-full flex items-center px-4 py-2 text-sm font-medium rounded-lg transition-colors', activeTabId === item.id ? 'bg-blue-50 text-blue-700 border-r-4 border-blue-700' : 'text-gray-600 hover:bg-gray-100']"
14
+ >
15
+ <i :class="['ti mr-3 text-lg', item.icon]"></i>
16
+ {{ item.label }}
17
+ </button>
18
+ </div>
19
+ </div>
20
+ </nav>
21
+ </aside>
@@ -0,0 +1,26 @@
1
+ <!-- Tab Bar Component -->
2
+ <div class="flex items-center bg-white border-b border-gray-200 overflow-x-auto no-scrollbar shrink-0 h-10 px-2 gap-1">
3
+ <div
4
+ v-for="tab in tabs"
5
+ :key="tab.id"
6
+ @click="activeTabId = tab.id"
7
+ :class="['group relative flex items-center h-8 min-w-[120px] max-w-[200px] px-3 rounded-t-md cursor-pointer transition-all border-x border-t',
8
+ activeTabId === tab.id ? 'bg-gray-50 border-gray-200 text-blue-700' : 'bg-transparent border-transparent text-gray-500 hover:bg-gray-100 hover:text-gray-700']"
9
+ >
10
+ <i :class="['ti text-base mr-2', tab.icon]"></i>
11
+ <span class="text-xs font-medium truncate flex-1 pr-4">{{ tab.label }}</span>
12
+ <button
13
+ @click.stop="closeTab(tab.id)"
14
+ class="absolute right-1.5 top-1/2 -translate-y-1/2 p-0.5 rounded-full hover:bg-gray-200 text-gray-400 hover:text-gray-600 opacity-0 group-hover:opacity-100 transition-opacity"
15
+ >
16
+ <i class="ti ti-x text-[10px]"></i>
17
+ </button>
18
+ <!-- Active Indicator -->
19
+ <div v-if="activeTabId === tab.id" class="absolute bottom-[-1px] left-0 right-0 h-[2px] bg-blue-600"></div>
20
+ </div>
21
+
22
+ <!-- Empty State Tab Placeholder if needed -->
23
+ <div v-if="tabs.length === 0" class="flex items-center px-4 text-[11px] text-gray-400 italic">
24
+ No open tabs
25
+ </div>
26
+ </div>
@@ -0,0 +1,3 @@
1
+ <footer class="mt-8 py-6 border-t border-gray-200 text-center text-sm text-gray-500">
2
+ Made with ❤️ by <a href="https://intrane.fr" target="_blank" class="hover:text-blue-600 transition-colors">Intrane.fr</a>
3
+ </footer>