@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,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../lib/cli');
package/lib/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @xbg/create-backend CLI
4
+ *
5
+ * Scaffolds and syncs XBG backend projects.
6
+ *
7
+ * Usage:
8
+ * npx @xbg/create-backend # Interactive project init
9
+ * npx @xbg/create-backend --sync # Sync/update existing project
10
+ * npx @xbg/create-backend --add-util # Add a utility to existing project
11
+ */
12
+ export {};
package/lib/cli.js ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * @xbg/create-backend CLI
5
+ *
6
+ * Scaffolds and syncs XBG backend projects.
7
+ *
8
+ * Usage:
9
+ * npx @xbg/create-backend # Interactive project init
10
+ * npx @xbg/create-backend --sync # Sync/update existing project
11
+ * npx @xbg/create-backend --add-util # Add a utility to existing project
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const commander_1 = require("commander");
15
+ const init_1 = require("./commands/init");
16
+ const sync_1 = require("./commands/sync");
17
+ const add_util_1 = require("./commands/add-util");
18
+ const pkg = require('../package.json');
19
+ const program = new commander_1.Command();
20
+ program
21
+ .name('create-xbg-backend')
22
+ .description('Scaffold and manage XBG backend projects')
23
+ .version(pkg.version);
24
+ program
25
+ .command('init')
26
+ .description('Initialize a new XBG backend project')
27
+ .option('-d, --directory <path>', 'Target directory', '.')
28
+ .option('-n, --name <name>', 'Project name')
29
+ .option('--skip-install', 'Skip npm install')
30
+ .action(async (options) => {
31
+ await (0, init_1.initProject)(options);
32
+ });
33
+ program
34
+ .command('sync')
35
+ .description('Sync/update an existing project with latest boilerplate changes')
36
+ .option('-d, --directory <path>', 'Project directory', '.')
37
+ .option('--check-only', 'Only check for updates, do not apply')
38
+ .action(async (options) => {
39
+ await (0, sync_1.syncProject)(options);
40
+ });
41
+ program
42
+ .command('add-util')
43
+ .description('Add a utility package to an existing project')
44
+ .option('-d, --directory <path>', 'Project directory', '.')
45
+ .action(async (options) => {
46
+ await (0, add_util_1.addUtility)(options);
47
+ });
48
+ // Default to init if no command specified
49
+ if (process.argv.length <= 2) {
50
+ (0, init_1.initProject)({ directory: '.' }).catch(console.error);
51
+ }
52
+ else {
53
+ program.parse();
54
+ }
55
+ //# sourceMappingURL=cli.js.map
package/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;GASG;;AAEH,yCAAoC;AACpC,0CAA8C;AAC9C,0CAA8C;AAC9C,kDAAiD;AAEjD,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,oBAAoB,CAAC;KAC1B,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;KAC3C,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,0CAA0C;AAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAA,kBAAW,EAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Add Utility Command
3
+ * Adds a utility package to an existing project
4
+ */
5
+ interface AddUtilOptions {
6
+ directory: string;
7
+ }
8
+ export declare function addUtility(options: AddUtilOptions): Promise<void>;
9
+ export {};
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Add Utility Command
4
+ * Adds a utility package to an existing project
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.addUtility = addUtility;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs-extra"));
46
+ const inquirer_1 = __importDefault(require("inquirer"));
47
+ const chalk_1 = __importDefault(require("chalk"));
48
+ const child_process_1 = require("child_process");
49
+ const utils_registry_1 = require("../utils-registry");
50
+ async function addUtility(options) {
51
+ const projectDir = path.resolve(options.directory);
52
+ const functionsDir = path.join(projectDir, 'functions');
53
+ const pkgJsonPath = path.join(functionsDir, 'package.json');
54
+ // Verify project exists
55
+ if (!await fs.pathExists(pkgJsonPath)) {
56
+ console.error(chalk_1.default.red('Not an XBG backend project. Run from the project root.'));
57
+ process.exit(1);
58
+ }
59
+ console.log(chalk_1.default.bold.blue('\n── Add Utility ─────────────────────────────────\n'));
60
+ const pkgJson = await fs.readJson(pkgJsonPath);
61
+ const installedDeps = Object.keys(pkgJson.dependencies || {});
62
+ // Get utilities not yet installed
63
+ const optionalUtils = (0, utils_registry_1.getOptionalUtilities)();
64
+ const notInstalled = optionalUtils.filter((u) => !installedDeps.includes(u.package));
65
+ if (notInstalled.length === 0) {
66
+ console.log(chalk_1.default.green('All available utilities are already installed!'));
67
+ return;
68
+ }
69
+ // Group by category
70
+ const categories = [...new Set(notInstalled.map((u) => u.category))];
71
+ const choices = categories.flatMap((category) => {
72
+ const categoryUtils = notInstalled.filter((u) => u.category === category);
73
+ return [
74
+ new inquirer_1.default.Separator(`── ${category.toUpperCase()} ──`),
75
+ ...categoryUtils.map((u) => ({
76
+ name: `${u.name} - ${chalk_1.default.dim(u.description)}`,
77
+ value: u.package,
78
+ })),
79
+ ];
80
+ });
81
+ const { selected } = await inquirer_1.default.prompt([
82
+ {
83
+ type: 'checkbox',
84
+ name: 'selected',
85
+ message: 'Select utilities to add:',
86
+ choices,
87
+ pageSize: 20,
88
+ },
89
+ ]);
90
+ if (selected.length === 0) {
91
+ console.log(chalk_1.default.dim('No utilities selected.'));
92
+ return;
93
+ }
94
+ // Install packages
95
+ const packages = selected.join(' ');
96
+ console.log(chalk_1.default.cyan(`\nInstalling: ${packages}\n`));
97
+ try {
98
+ (0, child_process_1.execSync)(`npm install ${packages}`, { cwd: functionsDir, stdio: 'inherit' });
99
+ console.log(chalk_1.default.green('\nUtilities installed successfully!'));
100
+ // Show env vars that may need configuration
101
+ const addedUtils = selected
102
+ .map((pkg) => utils_registry_1.UTILITY_REGISTRY.find((u) => u.package === pkg))
103
+ .filter(Boolean);
104
+ const envVars = addedUtils
105
+ .flatMap((u) => (u === null || u === void 0 ? void 0 : u.envVars) || [])
106
+ .filter(Boolean);
107
+ if (envVars.length > 0) {
108
+ console.log(chalk_1.default.yellow('\nEnvironment variables you may need to configure in functions/.env:'));
109
+ for (const envVar of envVars) {
110
+ console.log(chalk_1.default.dim(` ${envVar}=`));
111
+ }
112
+ }
113
+ }
114
+ catch (_a) {
115
+ console.error(chalk_1.default.red('Failed to install. Try running npm install manually.'));
116
+ process.exit(1);
117
+ }
118
+ }
119
+ //# sourceMappingURL=add-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-util.js","sourceRoot":"","sources":["../../src/commands/add-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Init Command
3
+ * Scaffolds a new XBG backend project
4
+ */
5
+ interface InitOptions {
6
+ directory: string;
7
+ name?: string;
8
+ skipInstall?: boolean;
9
+ }
10
+ export declare function initProject(options: InitOptions): Promise<void>;
11
+ export {};
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ /**
3
+ * Init Command
4
+ * Scaffolds a new XBG backend project
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.initProject = initProject;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs-extra"));
46
+ const inquirer_1 = __importDefault(require("inquirer"));
47
+ const chalk_1 = __importDefault(require("chalk"));
48
+ const child_process_1 = require("child_process");
49
+ const utils_registry_1 = require("../utils-registry");
50
+ async function initProject(options) {
51
+ printBanner();
52
+ const targetDir = path.resolve(options.directory);
53
+ const templateDir = path.resolve(__dirname, '../../src/project-template');
54
+ // ── Gather configuration ──────────────────────────────
55
+ const answers = await inquirer_1.default.prompt([
56
+ {
57
+ type: 'input',
58
+ name: 'projectName',
59
+ message: 'Project name:',
60
+ default: options.name || path.basename(targetDir) || 'my-backend-api',
61
+ },
62
+ {
63
+ type: 'input',
64
+ name: 'firebaseProject',
65
+ message: 'Firebase project ID:',
66
+ validate: (input) => input.trim() ? true : 'Firebase project ID is required',
67
+ },
68
+ {
69
+ type: 'list',
70
+ name: 'deploymentMode',
71
+ message: 'Deployment mode:',
72
+ choices: [
73
+ { name: 'Backend-only (standalone Firebase Functions)', value: 'standalone' },
74
+ { name: 'Mono-repo (frontend + backend in one repo)', value: 'monorepo' },
75
+ ],
76
+ },
77
+ {
78
+ type: 'list',
79
+ name: 'environment',
80
+ message: 'Initial environment:',
81
+ choices: ['development', 'staging', 'production'],
82
+ default: 'development',
83
+ },
84
+ {
85
+ type: 'confirm',
86
+ name: 'multiDB',
87
+ message: 'Use multi-database mode? (recommended)',
88
+ default: true,
89
+ },
90
+ {
91
+ type: 'input',
92
+ name: 'apiBasePath',
93
+ message: 'API base path:',
94
+ default: '/api/v1',
95
+ },
96
+ {
97
+ type: 'input',
98
+ name: 'corsOrigins',
99
+ message: 'CORS origins:',
100
+ default: 'http://localhost:5173,http://localhost:3000',
101
+ },
102
+ ]);
103
+ // ── Feature flags ─────────────────────────────────────
104
+ const features = await inquirer_1.default.prompt([
105
+ { type: 'confirm', name: 'auth', message: 'Authentication:', default: true },
106
+ { type: 'confirm', name: 'multiTenant', message: 'Multi-tenant:', default: false },
107
+ { type: 'confirm', name: 'fileUploads', message: 'File uploads:', default: true },
108
+ { type: 'confirm', name: 'notifications', message: 'Notifications:', default: true },
109
+ { type: 'confirm', name: 'analytics', message: 'Analytics:', default: false },
110
+ { type: 'confirm', name: 'realtime', message: 'Realtime (SSE/WebSocket):', default: true },
111
+ ]);
112
+ // ── Utility selection ─────────────────────────────────
113
+ console.log(chalk_1.default.cyan('\n── Select Utilities ─────────────────────────────'));
114
+ console.log(chalk_1.default.dim('Core utilities (logger, events, errors, firestore) are always included.\n'));
115
+ const optionalUtils = (0, utils_registry_1.getOptionalUtilities)();
116
+ const categories = [...new Set(optionalUtils.map((u) => u.category))];
117
+ const utilChoices = categories.flatMap((category) => {
118
+ const categoryUtils = optionalUtils.filter((u) => u.category === category);
119
+ return [
120
+ new inquirer_1.default.Separator(`── ${category.toUpperCase()} ──`),
121
+ ...categoryUtils.map((u) => ({
122
+ name: `${u.name} - ${chalk_1.default.dim(u.description)}`,
123
+ value: u.package,
124
+ checked: ['@xbg/utils-cache-connector', '@xbg/utils-token-handler', '@xbg/utils-validation'].includes(u.package),
125
+ })),
126
+ ];
127
+ });
128
+ const { selectedUtils } = await inquirer_1.default.prompt([
129
+ {
130
+ type: 'checkbox',
131
+ name: 'selectedUtils',
132
+ message: 'Select utilities to include:',
133
+ choices: utilChoices,
134
+ pageSize: 25,
135
+ },
136
+ ]);
137
+ // ── Scaffold project ──────────────────────────────────
138
+ console.log(chalk_1.default.cyan('\n── Scaffolding Project ─────────────────────────'));
139
+ // Copy template files
140
+ const functionsDir = path.join(targetDir, 'functions');
141
+ await fs.ensureDir(functionsDir);
142
+ // Copy project structure
143
+ await fs.copy(path.join(templateDir, 'functions', 'src'), path.join(functionsDir, 'src'), {
144
+ filter: (src) => !src.includes('node_modules'),
145
+ });
146
+ await fs.copy(path.join(templateDir, 'functions', 'tsconfig.json'), path.join(functionsDir, 'tsconfig.json'));
147
+ await fs.copy(path.join(templateDir, 'functions', 'jest.config.js'), path.join(functionsDir, 'jest.config.js'));
148
+ console.log(chalk_1.default.green(' Created'), 'functions/src/');
149
+ console.log(chalk_1.default.green(' Created'), 'functions/tsconfig.json');
150
+ // Copy scripts and examples
151
+ await fs.copy(path.join(templateDir, '__scripts__'), path.join(targetDir, '__scripts__'));
152
+ await fs.copy(path.join(templateDir, '__examples__'), path.join(targetDir, '__examples__'));
153
+ console.log(chalk_1.default.green(' Created'), '__scripts__/');
154
+ console.log(chalk_1.default.green(' Created'), '__examples__/');
155
+ // Generate firebase.json
156
+ const firebaseJson = {
157
+ firestore: { rules: 'firestore.rules' },
158
+ functions: {
159
+ source: 'functions',
160
+ runtime: 'nodejs22',
161
+ ignore: ['node_modules', '.git', 'firebase-debug.log', 'firebase-debug.*.log'],
162
+ predeploy: ['npm --prefix "$RESOURCE_DIR" run lint', 'npm --prefix "$RESOURCE_DIR" run build'],
163
+ },
164
+ emulators: {
165
+ functions: { port: 5001 },
166
+ firestore: { port: 8080 },
167
+ ui: { enabled: true, port: 4000 },
168
+ singleProjectMode: true,
169
+ },
170
+ };
171
+ await fs.writeJson(path.join(targetDir, 'firebase.json'), firebaseJson, { spaces: 2 });
172
+ console.log(chalk_1.default.green(' Created'), 'firebase.json');
173
+ // Generate .firebaserc
174
+ await fs.writeJson(path.join(targetDir, '.firebaserc'), {
175
+ projects: { default: answers.firebaseProject },
176
+ }, { spaces: 2 });
177
+ console.log(chalk_1.default.green(' Created'), '.firebaserc');
178
+ // Copy firestore.rules if exists
179
+ const rulesTemplate = path.join(templateDir, 'firestore.rules');
180
+ if (await fs.pathExists(rulesTemplate)) {
181
+ await fs.copy(rulesTemplate, path.join(targetDir, 'firestore.rules'));
182
+ console.log(chalk_1.default.green(' Created'), 'firestore.rules');
183
+ }
184
+ // Generate package.json for functions/
185
+ const requiredUtils = (0, utils_registry_1.getRequiredUtilities)();
186
+ const allPackages = [
187
+ '@xbg/backend-core',
188
+ ...requiredUtils.map((u) => u.package),
189
+ ...selectedUtils,
190
+ ];
191
+ const functionsPackageJson = generateFunctionsPackageJson(answers.projectName, allPackages);
192
+ await fs.writeJson(path.join(functionsDir, 'package.json'), functionsPackageJson, { spaces: 2 });
193
+ console.log(chalk_1.default.green(' Created'), 'functions/package.json');
194
+ // Generate .env
195
+ const envContent = generateEnvFile(answers, features);
196
+ await fs.writeFile(path.join(functionsDir, '.env'), envContent);
197
+ console.log(chalk_1.default.green(' Created'), 'functions/.env');
198
+ // Update tsconfig to remove path aliases (now using packages)
199
+ const tsconfig = await fs.readJson(path.join(functionsDir, 'tsconfig.json'));
200
+ delete tsconfig.compilerOptions.paths;
201
+ await fs.writeJson(path.join(functionsDir, 'tsconfig.json'), tsconfig, { spaces: 2 });
202
+ // ── Install dependencies ──────────────────────────────
203
+ if (!options.skipInstall) {
204
+ const { install } = await inquirer_1.default.prompt([
205
+ { type: 'confirm', name: 'install', message: 'Install dependencies?', default: true },
206
+ ]);
207
+ if (install) {
208
+ console.log(chalk_1.default.dim('\nInstalling dependencies...'));
209
+ try {
210
+ (0, child_process_1.execSync)('npm install', { cwd: functionsDir, stdio: 'inherit' });
211
+ console.log(chalk_1.default.green('Dependencies installed.'));
212
+ }
213
+ catch (_a) {
214
+ console.error(chalk_1.default.red('Failed to install. Run npm install in functions/ manually.'));
215
+ }
216
+ }
217
+ }
218
+ // ── Summary ───────────────────────────────────────────
219
+ printSummary(answers, features, selectedUtils, targetDir);
220
+ }
221
+ function printBanner() {
222
+ console.log(chalk_1.default.bold.blue(`
223
+ ╔════════════════════════════════════════════════════════════╗
224
+ ║ ║
225
+ ║ XBG Backend - Project Setup ║
226
+ ║ ║
227
+ ╚════════════════════════════════════════════════════════════╝
228
+ `));
229
+ }
230
+ function generateFunctionsPackageJson(projectName, packages) {
231
+ const deps = {};
232
+ // Add XBG packages
233
+ for (const pkg of packages) {
234
+ deps[pkg] = '^1.0.0';
235
+ }
236
+ // Add required non-XBG dependencies
237
+ deps['dotenv'] = '^16.3.1';
238
+ deps['firebase-admin'] = '^12.0.0';
239
+ deps['firebase-functions'] = '^4.6.0';
240
+ return {
241
+ name: `${projectName}-functions`,
242
+ version: '1.0.0',
243
+ description: `Backend functions for ${projectName}`,
244
+ main: 'lib/index.js',
245
+ engines: { node: '22' },
246
+ scripts: {
247
+ build: 'tsc',
248
+ 'build:watch': 'tsc --watch',
249
+ serve: 'npm run build && firebase emulators:start --only functions',
250
+ shell: 'npm run build && firebase functions:shell',
251
+ start: 'npm run shell',
252
+ deploy: 'firebase deploy --only functions',
253
+ logs: 'firebase functions:log',
254
+ lint: 'eslint --ext .js,.ts .',
255
+ 'lint:fix': 'eslint --ext .js,.ts . --fix',
256
+ test: 'jest',
257
+ 'test:watch': 'jest --watch',
258
+ 'test:coverage': 'jest --coverage',
259
+ generate: 'node ../__scripts__/generate.js',
260
+ setup: 'node ../__scripts__/setup.js',
261
+ 'deploy:full': 'node ../__scripts__/deploy.js',
262
+ validate: 'node ../__scripts__/validate.js',
263
+ 'validate:quick': 'node ../__scripts__/validate.js --skip-tests --skip-build',
264
+ },
265
+ dependencies: deps,
266
+ devDependencies: {
267
+ '@types/node': '^20.11.0',
268
+ '@typescript-eslint/eslint-plugin': '^6.18.1',
269
+ '@typescript-eslint/parser': '^6.18.1',
270
+ eslint: '^8.56.0',
271
+ 'eslint-config-google': '^0.14.0',
272
+ 'eslint-plugin-import': '^2.29.1',
273
+ 'firebase-functions-test': '^3.1.1',
274
+ jest: '^29.7.0',
275
+ 'ts-jest': '^29.1.1',
276
+ typescript: '^5.3.3',
277
+ },
278
+ private: true,
279
+ };
280
+ }
281
+ function generateEnvFile(answers, features) {
282
+ return `# ──────────────────────────────────────────────────────────
283
+ # Application
284
+ # ──────────────────────────────────────────────────────────
285
+ APP_NAME=${answers.projectName}
286
+ APP_VERSION=1.0.0
287
+ NODE_ENV=${answers.environment}
288
+ PORT=5001
289
+
290
+ # ──────────────────────────────────────────────────────────
291
+ # Firebase
292
+ # ──────────────────────────────────────────────────────────
293
+ FIREBASE_PROJECT_ID=${answers.firebaseProject}
294
+
295
+ # ──────────────────────────────────────────────────────────
296
+ # Database
297
+ # ──────────────────────────────────────────────────────────
298
+ MAIN_DATABASE_ID=${answers.multiDB ? 'main' : '(default)'}
299
+ ANALYTICS_DATABASE_ID=${answers.multiDB ? 'analytics' : '(default)'}
300
+
301
+ # ──────────────────────────────────────────────────────────
302
+ # API
303
+ # ──────────────────────────────────────────────────────────
304
+ API_BASE_PATH=${answers.apiBasePath}
305
+ CORS_ORIGINS=${answers.corsOrigins}
306
+ REQUEST_SIZE_LIMIT=10mb
307
+
308
+ # ──────────────────────────────────────────────────────────
309
+ # Features
310
+ # ──────────────────────────────────────────────────────────
311
+ FEATURE_AUTHENTICATION=${features.auth}
312
+ FEATURE_MULTI_TENANT=${features.multiTenant}
313
+ FEATURE_FILE_UPLOADS=${features.fileUploads}
314
+ FEATURE_NOTIFICATIONS=${features.notifications}
315
+ FEATURE_ANALYTICS=${features.analytics}
316
+ FEATURE_REALTIME=${features.realtime}
317
+
318
+ # ──────────────────────────────────────────────────────────
319
+ # Rate Limiting
320
+ # ──────────────────────────────────────────────────────────
321
+ RATE_LIMIT_ENABLED=true
322
+ RATE_LIMIT_WINDOW_MS=900000
323
+ RATE_LIMIT_MAX=100
324
+
325
+ # ──────────────────────────────────────────────────────────
326
+ # Logging
327
+ # ──────────────────────────────────────────────────────────
328
+ LOG_LEVEL=info
329
+
330
+ # ──────────────────────────────────────────────────────────
331
+ # PII Encryption (generate with: openssl rand -hex 32)
332
+ # ──────────────────────────────────────────────────────────
333
+ PII_ENCRYPTION_KEY=
334
+
335
+ # ──────────────────────────────────────────────────────────
336
+ # JWT / Authentication
337
+ # ──────────────────────────────────────────────────────────
338
+ JWT_ISSUER=${answers.projectName}
339
+ JWT_AUDIENCE=${answers.projectName}-api
340
+ JWT_EXPIRES_IN=1h
341
+ JWT_REFRESH_EXPIRES_IN=7d
342
+ TOKEN_BLACKLIST_ENABLED=true
343
+ `;
344
+ }
345
+ function printSummary(answers, features, selectedUtils, targetDir) {
346
+ const enabledFeatures = Object.entries(features)
347
+ .filter(([, v]) => v)
348
+ .map(([k]) => k);
349
+ console.log(chalk_1.default.green.bold('\nProject created successfully!'));
350
+ console.log(`
351
+ ${chalk_1.default.bold('Configuration:')}
352
+ Project: ${answers.projectName}
353
+ Firebase project: ${answers.firebaseProject}
354
+ Mode: ${answers.deploymentMode}
355
+ Database: ${answers.multiDB ? 'Multi-DB' : 'Single'}
356
+ Features: ${enabledFeatures.join(', ') || 'None'}
357
+ Utilities: ${selectedUtils.length} selected
358
+
359
+ ${chalk_1.default.bold('Next steps:')}
360
+ 1. Review functions/.env and add integration keys as needed
361
+ 2. Define your data model in __examples__/
362
+ 3. Run ${chalk_1.default.cyan('npm run generate __examples__/your-model.ts')} to generate code
363
+ 4. Register generated controllers in functions/src/index.ts
364
+ 5. Run ${chalk_1.default.cyan('npm run build')} to compile
365
+ 6. Run ${chalk_1.default.cyan('npm start')} for local development
366
+
367
+ ${chalk_1.default.bold('Update propagation:')}
368
+ Run ${chalk_1.default.cyan('npx @xbg/create-backend sync')} to check for and apply updates
369
+ Run ${chalk_1.default.cyan('npm update')} in functions/ to update @xbg packages
370
+ `);
371
+ }
372
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Sync Command
3
+ * Updates an existing project with latest boilerplate changes
4
+ */
5
+ interface SyncOptions {
6
+ directory: string;
7
+ checkOnly?: boolean;
8
+ }
9
+ export declare function syncProject(options: SyncOptions): Promise<void>;
10
+ export {};