@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.
- package/bin/create-backend.js +3 -0
- package/lib/cli.d.ts +12 -0
- package/lib/cli.js +55 -0
- package/lib/cli.js.map +1 -0
- package/lib/commands/add-util.d.ts +9 -0
- package/lib/commands/add-util.js +119 -0
- package/lib/commands/add-util.js.map +1 -0
- package/lib/commands/init.d.ts +11 -0
- package/lib/commands/init.js +372 -0
- package/lib/commands/init.js.map +1 -0
- package/lib/commands/sync.d.ts +10 -0
- package/lib/commands/sync.js +161 -0
- package/lib/commands/sync.js.map +1 -0
- package/lib/utils-registry.d.ts +25 -0
- package/lib/utils-registry.js +187 -0
- package/lib/utils-registry.js.map +1 -0
- package/package.json +38 -0
- package/src/project-template/__examples__/README.md +559 -0
- package/src/project-template/__examples__/blog-platform.model.ts +528 -0
- package/src/project-template/__examples__/communications-usage.ts +175 -0
- package/src/project-template/__examples__/ecommerce-store.model.ts +1200 -0
- package/src/project-template/__examples__/saas-multi-tenant.model.ts +798 -0
- package/src/project-template/__examples__/user.model.ts +221 -0
- package/src/project-template/__scripts__/deploy.js +115 -0
- package/src/project-template/__scripts__/generate.js +122 -0
- package/src/project-template/__scripts__/setup.js +425 -0
- package/src/project-template/__scripts__/validate.js +325 -0
- package/src/project-template/firebase.json +32 -0
- package/src/project-template/firestore.rules +12 -0
- package/src/project-template/functions/jest.config.js +49 -0
- package/src/project-template/functions/src/index.ts +46 -0
- package/src/project-template/functions/tsconfig.json +38 -0
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,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,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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"}
|