@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.
- package/.commiat +4 -0
- package/.env.example +47 -0
- package/README.md +110 -0
- package/index.js +94 -0
- package/package.json +67 -0
- package/public/css/styles.css +139 -0
- package/public/js/animations.js +41 -0
- package/sdk/error-tracking/browser/package.json +16 -0
- package/sdk/error-tracking/browser/src/core.js +270 -0
- package/sdk/error-tracking/browser/src/embed.js +18 -0
- package/sdk/error-tracking/browser/src/index.js +1 -0
- package/server.js +5 -0
- package/src/admin/endpointRegistry.js +300 -0
- package/src/controllers/admin.controller.js +321 -0
- package/src/controllers/adminAssets.controller.js +530 -0
- package/src/controllers/adminAssetsStorage.controller.js +260 -0
- package/src/controllers/adminEjsVirtual.controller.js +354 -0
- package/src/controllers/adminFeatureFlags.controller.js +155 -0
- package/src/controllers/adminHeadless.controller.js +1071 -0
- package/src/controllers/adminI18n.controller.js +604 -0
- package/src/controllers/adminJsonConfigs.controller.js +97 -0
- package/src/controllers/adminLlm.controller.js +273 -0
- package/src/controllers/adminMigration.controller.js +257 -0
- package/src/controllers/adminSeoConfig.controller.js +515 -0
- package/src/controllers/adminStats.controller.js +121 -0
- package/src/controllers/adminUploadNamespaces.controller.js +208 -0
- package/src/controllers/assets.controller.js +248 -0
- package/src/controllers/auth.controller.js +93 -0
- package/src/controllers/billing.controller.js +223 -0
- package/src/controllers/featureFlags.controller.js +35 -0
- package/src/controllers/forms.controller.js +217 -0
- package/src/controllers/globalSettings.controller.js +252 -0
- package/src/controllers/headlessCrud.controller.js +126 -0
- package/src/controllers/i18n.controller.js +12 -0
- package/src/controllers/invite.controller.js +249 -0
- package/src/controllers/jsonConfigs.controller.js +19 -0
- package/src/controllers/metrics.controller.js +149 -0
- package/src/controllers/notificationAdmin.controller.js +264 -0
- package/src/controllers/notifications.controller.js +131 -0
- package/src/controllers/org.controller.js +357 -0
- package/src/controllers/orgAdmin.controller.js +491 -0
- package/src/controllers/stripeAdmin.controller.js +410 -0
- package/src/controllers/user.controller.js +361 -0
- package/src/controllers/userAdmin.controller.js +277 -0
- package/src/controllers/waitingList.controller.js +167 -0
- package/src/controllers/webhook.controller.js +200 -0
- package/src/middleware/auth.js +66 -0
- package/src/middleware/errorCapture.js +170 -0
- package/src/middleware/headlessApiTokenAuth.js +57 -0
- package/src/middleware/org.js +108 -0
- package/src/middleware.js +901 -0
- package/src/models/ActionEvent.js +31 -0
- package/src/models/ActivityLog.js +41 -0
- package/src/models/Asset.js +84 -0
- package/src/models/AuditEvent.js +93 -0
- package/src/models/EmailLog.js +28 -0
- package/src/models/ErrorAggregate.js +72 -0
- package/src/models/FormSubmission.js +41 -0
- package/src/models/GlobalSetting.js +38 -0
- package/src/models/HeadlessApiToken.js +24 -0
- package/src/models/HeadlessModelDefinition.js +41 -0
- package/src/models/I18nEntry.js +77 -0
- package/src/models/I18nLocale.js +33 -0
- package/src/models/Invite.js +70 -0
- package/src/models/JsonConfig.js +46 -0
- package/src/models/Notification.js +60 -0
- package/src/models/Organization.js +57 -0
- package/src/models/OrganizationMember.js +43 -0
- package/src/models/StripeCatalogItem.js +77 -0
- package/src/models/StripeWebhookEvent.js +57 -0
- package/src/models/User.js +89 -0
- package/src/models/VirtualEjsFile.js +60 -0
- package/src/models/VirtualEjsFileVersion.js +43 -0
- package/src/models/VirtualEjsGroupChange.js +32 -0
- package/src/models/WaitingList.js +41 -0
- package/src/models/Webhook.js +63 -0
- package/src/models/Workflow.js +29 -0
- package/src/models/WorkflowExecution.js +12 -0
- package/src/routes/admin.routes.js +26 -0
- package/src/routes/adminAssets.routes.js +28 -0
- package/src/routes/adminAssetsStorage.routes.js +13 -0
- package/src/routes/adminAudit.routes.js +196 -0
- package/src/routes/adminEjsVirtual.routes.js +17 -0
- package/src/routes/adminErrors.routes.js +164 -0
- package/src/routes/adminFeatureFlags.routes.js +12 -0
- package/src/routes/adminHeadless.routes.js +38 -0
- package/src/routes/adminI18n.routes.js +22 -0
- package/src/routes/adminJsonConfigs.routes.js +15 -0
- package/src/routes/adminLlm.routes.js +12 -0
- package/src/routes/adminMigration.routes.js +81 -0
- package/src/routes/adminSeoConfig.routes.js +20 -0
- package/src/routes/adminUploadNamespaces.routes.js +13 -0
- package/src/routes/assets.routes.js +21 -0
- package/src/routes/auth.routes.js +12 -0
- package/src/routes/billing.routes.js +11 -0
- package/src/routes/errorTracking.routes.js +31 -0
- package/src/routes/featureFlags.routes.js +9 -0
- package/src/routes/forms.routes.js +9 -0
- package/src/routes/formsAdmin.routes.js +13 -0
- package/src/routes/globalSettings.routes.js +18 -0
- package/src/routes/headless.routes.js +15 -0
- package/src/routes/i18n.routes.js +8 -0
- package/src/routes/invite.routes.js +9 -0
- package/src/routes/jsonConfigs.routes.js +8 -0
- package/src/routes/log.routes.js +111 -0
- package/src/routes/metrics.routes.js +9 -0
- package/src/routes/notificationAdmin.routes.js +15 -0
- package/src/routes/notifications.routes.js +12 -0
- package/src/routes/org.routes.js +31 -0
- package/src/routes/orgAdmin.routes.js +20 -0
- package/src/routes/publicAssets.routes.js +7 -0
- package/src/routes/stripeAdmin.routes.js +20 -0
- package/src/routes/user.routes.js +22 -0
- package/src/routes/userAdmin.routes.js +15 -0
- package/src/routes/waitingList.routes.js +13 -0
- package/src/routes/waitingListAdmin.routes.js +9 -0
- package/src/routes/webhook.routes.js +32 -0
- package/src/routes/workflowWebhook.routes.js +54 -0
- package/src/routes/workflows.routes.js +110 -0
- package/src/services/assets.service.js +110 -0
- package/src/services/audit.service.js +62 -0
- package/src/services/auditLogger.js +165 -0
- package/src/services/ejsVirtual.service.js +614 -0
- package/src/services/email.service.js +351 -0
- package/src/services/errorLogger.js +221 -0
- package/src/services/featureFlags.service.js +202 -0
- package/src/services/forms.service.js +214 -0
- package/src/services/globalSettings.service.js +49 -0
- package/src/services/headlessApiTokens.service.js +158 -0
- package/src/services/headlessCrypto.service.js +31 -0
- package/src/services/headlessModels.service.js +356 -0
- package/src/services/i18n.service.js +314 -0
- package/src/services/i18nInferredKeys.service.js +337 -0
- package/src/services/jsonConfigs.service.js +392 -0
- package/src/services/llm.service.js +749 -0
- package/src/services/migration.service.js +581 -0
- package/src/services/migrationAssets/fsLocal.js +58 -0
- package/src/services/migrationAssets/index.js +134 -0
- package/src/services/migrationAssets/s3.js +75 -0
- package/src/services/migrationAssets/sftp.js +92 -0
- package/src/services/notification.service.js +212 -0
- package/src/services/objectStorage.service.js +514 -0
- package/src/services/seoConfig.service.js +402 -0
- package/src/services/storage.js +150 -0
- package/src/services/stripe.service.js +185 -0
- package/src/services/stripeHelper.service.js +264 -0
- package/src/services/uploadNamespaces.service.js +326 -0
- package/src/services/webhook.service.js +157 -0
- package/src/services/workflow.service.js +271 -0
- package/src/utils/asyncHandler.js +5 -0
- package/src/utils/encryption.js +80 -0
- package/src/utils/jwt.js +40 -0
- package/src/utils/orgRoles.js +156 -0
- package/src/utils/validation.js +26 -0
- package/src/utils/webhookRetry.js +93 -0
- package/views/admin-assets.ejs +444 -0
- package/views/admin-audit.ejs +283 -0
- package/views/admin-coolify-deploy.ejs +207 -0
- package/views/admin-dashboard-home.ejs +291 -0
- package/views/admin-dashboard.ejs +397 -0
- package/views/admin-ejs-virtual.ejs +280 -0
- package/views/admin-errors.ejs +368 -0
- package/views/admin-feature-flags.ejs +390 -0
- package/views/admin-forms.ejs +526 -0
- package/views/admin-global-settings.ejs +436 -0
- package/views/admin-headless.ejs +2020 -0
- package/views/admin-i18n-locales.ejs +221 -0
- package/views/admin-i18n.ejs +728 -0
- package/views/admin-json-configs.ejs +410 -0
- package/views/admin-llm.ejs +884 -0
- package/views/admin-metrics.ejs +274 -0
- package/views/admin-migration.ejs +814 -0
- package/views/admin-notifications.ejs +430 -0
- package/views/admin-organizations.ejs +984 -0
- package/views/admin-seo-config.ejs +673 -0
- package/views/admin-stripe-pricing.ejs +558 -0
- package/views/admin-test.ejs +342 -0
- package/views/admin-users.ejs +452 -0
- package/views/admin-waiting-list.ejs +547 -0
- package/views/admin-webhooks.ejs +329 -0
- package/views/admin-workflows.ejs +310 -0
- package/views/partials/admin-assets-script.ejs +2022 -0
- package/views/partials/admin-test-sidebar.ejs +14 -0
- package/views/partials/dashboard/nav-items.ejs +66 -0
- package/views/partials/dashboard/palette.ejs +63 -0
- package/views/partials/dashboard/sidebar.ejs +21 -0
- package/views/partials/dashboard/tab-bar.ejs +26 -0
- package/views/partials/footer.ejs +3 -0
package/.commiat
ADDED
package/.env.example
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Server
|
|
2
|
+
PORT=3000
|
|
3
|
+
NODE_ENV=development
|
|
4
|
+
PUBLIC_URL=http://localhost:3000
|
|
5
|
+
BILLING_RETURN_URL_RELATIVE=/billing/view
|
|
6
|
+
|
|
7
|
+
# CORS Configuration
|
|
8
|
+
# Use * for all origins (default) or specify comma-separated list
|
|
9
|
+
# Examples:
|
|
10
|
+
# CORS_ORIGIN=*
|
|
11
|
+
# CORS_ORIGIN=http://localhost:3000
|
|
12
|
+
# CORS_ORIGIN=http://localhost:3000,https://app.com
|
|
13
|
+
CORS_ORIGIN=*
|
|
14
|
+
|
|
15
|
+
# Database
|
|
16
|
+
MONGODB_URI=mongodb://localhost:27017/myappdb
|
|
17
|
+
|
|
18
|
+
# JWT Secrets (change these in production!)
|
|
19
|
+
JWT_ACCESS_SECRET=your-access-secret-change-me
|
|
20
|
+
JWT_REFRESH_SECRET=your-refresh-secret-change-me
|
|
21
|
+
|
|
22
|
+
# Stripe
|
|
23
|
+
STRIPE_SECRET_KEY=sk_test_...
|
|
24
|
+
STRIPE_WEBHOOK_SECRET=whsec_...
|
|
25
|
+
|
|
26
|
+
# Admin Basic Auth
|
|
27
|
+
ADMIN_USERNAME=admin
|
|
28
|
+
ADMIN_PASSWORD=change-me-in-production
|
|
29
|
+
|
|
30
|
+
# Emailing
|
|
31
|
+
RESEND_API_KEY=
|
|
32
|
+
|
|
33
|
+
# File Storage (filesystem fallback)
|
|
34
|
+
UPLOAD_DIR=uploads
|
|
35
|
+
MAX_FILE_SIZE=10485760
|
|
36
|
+
MAX_FILE_SIZE_HARD_CAP=10485760
|
|
37
|
+
|
|
38
|
+
# Multer file size limit in bytes (used by Express middleware) (multer ceiling)
|
|
39
|
+
#MULTER_FILE_SIZE_LIMIT=10485760
|
|
40
|
+
|
|
41
|
+
# S3 / MinIO (optional - enables S3 backend when all are set)
|
|
42
|
+
# S3_ENDPOINT=http://localhost:9000
|
|
43
|
+
# S3_REGION=us-east-1
|
|
44
|
+
# S3_ACCESS_KEY_ID=minioadmin
|
|
45
|
+
# S3_SECRET_ACCESS_KEY=minioadmin
|
|
46
|
+
# S3_BUCKET=saasbackend
|
|
47
|
+
# S3_FORCE_PATH_STYLE=true
|
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# SuperBackend
|
|
2
|
+
|
|
3
|
+
Node.js middleware that gives your project backend superpowers. Handles authentication, billing, audit logs, file storage, error tracking, and more—all in one cohesive layer.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Authentication & Security**: JWT-based auth with refresh tokens, organization management, and granular RBAC system
|
|
10
|
+
- **Billing & Subscriptions**: Full Stripe integration with checkout sessions, billing portal, and webhook processing
|
|
11
|
+
- **File Storage**: Unified S3/filesystem API with multipart uploads, namespace support, and public/private visibility
|
|
12
|
+
- **Admin Panel**: Basic-auth protected UI for user management, settings, metrics, and operational tasks
|
|
13
|
+
- **Audit Logging**: Append-only audit trail for security and compliance with admin search interface
|
|
14
|
+
- **Error Tracking**: Frontend + backend error aggregation with fingerprinting and admin triage UI
|
|
15
|
+
- **Notifications**: Multi-channel system with in-app notifications and email alerts
|
|
16
|
+
- **Feature Flags**: Dynamic feature toggles with rollout percentages and allow lists
|
|
17
|
+
- **Global Settings**: Runtime configuration with encrypted storage support for secrets
|
|
18
|
+
- **Forms & Leads**: Custom form definitions, lead capture, webhooks, and multi-tenant support
|
|
19
|
+
- **Internationalization**: JSON-based localization with server-side and client-side integration
|
|
20
|
+
- **Organizations**: Multi-tenant support with role-based member management
|
|
21
|
+
- **Headless CMS**: JSON configs, SEO configuration, and content management
|
|
22
|
+
- **Email System**: SMTP integration with templates and delivery tracking
|
|
23
|
+
- **Webhooks**: Outgoing webhook system for event-driven integrations
|
|
24
|
+
- **Metrics & Activity**: Usage tracking and analytics for business insights
|
|
25
|
+
- **Middleware Mode**: Drop-in Express middleware that preserves your app structure
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install superbackend
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
or
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
yarn add superbackend
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Quick Start
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
require('dotenv').config();
|
|
47
|
+
const express = require('express');
|
|
48
|
+
const { middleware } = require('saasbackend');
|
|
49
|
+
|
|
50
|
+
const app = express();
|
|
51
|
+
|
|
52
|
+
// Mount under /saas prefix (recommended)
|
|
53
|
+
app.use('/saas', middleware({
|
|
54
|
+
mongodbUri: process.env.MONGODB_URI,
|
|
55
|
+
corsOrigin: process.env.CORS_ORIGIN || '*',
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
app.listen(3000, () => {
|
|
59
|
+
console.log('Server running on http://localhost:3000');
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
SuperBackend is fully configurable. Example options:
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
const backend = new SuperBackend({
|
|
71
|
+
rbac: { /* roles, permissions */ },
|
|
72
|
+
logging: { level: 'info', output: 'console' },
|
|
73
|
+
metrics: true,
|
|
74
|
+
queues: { redisUrl: 'redis://localhost:6379' },
|
|
75
|
+
audit: true,
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Documentation
|
|
82
|
+
|
|
83
|
+
See the `docs/features/` directory for detailed guides:
|
|
84
|
+
- [Getting Started](docs/features/getting-started.md)
|
|
85
|
+
- [Core Configuration](docs/features/core-configuration.md)
|
|
86
|
+
- [Admin API Usage](docs/features/admin-api-usage.md)
|
|
87
|
+
- [Billing & Subscriptions](docs/features/billing-and-subscriptions.md)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Contributing
|
|
92
|
+
|
|
93
|
+
SuperBackend is open-source and welcomes contributions!
|
|
94
|
+
Please read the [CONTRIBUTING.md](#) for guidelines.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
<!-- Made by Intrane block -->
|
|
99
|
+
<p><em>Part of the Intrane suite of practical developer tools</em></p>
|
|
100
|
+
<a href="https://intrane.fr" target="_blank">
|
|
101
|
+
<img src="https://img.shields.io/badge/Intrane-intranefr-blue?style=flat-square" alt="Intrane"/>
|
|
102
|
+
</a>
|
|
103
|
+
|
|
104
|
+
<a href="https://www.npmjs.com/package/superbackend" target="_blank">
|
|
105
|
+
<img src="https://img.shields.io/npm/v/superbackend?style=flat-square" alt="npm"/>
|
|
106
|
+
</a>
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
MIT © 2026 Intrane
|
package/index.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require("dotenv").config({ path: process.env.ENV_FILE || ".env" });
|
|
2
|
+
const express = require("express");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates the SaaS backend as Express middleware
|
|
6
|
+
* @param {Object} options - Configuration options
|
|
7
|
+
* @param {string} options.mongodbUri - MongoDB connection string
|
|
8
|
+
* @param {string} options.corsOrigin - CORS origin(s)
|
|
9
|
+
* @param {string} options.jwtSecret - JWT secret for authentication
|
|
10
|
+
* @param {Object} options.dbConnection - Existing Mongoose connection
|
|
11
|
+
* @returns {express.Router} Configured Express router
|
|
12
|
+
*/
|
|
13
|
+
const middleware = require("./src/middleware");
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Creates and starts a standalone SaaS backend server
|
|
17
|
+
* @param {Object} options - Configuration options
|
|
18
|
+
* @param {number} options.port - Port to listen on
|
|
19
|
+
* @param {string} options.mongodbUri - MongoDB connection string
|
|
20
|
+
* @param {string} options.corsOrigin - CORS origin(s)
|
|
21
|
+
* @returns {Object} Express app and server instance
|
|
22
|
+
*/
|
|
23
|
+
function startServer(options = {}) {
|
|
24
|
+
const app = express();
|
|
25
|
+
const PORT = options.port || process.env.PORT || 3000;
|
|
26
|
+
|
|
27
|
+
app.use(module.exports.middleware(options));
|
|
28
|
+
|
|
29
|
+
// Start server
|
|
30
|
+
const server = app.listen(PORT, () => {
|
|
31
|
+
console.log(`🚀 SaaSBackend standalone server running on http://localhost:${PORT}`);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return { app, server };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const saasbackend = {
|
|
38
|
+
server: startServer,
|
|
39
|
+
middleware: (options = {}) => {
|
|
40
|
+
globalThis.saasbackend = saasbackend;
|
|
41
|
+
return middleware(options);
|
|
42
|
+
},
|
|
43
|
+
services: {
|
|
44
|
+
email: require("./src/services/email.service"),
|
|
45
|
+
storage: require("./src/services/storage"),
|
|
46
|
+
i18n: require("./src/services/i18n.service"),
|
|
47
|
+
audit: require("./src/services/audit.service"),
|
|
48
|
+
globalSettings: require("./src/services/globalSettings.service"),
|
|
49
|
+
jsonConfigs: require("./src/services/jsonConfigs.service"),
|
|
50
|
+
assets: require("./src/services/assets.service"),
|
|
51
|
+
uploadNamespaces: require("./src/services/uploadNamespaces.service"),
|
|
52
|
+
llm: require("./src/services/llm.service"),
|
|
53
|
+
migration: require("./src/services/migration.service"),
|
|
54
|
+
ejsVirtual: require("./src/services/ejsVirtual.service"),
|
|
55
|
+
forms: require("./src/services/forms.service"),
|
|
56
|
+
webhooks: require("./src/services/webhook.service"),
|
|
57
|
+
workflow: require("./src/services/workflow.service"),
|
|
58
|
+
},
|
|
59
|
+
models: {
|
|
60
|
+
ActionEvent: require("./src/models/ActionEvent"),
|
|
61
|
+
ActivityLog: require("./src/models/ActivityLog"),
|
|
62
|
+
Asset: require("./src/models/Asset"),
|
|
63
|
+
AuditEvent: require("./src/models/AuditEvent"),
|
|
64
|
+
EmailLog: require("./src/models/EmailLog"),
|
|
65
|
+
ErrorAggregate: require("./src/models/ErrorAggregate"),
|
|
66
|
+
FormSubmission: require("./src/models/FormSubmission"),
|
|
67
|
+
GlobalSetting: require("./src/models/GlobalSetting"),
|
|
68
|
+
I18nEntry: require("./src/models/I18nEntry"),
|
|
69
|
+
I18nLocale: require("./src/models/I18nLocale"),
|
|
70
|
+
Invite: require("./src/models/Invite"),
|
|
71
|
+
JsonConfig: require("./src/models/JsonConfig"),
|
|
72
|
+
Notification: require("./src/models/Notification"),
|
|
73
|
+
Organization: require("./src/models/Organization"),
|
|
74
|
+
OrganizationMember: require("./src/models/OrganizationMember"),
|
|
75
|
+
StripeCatalogItem: require("./src/models/StripeCatalogItem"),
|
|
76
|
+
StripeWebhookEvent: require("./src/models/StripeWebhookEvent"),
|
|
77
|
+
User: require("./src/models/User"),
|
|
78
|
+
WaitingList: require("./src/models/WaitingList"),
|
|
79
|
+
VirtualEjsFile: require("./src/models/VirtualEjsFile"),
|
|
80
|
+
VirtualEjsFileVersion: require("./src/models/VirtualEjsFileVersion"),
|
|
81
|
+
VirtualEjsGroupChange: require("./src/models/VirtualEjsGroupChange"),
|
|
82
|
+
Webhook: require("./src/models/Webhook"),
|
|
83
|
+
Workflow: require("./src/models/Workflow"),
|
|
84
|
+
WorkflowExecution: require("./src/models/WorkflowExecution"),
|
|
85
|
+
},
|
|
86
|
+
helpers: {
|
|
87
|
+
auth: require("./src/middleware/auth"),
|
|
88
|
+
org: require("./src/middleware/org"),
|
|
89
|
+
i18n: require("./src/services/i18n.service"),
|
|
90
|
+
jsonConfigs: require("./src/services/jsonConfigs.service"),
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
module.exports = saasbackend;
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intranefr/superbackend",
|
|
3
|
+
"version": "1.4.3",
|
|
4
|
+
"description": "Node.js middleware that gives your project backend superpowers",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "node server.js",
|
|
8
|
+
"dev": "nodemon server.js",
|
|
9
|
+
"start:minio": "docker compose -f compose.standalone.yml --profile minio-only up -d minio",
|
|
10
|
+
"minio:envs": "node -e \"console.log(['S3_ENDPOINT=http://localhost:9000','S3_REGION=us-east-1','S3_ACCESS_KEY_ID=minioadmin','S3_SECRET_ACCESS_KEY=minioadmin','S3_BUCKET=saasbackend','S3_FORCE_PATH_STYLE=true'].join('\\n'))\"",
|
|
11
|
+
"build:sdk:error-tracking:browser": "esbuild sdk/error-tracking/browser/src/embed.js --bundle --format=iife --global-name=saasbackendErrorTrackingEmbed --outfile=sdk/error-tracking/browser/dist/embed.iife.js",
|
|
12
|
+
"test": "jest",
|
|
13
|
+
"test:watch": "jest --watch",
|
|
14
|
+
"test:coverage": "jest --coverage"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"substack",
|
|
18
|
+
"notes",
|
|
19
|
+
"automation",
|
|
20
|
+
"ai"
|
|
21
|
+
],
|
|
22
|
+
"author": "Javier Leandro Arancibia <arancibia.javier@gmail.com>",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/javimosch/superbackend"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://javimosch.github.io/superbackend/",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/javimosch/superbackend/issues"
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@aws-sdk/client-s3": "^3.0.0",
|
|
34
|
+
"axios": "^1.13.2",
|
|
35
|
+
"bcryptjs": "^2.4.3",
|
|
36
|
+
"cheerio": "^1.0.0-rc.12",
|
|
37
|
+
"cors": "^2.8.5",
|
|
38
|
+
"dotenv": "^16.3.1",
|
|
39
|
+
"ejs": "^3.1.9",
|
|
40
|
+
"express": "^4.18.2",
|
|
41
|
+
"jsonwebtoken": "^9.0.2",
|
|
42
|
+
"mongoose": "^8.0.0",
|
|
43
|
+
"multer": "^1.4.5-lts.1",
|
|
44
|
+
"openai": "^4.0.0",
|
|
45
|
+
"resend": "^6.4.0",
|
|
46
|
+
"ssh2-sftp-client": "^12.0.1",
|
|
47
|
+
"stripe": "^14.0.0",
|
|
48
|
+
"vm2": "^3.10.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"esbuild": "^0.25.0",
|
|
52
|
+
"jest": "^29.7.0",
|
|
53
|
+
"nodemon": "^3.0.1",
|
|
54
|
+
"supertest": "^7.1.4"
|
|
55
|
+
},
|
|
56
|
+
"jest": {
|
|
57
|
+
"testEnvironment": "node",
|
|
58
|
+
"collectCoverageFrom": [
|
|
59
|
+
"src/**/*.js",
|
|
60
|
+
"!src/**/*.test.js"
|
|
61
|
+
],
|
|
62
|
+
"testMatch": [
|
|
63
|
+
"**/__tests__/**/*.js",
|
|
64
|
+
"**/*.test.js"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* Custom Animations and Styles */
|
|
2
|
+
|
|
3
|
+
/* Fade in animations */
|
|
4
|
+
.fade-in {
|
|
5
|
+
animation: fadeIn 0.8s ease-in;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.fade-in-delayed {
|
|
9
|
+
animation: fadeIn 0.8s ease-in 0.3s both;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@keyframes fadeIn {
|
|
13
|
+
from {
|
|
14
|
+
opacity: 0;
|
|
15
|
+
transform: translateY(20px);
|
|
16
|
+
}
|
|
17
|
+
to {
|
|
18
|
+
opacity: 1;
|
|
19
|
+
transform: translateY(0);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Floating note icons animation */
|
|
24
|
+
.note-icon {
|
|
25
|
+
position: absolute;
|
|
26
|
+
animation: float 8s ease-in-out infinite;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes float {
|
|
30
|
+
0%, 100% {
|
|
31
|
+
opacity: 0.1;
|
|
32
|
+
transform: translateY(0) translateX(0);
|
|
33
|
+
}
|
|
34
|
+
25% {
|
|
35
|
+
opacity: 0.3;
|
|
36
|
+
transform: translateY(-100px) translateX(50px);
|
|
37
|
+
}
|
|
38
|
+
50% {
|
|
39
|
+
opacity: 0.2;
|
|
40
|
+
transform: translateY(-200px) translateX(-30px);
|
|
41
|
+
}
|
|
42
|
+
75% {
|
|
43
|
+
opacity: 0.3;
|
|
44
|
+
transform: translateY(-300px) translateX(70px);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Floating cards animation */
|
|
49
|
+
.float-card {
|
|
50
|
+
animation: floatCard 3s ease-in-out infinite;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@keyframes floatCard {
|
|
54
|
+
0%, 100% {
|
|
55
|
+
transform: translateY(0);
|
|
56
|
+
}
|
|
57
|
+
50% {
|
|
58
|
+
transform: translateY(-10px);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* CTA Button pulse effect */
|
|
63
|
+
.cta-button {
|
|
64
|
+
animation: pulse 2s ease-in-out infinite;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@keyframes pulse {
|
|
68
|
+
0%, 100% {
|
|
69
|
+
box-shadow: 0 10px 25px rgba(126, 211, 33, 0.3);
|
|
70
|
+
}
|
|
71
|
+
50% {
|
|
72
|
+
box-shadow: 0 15px 35px rgba(126, 211, 33, 0.5);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Scroll reveal animation */
|
|
77
|
+
.scroll-reveal {
|
|
78
|
+
opacity: 0;
|
|
79
|
+
transform: translateY(30px);
|
|
80
|
+
transition: opacity 0.6s ease, transform 0.6s ease;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.scroll-reveal.revealed {
|
|
84
|
+
opacity: 1;
|
|
85
|
+
transform: translateY(0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Feature card hover effects */
|
|
89
|
+
.feature-card {
|
|
90
|
+
transition: all 0.3s ease;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.feature-card:hover {
|
|
94
|
+
transform: translateY(-8px);
|
|
95
|
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Testimonial card effects */
|
|
99
|
+
.testimonial-card {
|
|
100
|
+
transition: all 0.3s ease;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.testimonial-card:hover {
|
|
104
|
+
transform: translateY(-4px);
|
|
105
|
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Pricing card effects */
|
|
109
|
+
.pricing-card {
|
|
110
|
+
transition: all 0.3s ease;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.pricing-card:hover {
|
|
114
|
+
transform: scale(1.02);
|
|
115
|
+
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Smooth scrolling */
|
|
119
|
+
html {
|
|
120
|
+
scroll-behavior: smooth;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Custom scrollbar */
|
|
124
|
+
::-webkit-scrollbar {
|
|
125
|
+
width: 10px;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
::-webkit-scrollbar-track {
|
|
129
|
+
background: #f1f1f1;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
::-webkit-scrollbar-thumb {
|
|
133
|
+
background: #4A90E2;
|
|
134
|
+
border-radius: 5px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
::-webkit-scrollbar-thumb:hover {
|
|
138
|
+
background: #357ABD;
|
|
139
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Intersection Observer for scroll animations
|
|
2
|
+
const observerOptions = {
|
|
3
|
+
threshold: 0.1,
|
|
4
|
+
rootMargin: '0px 0px -100px 0px'
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const observer = new IntersectionObserver((entries) => {
|
|
8
|
+
entries.forEach(entry => {
|
|
9
|
+
if (entry.isIntersecting) {
|
|
10
|
+
entry.target.classList.add('revealed');
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}, observerOptions);
|
|
14
|
+
|
|
15
|
+
// Observe all scroll-reveal elements
|
|
16
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
17
|
+
const scrollElements = document.querySelectorAll('.scroll-reveal');
|
|
18
|
+
scrollElements.forEach(el => observer.observe(el));
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Smooth scroll for anchor links
|
|
22
|
+
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
23
|
+
anchor.addEventListener('click', function (e) {
|
|
24
|
+
const href = this.getAttribute('href');
|
|
25
|
+
if (href !== '#' && href !== '#demo') {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
const target = document.querySelector(href);
|
|
28
|
+
if (target) {
|
|
29
|
+
target.scrollIntoView({
|
|
30
|
+
behavior: 'smooth',
|
|
31
|
+
block: 'start'
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Add loading animation class
|
|
39
|
+
window.addEventListener('load', () => {
|
|
40
|
+
document.body.classList.add('loaded');
|
|
41
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@saasbackend/error-tracking-browser-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"import": "./src/index.js"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "esbuild src/embed.js --bundle --format=iife --global-name=saasbackendErrorTrackingEmbed --outfile=dist/embed.iife.js --minify"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"esbuild": "^0.27.2"
|
|
15
|
+
}
|
|
16
|
+
}
|