@xbg.solutions/create-backend 1.0.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 (32) hide show
  1. package/bin/create-backend.js +3 -0
  2. package/lib/cli.d.ts +12 -0
  3. package/lib/cli.js +55 -0
  4. package/lib/cli.js.map +1 -0
  5. package/lib/commands/add-util.d.ts +9 -0
  6. package/lib/commands/add-util.js +119 -0
  7. package/lib/commands/add-util.js.map +1 -0
  8. package/lib/commands/init.d.ts +11 -0
  9. package/lib/commands/init.js +372 -0
  10. package/lib/commands/init.js.map +1 -0
  11. package/lib/commands/sync.d.ts +10 -0
  12. package/lib/commands/sync.js +161 -0
  13. package/lib/commands/sync.js.map +1 -0
  14. package/lib/utils-registry.d.ts +25 -0
  15. package/lib/utils-registry.js +187 -0
  16. package/lib/utils-registry.js.map +1 -0
  17. package/package.json +38 -0
  18. package/src/project-template/__examples__/README.md +559 -0
  19. package/src/project-template/__examples__/blog-platform.model.ts +528 -0
  20. package/src/project-template/__examples__/communications-usage.ts +175 -0
  21. package/src/project-template/__examples__/ecommerce-store.model.ts +1200 -0
  22. package/src/project-template/__examples__/saas-multi-tenant.model.ts +798 -0
  23. package/src/project-template/__examples__/user.model.ts +221 -0
  24. package/src/project-template/__scripts__/deploy.js +115 -0
  25. package/src/project-template/__scripts__/generate.js +122 -0
  26. package/src/project-template/__scripts__/setup.js +425 -0
  27. package/src/project-template/__scripts__/validate.js +325 -0
  28. package/src/project-template/firebase.json +32 -0
  29. package/src/project-template/firestore.rules +12 -0
  30. package/src/project-template/functions/jest.config.js +49 -0
  31. package/src/project-template/functions/src/index.ts +46 -0
  32. package/src/project-template/functions/tsconfig.json +38 -0
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * Sync Command
4
+ * Updates an existing project with latest boilerplate changes
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.syncProject = syncProject;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs-extra"));
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const child_process_1 = require("child_process");
48
+ const utils_registry_1 = require("../utils-registry");
49
+ async function syncProject(options) {
50
+ const projectDir = path.resolve(options.directory);
51
+ const functionsDir = path.join(projectDir, 'functions');
52
+ console.log(chalk_1.default.bold.blue('\n── XBG Backend Sync ────────────────────────────\n'));
53
+ // Verify this is an XBG project
54
+ if (!await fs.pathExists(path.join(functionsDir, 'package.json'))) {
55
+ console.error(chalk_1.default.red('Not an XBG backend project. Run from the project root.'));
56
+ process.exit(1);
57
+ }
58
+ const result = {
59
+ packagesUpdated: [],
60
+ packagesAdded: [],
61
+ filesUpdated: [],
62
+ newUtilitiesAvailable: [],
63
+ };
64
+ // Check for package updates
65
+ console.log(chalk_1.default.cyan('Checking for package updates...\n'));
66
+ const pkgJson = await fs.readJson(path.join(functionsDir, 'package.json'));
67
+ const deps = pkgJson.dependencies || {};
68
+ // Check installed @xbg packages
69
+ const installedXbgPackages = Object.keys(deps).filter((d) => d.startsWith('@xbg/'));
70
+ for (const pkg of installedXbgPackages) {
71
+ const currentVersion = deps[pkg];
72
+ try {
73
+ const latestVersion = (0, child_process_1.execSync)(`npm view ${pkg} version 2>/dev/null`, {
74
+ encoding: 'utf8',
75
+ timeout: 10000,
76
+ }).trim();
77
+ if (latestVersion && currentVersion !== `^${latestVersion}`) {
78
+ result.packagesUpdated.push(`${pkg}: ${currentVersion} -> ^${latestVersion}`);
79
+ console.log(chalk_1.default.yellow(` Update available: ${pkg} ${currentVersion} -> ^${latestVersion}`));
80
+ }
81
+ else {
82
+ console.log(chalk_1.default.green(` Up to date: ${pkg} ${currentVersion}`));
83
+ }
84
+ }
85
+ catch (_a) {
86
+ console.log(chalk_1.default.dim(` Skipped: ${pkg} (not published yet)`));
87
+ }
88
+ }
89
+ // Check for new utilities available
90
+ const allPackageNames = utils_registry_1.UTILITY_REGISTRY.map((u) => u.package);
91
+ const newUtils = allPackageNames.filter((pkg) => !installedXbgPackages.includes(pkg));
92
+ if (newUtils.length > 0) {
93
+ result.newUtilitiesAvailable = newUtils;
94
+ console.log(chalk_1.default.cyan(`\n${newUtils.length} additional utilities available:`));
95
+ for (const pkg of newUtils) {
96
+ const util = utils_registry_1.UTILITY_REGISTRY.find((u) => u.package === pkg);
97
+ if (util) {
98
+ console.log(chalk_1.default.dim(` ${util.name}: ${util.description} (${pkg})`));
99
+ }
100
+ }
101
+ console.log(chalk_1.default.dim(`\n Run ${chalk_1.default.bold('npx @xbg/create-backend add-util')} to add utilities.`));
102
+ }
103
+ // Sync scaffold files (tsconfig, scripts)
104
+ console.log(chalk_1.default.cyan('\nChecking scaffold files...\n'));
105
+ const templateDir = path.resolve(__dirname, '../../src/project-template');
106
+ // Check scripts
107
+ const scriptsDir = path.join(templateDir, '__scripts__');
108
+ if (await fs.pathExists(scriptsDir)) {
109
+ const scripts = await fs.readdir(scriptsDir);
110
+ for (const script of scripts) {
111
+ const templateScript = path.join(scriptsDir, script);
112
+ const projectScript = path.join(projectDir, '__scripts__', script);
113
+ if (!await fs.pathExists(projectScript)) {
114
+ if (!options.checkOnly) {
115
+ await fs.copy(templateScript, projectScript);
116
+ result.filesUpdated.push(`__scripts__/${script}`);
117
+ console.log(chalk_1.default.green(` Added: __scripts__/${script}`));
118
+ }
119
+ else {
120
+ console.log(chalk_1.default.yellow(` Missing: __scripts__/${script}`));
121
+ }
122
+ }
123
+ else {
124
+ const templateContent = await fs.readFile(templateScript, 'utf8');
125
+ const projectContent = await fs.readFile(projectScript, 'utf8');
126
+ if (templateContent !== projectContent) {
127
+ if (!options.checkOnly) {
128
+ await fs.copy(templateScript, projectScript);
129
+ result.filesUpdated.push(`__scripts__/${script}`);
130
+ console.log(chalk_1.default.yellow(` Updated: __scripts__/${script}`));
131
+ }
132
+ else {
133
+ console.log(chalk_1.default.yellow(` Outdated: __scripts__/${script}`));
134
+ }
135
+ }
136
+ else {
137
+ console.log(chalk_1.default.green(` Current: __scripts__/${script}`));
138
+ }
139
+ }
140
+ }
141
+ }
142
+ // Apply updates
143
+ if (!options.checkOnly && result.packagesUpdated.length > 0) {
144
+ console.log(chalk_1.default.cyan('\nUpdating packages...\n'));
145
+ try {
146
+ (0, child_process_1.execSync)('npm update', { cwd: functionsDir, stdio: 'inherit' });
147
+ console.log(chalk_1.default.green('Packages updated.'));
148
+ }
149
+ catch (_b) {
150
+ console.error(chalk_1.default.red('Failed to update packages. Run npm update manually.'));
151
+ }
152
+ }
153
+ // Summary
154
+ console.log(chalk_1.default.bold.green(`\n── Sync Complete ───────────────────────────────\n`));
155
+ console.log(` Packages checked: ${installedXbgPackages.length}`);
156
+ console.log(` Updates available: ${result.packagesUpdated.length}`);
157
+ console.log(` Files updated: ${result.filesUpdated.length}`);
158
+ console.log(` New utils: ${result.newUtilitiesAvailable.length}`);
159
+ console.log('');
160
+ }
161
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Registry of available @xbg/utils-* packages
3
+ * Used by the CLI to offer utility selection during project init/sync
4
+ */
5
+ export interface UtilityDefinition {
6
+ name: string;
7
+ package: string;
8
+ description: string;
9
+ category: 'core' | 'data' | 'communication' | 'integration' | 'security' | 'infrastructure';
10
+ alwaysIncluded?: boolean;
11
+ envVars?: string[];
12
+ }
13
+ export declare const UTILITY_REGISTRY: UtilityDefinition[];
14
+ /**
15
+ * Get utilities that are always included
16
+ */
17
+ export declare function getRequiredUtilities(): UtilityDefinition[];
18
+ /**
19
+ * Get utilities available for selection
20
+ */
21
+ export declare function getOptionalUtilities(): UtilityDefinition[];
22
+ /**
23
+ * Get utilities grouped by category
24
+ */
25
+ export declare function getUtilitiesByCategory(): Record<string, UtilityDefinition[]>;
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Registry of available @xbg/utils-* packages
4
+ * Used by the CLI to offer utility selection during project init/sync
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.UTILITY_REGISTRY = void 0;
8
+ exports.getRequiredUtilities = getRequiredUtilities;
9
+ exports.getOptionalUtilities = getOptionalUtilities;
10
+ exports.getUtilitiesByCategory = getUtilitiesByCategory;
11
+ exports.UTILITY_REGISTRY = [
12
+ // Core utilities (always included with @xbg/backend-core)
13
+ {
14
+ name: 'Logger',
15
+ package: '@xbg/utils-logger',
16
+ description: 'Structured logging with PII sanitization',
17
+ category: 'core',
18
+ alwaysIncluded: true,
19
+ },
20
+ {
21
+ name: 'Events',
22
+ package: '@xbg/utils-events',
23
+ description: 'Event bus for domain events',
24
+ category: 'core',
25
+ alwaysIncluded: true,
26
+ },
27
+ {
28
+ name: 'Errors',
29
+ package: '@xbg/utils-errors',
30
+ description: 'Custom error classes',
31
+ category: 'core',
32
+ alwaysIncluded: true,
33
+ },
34
+ // Data utilities
35
+ {
36
+ name: 'Firestore Connector',
37
+ package: '@xbg/utils-firestore-connector',
38
+ description: 'Multi-database Firestore access and Firebase Admin SDK init',
39
+ category: 'data',
40
+ alwaysIncluded: true,
41
+ },
42
+ {
43
+ name: 'Cache Connector',
44
+ package: '@xbg/utils-cache-connector',
45
+ description: 'Multi-provider caching (memory, Firestore, Redis)',
46
+ category: 'data',
47
+ envVars: ['CACHE_ENABLED', 'CACHE_DEFAULT_PROVIDER', 'CACHE_DEFAULT_TTL'],
48
+ },
49
+ {
50
+ name: 'Firebase Event Bridge',
51
+ package: '@xbg/utils-firebase-event-bridge',
52
+ description: 'Firebase triggers to domain event normalization',
53
+ category: 'data',
54
+ },
55
+ // Communication utilities
56
+ {
57
+ name: 'Email Connector',
58
+ package: '@xbg/utils-email-connector',
59
+ description: 'Email sending with Mailjet and Ortto providers',
60
+ category: 'communication',
61
+ envVars: ['EMAIL_ENABLED', 'EMAIL_PROVIDER', 'MAILJET_API_KEY', 'MAILJET_SECRET_KEY'],
62
+ },
63
+ {
64
+ name: 'SMS Connector',
65
+ package: '@xbg/utils-sms-connector',
66
+ description: 'SMS sending with Twilio and MessageBird providers',
67
+ category: 'communication',
68
+ envVars: ['SMS_ENABLED', 'SMS_PROVIDER', 'TWILIO_ACCOUNT_SID', 'TWILIO_AUTH_TOKEN'],
69
+ },
70
+ {
71
+ name: 'Push Notifications',
72
+ package: '@xbg/utils-push-notifications-connector',
73
+ description: 'Push notifications via Firebase Cloud Messaging',
74
+ category: 'communication',
75
+ },
76
+ {
77
+ name: 'Realtime Connector',
78
+ package: '@xbg/utils-realtime-connector',
79
+ description: 'SSE and WebSocket providers',
80
+ category: 'communication',
81
+ },
82
+ // Integration utilities
83
+ {
84
+ name: 'CRM Connector',
85
+ package: '@xbg/utils-crm-connector',
86
+ description: 'CRM integration with HubSpot and Salesforce',
87
+ category: 'integration',
88
+ envVars: ['CRM_ENABLED', 'CRM_PROVIDER', 'HUBSPOT_API_KEY'],
89
+ },
90
+ {
91
+ name: 'LLM Connector',
92
+ package: '@xbg/utils-llm-connector',
93
+ description: 'LLM integration with OpenAI, Claude, and Gemini',
94
+ category: 'integration',
95
+ },
96
+ {
97
+ name: 'ERP Connector',
98
+ package: '@xbg/utils-erp-connector',
99
+ description: 'ERP integration with Workday',
100
+ category: 'integration',
101
+ },
102
+ {
103
+ name: 'Journey Connector',
104
+ package: '@xbg/utils-journey-connector',
105
+ description: 'Customer journey integration with Ortto',
106
+ category: 'integration',
107
+ },
108
+ {
109
+ name: 'Survey Connector',
110
+ package: '@xbg/utils-survey-connector',
111
+ description: 'Survey integration',
112
+ category: 'integration',
113
+ },
114
+ {
115
+ name: 'Work Mgmt Connector',
116
+ package: '@xbg/utils-work-mgmt-connector',
117
+ description: 'Work management with Notion and Asana',
118
+ category: 'integration',
119
+ },
120
+ {
121
+ name: 'Document Connector',
122
+ package: '@xbg/utils-document-connector',
123
+ description: 'Document processing',
124
+ category: 'integration',
125
+ },
126
+ // Security utilities
127
+ {
128
+ name: 'Token Handler',
129
+ package: '@xbg/utils-token-handler',
130
+ description: 'JWT generation, verification, and blacklist management',
131
+ category: 'security',
132
+ envVars: ['JWT_ISSUER', 'JWT_AUDIENCE', 'JWT_EXPIRES_IN', 'TOKEN_BLACKLIST_ENABLED'],
133
+ },
134
+ {
135
+ name: 'Hashing',
136
+ package: '@xbg/utils-hashing',
137
+ description: 'PII encryption with AES-256-GCM',
138
+ category: 'security',
139
+ envVars: ['PII_ENCRYPTION_KEY'],
140
+ },
141
+ {
142
+ name: 'Validation',
143
+ package: '@xbg/utils-validation',
144
+ description: 'Input validation with Joi and express-validator',
145
+ category: 'security',
146
+ },
147
+ // Infrastructure utilities
148
+ {
149
+ name: 'Timezone',
150
+ package: '@xbg/utils-timezone',
151
+ description: 'Timezone conversion helper',
152
+ category: 'infrastructure',
153
+ },
154
+ {
155
+ name: 'Address Validation',
156
+ package: '@xbg/utils-address-validation',
157
+ description: 'Google Maps address validation',
158
+ category: 'infrastructure',
159
+ envVars: ['GOOGLE_MAPS_API_KEY'],
160
+ },
161
+ ];
162
+ /**
163
+ * Get utilities that are always included
164
+ */
165
+ function getRequiredUtilities() {
166
+ return exports.UTILITY_REGISTRY.filter((u) => u.alwaysIncluded);
167
+ }
168
+ /**
169
+ * Get utilities available for selection
170
+ */
171
+ function getOptionalUtilities() {
172
+ return exports.UTILITY_REGISTRY.filter((u) => !u.alwaysIncluded);
173
+ }
174
+ /**
175
+ * Get utilities grouped by category
176
+ */
177
+ function getUtilitiesByCategory() {
178
+ const grouped = {};
179
+ for (const util of exports.UTILITY_REGISTRY) {
180
+ if (!grouped[util.category]) {
181
+ grouped[util.category] = [];
182
+ }
183
+ grouped[util.category].push(util);
184
+ }
185
+ return grouped;
186
+ }
187
+ //# sourceMappingURL=utils-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-registry.js","sourceRoot":"","sources":["../src/utils-registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@xbg.solutions/create-backend",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to scaffold and sync XBG backend projects",
5
+ "main": "lib/cli.js",
6
+ "bin": {
7
+ "create-xbg-backend": "bin/create-backend.js"
8
+ },
9
+ "files": [
10
+ "lib",
11
+ "bin",
12
+ "src/project-template"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "build:watch": "tsc --watch",
17
+ "clean": "rm -rf lib",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "dependencies": {
21
+ "chalk": "^4.1.2",
22
+ "commander": "^11.1.0",
23
+ "fs-extra": "^11.2.0",
24
+ "inquirer": "^8.2.6"
25
+ },
26
+ "devDependencies": {
27
+ "@types/fs-extra": "^11.0.4",
28
+ "@types/inquirer": "^9.0.7",
29
+ "@types/node": "^20.11.0",
30
+ "typescript": "^5.3.3"
31
+ },
32
+ "engines": {
33
+ "node": "22"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ }
38
+ }