@digitaldefiance/express-suite-starter 2.1.41
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/README.md +342 -0
- package/config/package-groups.json +83 -0
- package/config/presets/minimal.json +32 -0
- package/config/presets/standard.json +70 -0
- package/dist/scripts/addScriptsToPackageJson.d.ts +7 -0
- package/dist/scripts/addScriptsToPackageJson.d.ts.map +1 -0
- package/dist/scripts/addScriptsToPackageJson.js +69 -0
- package/dist/scripts/addScriptsToPackageJson.js.map +1 -0
- package/dist/scripts/albatross.d.ts +4 -0
- package/dist/scripts/albatross.d.ts.map +1 -0
- package/dist/scripts/albatross.js +36 -0
- package/dist/scripts/albatross.js.map +1 -0
- package/dist/scripts/fsUtils.d.ts +15 -0
- package/dist/scripts/fsUtils.d.ts.map +1 -0
- package/dist/scripts/fsUtils.js +99 -0
- package/dist/scripts/fsUtils.js.map +1 -0
- package/dist/scripts/generate-monorepo.d.ts +2 -0
- package/dist/scripts/generate-monorepo.d.ts.map +1 -0
- package/dist/scripts/generate-monorepo.js +227 -0
- package/dist/scripts/generate-monorepo.js.map +1 -0
- package/dist/scripts/licensePrompt.d.ts +5 -0
- package/dist/scripts/licensePrompt.d.ts.map +1 -0
- package/dist/scripts/licensePrompt.js +63 -0
- package/dist/scripts/licensePrompt.js.map +1 -0
- package/dist/scripts/monorepoConfig.d.ts +18 -0
- package/dist/scripts/monorepoConfig.d.ts.map +1 -0
- package/dist/scripts/monorepoConfig.js +83 -0
- package/dist/scripts/monorepoConfig.js.map +1 -0
- package/dist/scripts/nodeSetup.d.ts +5 -0
- package/dist/scripts/nodeSetup.d.ts.map +1 -0
- package/dist/scripts/nodeSetup.js +32 -0
- package/dist/scripts/nodeSetup.js.map +1 -0
- package/dist/scripts/passwordObfuscator.d.ts +14 -0
- package/dist/scripts/passwordObfuscator.d.ts.map +1 -0
- package/dist/scripts/passwordObfuscator.js +52 -0
- package/dist/scripts/passwordObfuscator.js.map +1 -0
- package/dist/scripts/shellUtils.d.ts +11 -0
- package/dist/scripts/shellUtils.d.ts.map +1 -0
- package/dist/scripts/shellUtils.js +28 -0
- package/dist/scripts/shellUtils.js.map +1 -0
- package/dist/scripts/templateUtils.d.ts +6 -0
- package/dist/scripts/templateUtils.d.ts.map +1 -0
- package/dist/scripts/templateUtils.js +15 -0
- package/dist/scripts/templateUtils.js.map +1 -0
- package/dist/src/cli/logger.d.ts +15 -0
- package/dist/src/cli/logger.d.ts.map +1 -0
- package/dist/src/cli/logger.js +48 -0
- package/dist/src/cli/logger.js.map +1 -0
- package/dist/src/cli.d.ts +6 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +12 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/config-schema.d.ts +3 -0
- package/dist/src/core/config-schema.d.ts.map +1 -0
- package/dist/src/core/config-schema.js +20 -0
- package/dist/src/core/config-schema.js.map +1 -0
- package/dist/src/core/dry-run-executor.d.ts +15 -0
- package/dist/src/core/dry-run-executor.d.ts.map +1 -0
- package/dist/src/core/dry-run-executor.js +86 -0
- package/dist/src/core/dry-run-executor.js.map +1 -0
- package/dist/src/core/interfaces/checkpoint.interface.d.ts +6 -0
- package/dist/src/core/interfaces/checkpoint.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/checkpoint.interface.js +3 -0
- package/dist/src/core/interfaces/checkpoint.interface.js.map +1 -0
- package/dist/src/core/interfaces/command-options.interface.d.ts +5 -0
- package/dist/src/core/interfaces/command-options.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/command-options.interface.js +3 -0
- package/dist/src/core/interfaces/command-options.interface.js.map +1 -0
- package/dist/src/core/interfaces/devcontainer-config.interface.d.ts +6 -0
- package/dist/src/core/interfaces/devcontainer-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/devcontainer-config.interface.js +3 -0
- package/dist/src/core/interfaces/devcontainer-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/dry-run.interface.d.ts +16 -0
- package/dist/src/core/interfaces/dry-run.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/dry-run.interface.js +3 -0
- package/dist/src/core/interfaces/dry-run.interface.js.map +1 -0
- package/dist/src/core/interfaces/generator-config.interface.d.ts +17 -0
- package/dist/src/core/interfaces/generator-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/generator-config.interface.js +3 -0
- package/dist/src/core/interfaces/generator-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/generator-context.interface.d.ts +6 -0
- package/dist/src/core/interfaces/generator-context.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/generator-context.interface.js +3 -0
- package/dist/src/core/interfaces/generator-context.interface.js.map +1 -0
- package/dist/src/core/interfaces/index.d.ts +16 -0
- package/dist/src/core/interfaces/index.d.ts.map +1 -0
- package/dist/src/core/interfaces/index.js +32 -0
- package/dist/src/core/interfaces/index.js.map +1 -0
- package/dist/src/core/interfaces/node-config.interface.d.ts +5 -0
- package/dist/src/core/interfaces/node-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/node-config.interface.js +3 -0
- package/dist/src/core/interfaces/node-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/nx-config.interface.d.ts +9 -0
- package/dist/src/core/interfaces/nx-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/nx-config.interface.js +3 -0
- package/dist/src/core/interfaces/nx-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/package-config.interface.d.ts +6 -0
- package/dist/src/core/interfaces/package-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/package-config.interface.js +3 -0
- package/dist/src/core/interfaces/package-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/package-resolution.interface.d.ts +21 -0
- package/dist/src/core/interfaces/package-resolution.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/package-resolution.interface.js +3 -0
- package/dist/src/core/interfaces/package-resolution.interface.js.map +1 -0
- package/dist/src/core/interfaces/plugin.interface.d.ts +21 -0
- package/dist/src/core/interfaces/plugin.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/plugin.interface.js +3 -0
- package/dist/src/core/interfaces/plugin.interface.js.map +1 -0
- package/dist/src/core/interfaces/project-config.interface.d.ts +7 -0
- package/dist/src/core/interfaces/project-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/project-config.interface.js +3 -0
- package/dist/src/core/interfaces/project-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/step.interface.d.ts +9 -0
- package/dist/src/core/interfaces/step.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/step.interface.js +3 -0
- package/dist/src/core/interfaces/step.interface.js.map +1 -0
- package/dist/src/core/interfaces/template-config.interface.d.ts +5 -0
- package/dist/src/core/interfaces/template-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/template-config.interface.js +3 -0
- package/dist/src/core/interfaces/template-config.interface.js.map +1 -0
- package/dist/src/core/interfaces/validation-issue.interface.d.ts +18 -0
- package/dist/src/core/interfaces/validation-issue.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/validation-issue.interface.js +3 -0
- package/dist/src/core/interfaces/validation-issue.interface.js.map +1 -0
- package/dist/src/core/interfaces/validation-result.interface.d.ts +5 -0
- package/dist/src/core/interfaces/validation-result.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/validation-result.interface.js +3 -0
- package/dist/src/core/interfaces/validation-result.interface.js.map +1 -0
- package/dist/src/core/interfaces/workspace-config.interface.d.ts +8 -0
- package/dist/src/core/interfaces/workspace-config.interface.d.ts.map +1 -0
- package/dist/src/core/interfaces/workspace-config.interface.js +3 -0
- package/dist/src/core/interfaces/workspace-config.interface.js.map +1 -0
- package/dist/src/core/package-resolver.d.ts +10 -0
- package/dist/src/core/package-resolver.d.ts.map +1 -0
- package/dist/src/core/package-resolver.js +68 -0
- package/dist/src/core/package-resolver.js.map +1 -0
- package/dist/src/core/plugin-manager.d.ts +13 -0
- package/dist/src/core/plugin-manager.d.ts.map +1 -0
- package/dist/src/core/plugin-manager.js +48 -0
- package/dist/src/core/plugin-manager.js.map +1 -0
- package/dist/src/core/plugins/example-plugin.d.ts +3 -0
- package/dist/src/core/plugins/example-plugin.d.ts.map +1 -0
- package/dist/src/core/plugins/example-plugin.js +30 -0
- package/dist/src/core/plugins/example-plugin.js.map +1 -0
- package/dist/src/core/project-config-builder.d.ts +11 -0
- package/dist/src/core/project-config-builder.d.ts.map +1 -0
- package/dist/src/core/project-config-builder.js +77 -0
- package/dist/src/core/project-config-builder.js.map +1 -0
- package/dist/src/core/project-generator.d.ts +11 -0
- package/dist/src/core/project-generator.d.ts.map +1 -0
- package/dist/src/core/project-generator.js +29 -0
- package/dist/src/core/project-generator.js.map +1 -0
- package/dist/src/core/step-executor.d.ts +19 -0
- package/dist/src/core/step-executor.d.ts.map +1 -0
- package/dist/src/core/step-executor.js +130 -0
- package/dist/src/core/step-executor.js.map +1 -0
- package/dist/src/core/validators/config-validator.d.ts +10 -0
- package/dist/src/core/validators/config-validator.d.ts.map +1 -0
- package/dist/src/core/validators/config-validator.js +44 -0
- package/dist/src/core/validators/config-validator.js.map +1 -0
- package/dist/src/core/validators/post-generation-validator.d.ts +10 -0
- package/dist/src/core/validators/post-generation-validator.d.ts.map +1 -0
- package/dist/src/core/validators/post-generation-validator.js +219 -0
- package/dist/src/core/validators/post-generation-validator.js.map +1 -0
- package/dist/src/generate-monorepo.d.ts +3 -0
- package/dist/src/generate-monorepo.d.ts.map +1 -0
- package/dist/src/generate-monorepo.js +668 -0
- package/dist/src/generate-monorepo.js.map +1 -0
- package/dist/src/templates/engines/handlebars-engine.d.ts +7 -0
- package/dist/src/templates/engines/handlebars-engine.d.ts.map +1 -0
- package/dist/src/templates/engines/handlebars-engine.js +19 -0
- package/dist/src/templates/engines/handlebars-engine.js.map +1 -0
- package/dist/src/templates/engines/mustache-engine.d.ts +5 -0
- package/dist/src/templates/engines/mustache-engine.d.ts.map +1 -0
- package/dist/src/templates/engines/mustache-engine.js +44 -0
- package/dist/src/templates/engines/mustache-engine.js.map +1 -0
- package/dist/src/templates/index.d.ts +5 -0
- package/dist/src/templates/index.d.ts.map +1 -0
- package/dist/src/templates/index.js +21 -0
- package/dist/src/templates/index.js.map +1 -0
- package/dist/src/templates/interfaces/template-engine.interface.d.ts +4 -0
- package/dist/src/templates/interfaces/template-engine.interface.d.ts.map +1 -0
- package/dist/src/templates/interfaces/template-engine.interface.js +3 -0
- package/dist/src/templates/interfaces/template-engine.interface.js.map +1 -0
- package/dist/src/templates/template-engine-factory.d.ts +3 -0
- package/dist/src/templates/template-engine-factory.d.ts.map +1 -0
- package/dist/src/templates/template-engine-factory.js +9 -0
- package/dist/src/templates/template-engine-factory.js.map +1 -0
- package/dist/src/utils/diff-viewer.d.ts +15 -0
- package/dist/src/utils/diff-viewer.d.ts.map +1 -0
- package/dist/src/utils/diff-viewer.js +61 -0
- package/dist/src/utils/diff-viewer.js.map +1 -0
- package/dist/src/utils/doc-generator.d.ts +8 -0
- package/dist/src/utils/doc-generator.d.ts.map +1 -0
- package/dist/src/utils/doc-generator.js +174 -0
- package/dist/src/utils/doc-generator.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +4 -0
- package/dist/src/utils/shell-utils.d.ts.map +1 -0
- package/dist/src/utils/shell-utils.js +32 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/system-check.d.ts +11 -0
- package/dist/src/utils/system-check.d.ts.map +1 -0
- package/dist/src/utils/system-check.js +71 -0
- package/dist/src/utils/system-check.js.map +1 -0
- package/dist/src/utils/template-renderer.d.ts +3 -0
- package/dist/src/utils/template-renderer.d.ts.map +1 -0
- package/dist/src/utils/template-renderer.js +127 -0
- package/dist/src/utils/template-renderer.js.map +1 -0
- package/package.json +51 -0
- package/templates/api/.env.example.mustache +57 -0
- package/templates/api-lib/README.md.mustache +23 -0
- package/templates/react-lib/README.md.mustache +23 -0
- package/templates/root/README.md.mustache +175 -0
- package/templates/root/reset.sh.mustache +25 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SystemCheck = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../cli/logger");
|
|
6
|
+
class SystemCheck {
|
|
7
|
+
static check() {
|
|
8
|
+
const missing = [];
|
|
9
|
+
const warnings = [];
|
|
10
|
+
// Check for C++ compiler
|
|
11
|
+
if (!this.hasCommand('g++') && !this.hasCommand('clang++')) {
|
|
12
|
+
missing.push('C++ compiler (g++ or clang++)');
|
|
13
|
+
}
|
|
14
|
+
// Check for Python (needed by node-gyp)
|
|
15
|
+
if (!this.hasCommand('python3') && !this.hasCommand('python')) {
|
|
16
|
+
missing.push('Python 3');
|
|
17
|
+
}
|
|
18
|
+
// Check for make
|
|
19
|
+
if (!this.hasCommand('make')) {
|
|
20
|
+
missing.push('make');
|
|
21
|
+
}
|
|
22
|
+
// Check for git
|
|
23
|
+
if (!this.hasCommand('git')) {
|
|
24
|
+
warnings.push('git (required for version control)');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
passed: missing.length === 0,
|
|
28
|
+
missing,
|
|
29
|
+
warnings,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
static hasCommand(cmd) {
|
|
33
|
+
try {
|
|
34
|
+
const isWindows = process.platform === 'win32';
|
|
35
|
+
const checkCmd = isWindows ? `where ${cmd}` : `command -v ${cmd}`;
|
|
36
|
+
(0, child_process_1.execSync)(checkCmd, { stdio: 'ignore' });
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
static printReport(result) {
|
|
44
|
+
if (result.passed && result.warnings.length === 0) {
|
|
45
|
+
logger_1.Logger.success('System check passed');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (result.missing.length > 0) {
|
|
49
|
+
logger_1.Logger.error('Missing required build tools:');
|
|
50
|
+
result.missing.forEach(tool => logger_1.Logger.dim(` - ${tool}`));
|
|
51
|
+
logger_1.Logger.section('Installation instructions:');
|
|
52
|
+
const isWindows = process.platform === 'win32';
|
|
53
|
+
if (isWindows) {
|
|
54
|
+
logger_1.Logger.dim(' Windows: Install Visual Studio Build Tools');
|
|
55
|
+
logger_1.Logger.dim(' https://visualstudio.microsoft.com/downloads/');
|
|
56
|
+
logger_1.Logger.dim(' Or install via: npm install --global windows-build-tools');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger_1.Logger.dim(' Ubuntu/Debian: sudo apt-get install build-essential python3');
|
|
60
|
+
logger_1.Logger.dim(' Fedora/RHEL: sudo dnf install gcc-c++ make python3');
|
|
61
|
+
logger_1.Logger.dim(' macOS: xcode-select --install');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (result.warnings.length > 0) {
|
|
65
|
+
logger_1.Logger.warning('Optional tools not found:');
|
|
66
|
+
result.warnings.forEach(tool => logger_1.Logger.dim(` - ${tool}`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.SystemCheck = SystemCheck;
|
|
71
|
+
//# sourceMappingURL=system-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-check.js","sourceRoot":"","sources":["../../../src/utils/system-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function renderTemplates(templatesDir: string, destDir: string, variables: Record<string, any>, engineType?: 'mustache' | 'handlebars'): void;
|
|
2
|
+
export declare function copyDir(srcDir: string, destDir: string, variables?: Record<string, any>, engineType?: 'mustache' | 'handlebars'): void;
|
|
3
|
+
//# sourceMappingURL=template-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../../src/utils/template-renderer.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,UAAU,GAAE,UAAU,GAAG,YAAyB,GACjD,IAAI,CA0CN;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAE,UAAU,GAAG,YAAyB,GAAG,IAAI,CA2ClJ"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.renderTemplates = renderTemplates;
|
|
37
|
+
exports.copyDir = copyDir;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const templates_1 = require("../templates");
|
|
41
|
+
const shell_utils_1 = require("./shell-utils");
|
|
42
|
+
const logger_1 = require("../cli/logger");
|
|
43
|
+
function renderTemplates(templatesDir, destDir, variables, engineType = 'mustache') {
|
|
44
|
+
if (!fs.existsSync(templatesDir))
|
|
45
|
+
return;
|
|
46
|
+
const engine = (0, templates_1.createEngine)(engineType);
|
|
47
|
+
function renderDir(srcDir, outDir) {
|
|
48
|
+
if (!fs.existsSync(srcDir))
|
|
49
|
+
return;
|
|
50
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
53
|
+
const destPath = path.join(outDir, entry.name.replace(/\\.mustache$/, ''));
|
|
54
|
+
if (entry.isDirectory()) {
|
|
55
|
+
renderDir(srcPath, destPath);
|
|
56
|
+
}
|
|
57
|
+
else if (entry.isFile()) {
|
|
58
|
+
const template = fs.readFileSync(srcPath, 'utf8');
|
|
59
|
+
const rendered = engine.render(template, variables);
|
|
60
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
61
|
+
fs.writeFileSync(destPath, rendered, 'utf8');
|
|
62
|
+
(0, shell_utils_1.setPerms)(destPath);
|
|
63
|
+
logger_1.Logger.dim(` Rendered: ${path.relative(destDir, destPath)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const subdirs = [
|
|
68
|
+
{ name: 'root', dest: destDir },
|
|
69
|
+
{ name: 'react', dest: variables.REACT_APP_NAME ? path.join(destDir, variables.REACT_APP_NAME) : null },
|
|
70
|
+
{ name: 'react-lib', dest: variables.REACT_LIB_NAME ? path.join(destDir, variables.REACT_LIB_NAME) : null },
|
|
71
|
+
{ name: 'api', dest: variables.API_APP_NAME ? path.join(destDir, variables.API_APP_NAME) : null },
|
|
72
|
+
{ name: 'api-lib', dest: variables.API_LIB_NAME ? path.join(destDir, variables.API_LIB_NAME) : null },
|
|
73
|
+
{ name: 'lib', dest: variables.LIB_NAME ? path.join(destDir, variables.LIB_NAME) : null },
|
|
74
|
+
];
|
|
75
|
+
for (const { name, dest } of subdirs) {
|
|
76
|
+
if (!dest)
|
|
77
|
+
continue;
|
|
78
|
+
const src = path.join(templatesDir, name);
|
|
79
|
+
if (fs.existsSync(src)) {
|
|
80
|
+
renderDir(src, dest);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function copyDir(srcDir, destDir, variables, engineType = 'mustache') {
|
|
85
|
+
if (!fs.existsSync(srcDir))
|
|
86
|
+
return;
|
|
87
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
88
|
+
const engine = variables ? (0, templates_1.createEngine)(engineType) : null;
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
91
|
+
const isMustache = entry.name.endsWith('.mustache');
|
|
92
|
+
const destName = isMustache ? entry.name.replace(/\.mustache$/, '') : entry.name;
|
|
93
|
+
const destPath = path.join(destDir, destName);
|
|
94
|
+
if (entry.isDirectory()) {
|
|
95
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
96
|
+
copyDir(srcPath, destPath, variables, engineType);
|
|
97
|
+
}
|
|
98
|
+
else if (entry.isFile()) {
|
|
99
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
100
|
+
if (isMustache && engine && variables) {
|
|
101
|
+
// Render mustache template
|
|
102
|
+
const template = fs.readFileSync(srcPath, 'utf8');
|
|
103
|
+
const rendered = engine.render(template, variables);
|
|
104
|
+
fs.writeFileSync(destPath, rendered, 'utf8');
|
|
105
|
+
logger_1.Logger.dim(` Rendered: ${path.relative(destDir, destPath)}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Direct copy with simple placeholder replacement
|
|
109
|
+
let content = fs.readFileSync(srcPath, 'utf8');
|
|
110
|
+
if (variables) {
|
|
111
|
+
// Replace all @VARIABLE@ placeholders with their values
|
|
112
|
+
Object.keys(variables).forEach(key => {
|
|
113
|
+
const placeholder = `@${key.toUpperCase()}@`;
|
|
114
|
+
const value = variables[key];
|
|
115
|
+
if (typeof value === 'string') {
|
|
116
|
+
content = content.replace(new RegExp(placeholder, 'g'), value);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
fs.writeFileSync(destPath, content, 'utf8');
|
|
121
|
+
logger_1.Logger.dim(` Copied: ${path.relative(destDir, destPath)}`);
|
|
122
|
+
}
|
|
123
|
+
(0, shell_utils_1.setPerms)(destPath);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=template-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../../src/utils/template-renderer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@digitaldefiance/express-suite-starter",
|
|
3
|
+
"version": "2.1.41",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"bin": {
|
|
6
|
+
"create-express-suite": "./dist/src/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"templates",
|
|
11
|
+
"config",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"start": "npx tsc && node dist/src/generate-monorepo.js",
|
|
16
|
+
"create-project": "yarn start",
|
|
17
|
+
"build": "npx tsc",
|
|
18
|
+
"build:logged": "npx tsc 2>&1 | ansifilter -o build.log",
|
|
19
|
+
"test": "npx jest",
|
|
20
|
+
"test:watch": "npx jest --watch",
|
|
21
|
+
"test:coverage": "npx jest --coverage",
|
|
22
|
+
"test:logged": "npx jest 2>&1 | ansifilter -o test.log",
|
|
23
|
+
"sync-templates": "npx ts-node tools/sync-templates.ts",
|
|
24
|
+
"prepublishOnly": "yarn build && yarn test"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@digitaldefiance/i18n-lib": "2.1.40",
|
|
28
|
+
"@inquirer/prompts": "^7.5.0",
|
|
29
|
+
"chalk": "^4.1.2",
|
|
30
|
+
"mustache": "^4.2.0",
|
|
31
|
+
"validator": "^13.15.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@digitaldefiance/express-suite-test-utils": "1.0.7",
|
|
35
|
+
"@nx/js": "22.0.2",
|
|
36
|
+
"@nx/workspace": "22.0.2",
|
|
37
|
+
"@types/jest": "^29.5.0",
|
|
38
|
+
"@types/mustache": "^4.2.5",
|
|
39
|
+
"@types/node": "^20.0.0",
|
|
40
|
+
"@types/validator": "^13.15.0",
|
|
41
|
+
"handlebars": "^4.7.8",
|
|
42
|
+
"jest": "^29.7.0",
|
|
43
|
+
"nx": "22.0.2",
|
|
44
|
+
"plop": "^4.0.1",
|
|
45
|
+
"prettier": "^3.5.3",
|
|
46
|
+
"ts-jest": "^29.1.0",
|
|
47
|
+
"ts-node": "^10.9.2",
|
|
48
|
+
"typescript": "5.9.3"
|
|
49
|
+
},
|
|
50
|
+
"packageManager": "yarn@4.10.3"
|
|
51
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Database Configuration
|
|
2
|
+
MONGO_URI=mongodb://localhost:27017/{{WORKSPACE_NAME}}
|
|
3
|
+
MONGO_USE_TRANSACTIONS=true
|
|
4
|
+
MONGO_TRANSACTION_RETRY_BASE_DELAY=75
|
|
5
|
+
MONGO_TRANSACTION_TIMEOUT=60000
|
|
6
|
+
MONGO_TRANSACTION_LOCK_REQUEST_TIMEOUT=30000
|
|
7
|
+
MONGO_MAX_POOL_SIZE=10
|
|
8
|
+
MONGO_MIN_POOL_SIZE=2
|
|
9
|
+
MONGO_MAX_IDLE_TIME_MS=30000
|
|
10
|
+
MONGO_SERVER_SELECTION_TIMEOUT_MS=5000
|
|
11
|
+
MONGO_SOCKET_TIMEOUT_MS=45000
|
|
12
|
+
MONGO_RETRY_WRITES=true
|
|
13
|
+
MONGO_RETRY_READS=true
|
|
14
|
+
|
|
15
|
+
# Security Secrets (generate with: openssl rand -hex 32)
|
|
16
|
+
JWT_SECRET={{EXAMPLE_JWT_SECRET}}
|
|
17
|
+
MNEMONIC_ENCRYPTION_KEY=
|
|
18
|
+
MNEMONIC_HMAC_SECRET=
|
|
19
|
+
|
|
20
|
+
# AWS Configuration (for email and translation services)
|
|
21
|
+
AWS_ACCESS_KEY_ID=
|
|
22
|
+
AWS_SECRET_ACCESS_KEY=
|
|
23
|
+
AWS_REGION=us-west-2
|
|
24
|
+
|
|
25
|
+
# Application Settings
|
|
26
|
+
DEBUG=true
|
|
27
|
+
DETAILED_DEBUG=true
|
|
28
|
+
HOST=0.0.0.0
|
|
29
|
+
PORT=3000
|
|
30
|
+
HTTPS_DEV_PORT=3443
|
|
31
|
+
HOSTNAME={{HOSTNAME}}
|
|
32
|
+
|
|
33
|
+
# Build Paths
|
|
34
|
+
API_DIST_DIR=./dist/{{API_APP_NAME}}
|
|
35
|
+
REACT_DIST_DIR=./dist/{{REACT_APP_NAME}}
|
|
36
|
+
|
|
37
|
+
# System User Configuration (generated by inituserdb)
|
|
38
|
+
SYSTEM_ID=
|
|
39
|
+
SYSTEM_MNEMONIC=
|
|
40
|
+
SYSTEM_PUBLIC_KEY=
|
|
41
|
+
SYSTEM_PASSWORD=
|
|
42
|
+
SYSTEM_ROLE_ID=
|
|
43
|
+
SYSTEM_USER_ROLE_ID=
|
|
44
|
+
|
|
45
|
+
# Admin User Configuration (generated by inituserdb)
|
|
46
|
+
ADMIN_ID=
|
|
47
|
+
ADMIN_MNEMONIC=
|
|
48
|
+
ADMIN_PASSWORD=
|
|
49
|
+
ADMIN_ROLE_ID=
|
|
50
|
+
ADMIN_USER_ROLE_ID=
|
|
51
|
+
|
|
52
|
+
# Member User Configuration (generated by inituserdb)
|
|
53
|
+
MEMBER_ID=
|
|
54
|
+
MEMBER_MNEMONIC=
|
|
55
|
+
MEMBER_PASSWORD=
|
|
56
|
+
MEMBER_ROLE_ID=
|
|
57
|
+
MEMBER_USER_ROLE_ID=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# {{API_LIB_NAME}}
|
|
2
|
+
|
|
3
|
+
API business logic library for {{WORKSPACE_NAME}}.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Business logic, services, and models for the API layer.
|
|
8
|
+
|
|
9
|
+
## Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
src/
|
|
13
|
+
├── services/ # Business logic services
|
|
14
|
+
├── models/ # Data models
|
|
15
|
+
├── validators/ # Input validation
|
|
16
|
+
└── utils/ # API utilities
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { UserService } from '{{NAMESPACE_ROOT}}/api-lib';
|
|
23
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# {{REACT_LIB_NAME}}
|
|
2
|
+
|
|
3
|
+
React component library for {{WORKSPACE_NAME}}.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Reusable React components, hooks, and utilities shared across React applications.
|
|
8
|
+
|
|
9
|
+
## Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
src/
|
|
13
|
+
├── components/ # UI components
|
|
14
|
+
├── hooks/ # Custom hooks
|
|
15
|
+
├── contexts/ # React contexts
|
|
16
|
+
└── utils/ # React utilities
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { Button, useAuth } from '{{NAMESPACE_ROOT}}/react-lib';
|
|
23
|
+
```
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# {{WORKSPACE_NAME}}
|
|
2
|
+
|
|
3
|
+
A modern MERN stack application built with Express Suite.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **React Frontend**: React 19 with TypeScript, Material-UI, and Vite
|
|
8
|
+
- **Express Backend**: Node.js API with MongoDB and comprehensive authentication
|
|
9
|
+
- **Authentication**: Multi-factor authentication with JWT, backup codes, and email verification
|
|
10
|
+
- **Internationalization**: Multi-language support with i18n
|
|
11
|
+
- **Monorepo**: Nx workspace with integrated projects
|
|
12
|
+
- **Type Safety**: Full TypeScript support across frontend and backend
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
### Prerequisites
|
|
17
|
+
|
|
18
|
+
- Node.js 22+
|
|
19
|
+
- Yarn 4.9+
|
|
20
|
+
- MongoDB (local or Docker)
|
|
21
|
+
|
|
22
|
+
### Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Install dependencies
|
|
26
|
+
yarn install
|
|
27
|
+
|
|
28
|
+
# Set up environment variables
|
|
29
|
+
cp {{API_APP_NAME}}/.env.example {{API_APP_NAME}}/.env
|
|
30
|
+
# Edit {{API_APP_NAME}}/.env with your configuration
|
|
31
|
+
|
|
32
|
+
# Initialize database (optional - creates test users)
|
|
33
|
+
yarn inituserdb
|
|
34
|
+
|
|
35
|
+
# Build all projects
|
|
36
|
+
yarn build:dev
|
|
37
|
+
|
|
38
|
+
# Start development server
|
|
39
|
+
yarn serve:dev
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The API will be available at `http://localhost:3000` and the React app at `http://localhost:4200`.
|
|
43
|
+
|
|
44
|
+
## Project Structure
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
{{WORKSPACE_NAME}}/
|
|
48
|
+
├── {{API_APP_NAME}}/ # Express.js REST API
|
|
49
|
+
├── {{API_LIB_NAME}}/ # API business logic library
|
|
50
|
+
├── {{REACT_APP_NAME}}/ # React frontend application
|
|
51
|
+
├── {{REACT_LIB_NAME}}/ # Shared React components library
|
|
52
|
+
├── {{LIB_NAME}}/ # Shared utilities and types
|
|
53
|
+
├── {{INITUSERDB_NAME}}/ # Database initialization utility
|
|
54
|
+
├── {{TEST_UTILS_NAME}}/ # Testing utilities
|
|
55
|
+
└── *-e2e/ # End-to-end test projects
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Available Scripts
|
|
59
|
+
|
|
60
|
+
### Build Commands
|
|
61
|
+
```bash
|
|
62
|
+
yarn build # Production build all projects
|
|
63
|
+
yarn build:dev # Development build all projects
|
|
64
|
+
yarn build:api # Build API only
|
|
65
|
+
yarn build:react # Build React frontend only
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Development Server
|
|
69
|
+
```bash
|
|
70
|
+
yarn serve:dev # Start API server (development)
|
|
71
|
+
yarn serve # Start API server (production)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Testing
|
|
75
|
+
```bash
|
|
76
|
+
yarn test:all # Run all tests
|
|
77
|
+
yarn test:jest # Unit tests only
|
|
78
|
+
yarn test:e2e # End-to-end tests only
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Code Quality
|
|
82
|
+
```bash
|
|
83
|
+
yarn lint:all # Lint all projects
|
|
84
|
+
yarn prettier:check # Check code formatting
|
|
85
|
+
yarn prettier:fix # Fix code formatting
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Environment Configuration
|
|
89
|
+
|
|
90
|
+
### Required Environment Variables
|
|
91
|
+
|
|
92
|
+
Edit `{{API_APP_NAME}}/.env`:
|
|
93
|
+
|
|
94
|
+
**Database**:
|
|
95
|
+
```bash
|
|
96
|
+
MONGO_URI=mongodb://localhost:27017/{{WORKSPACE_NAME}}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Security Secrets** (generate with `openssl rand -hex 32`):
|
|
100
|
+
```bash
|
|
101
|
+
JWT_SECRET=your-secret-here
|
|
102
|
+
MNEMONIC_ENCRYPTION_KEY=your-key-here
|
|
103
|
+
MNEMONIC_HMAC_SECRET=your-secret-here
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**AWS Services** (optional - for email and translation):
|
|
107
|
+
```bash
|
|
108
|
+
AWS_ACCESS_KEY_ID=your-access-key
|
|
109
|
+
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
110
|
+
AWS_REGION=us-west-2
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## API Endpoints
|
|
114
|
+
|
|
115
|
+
Base URL: `http://localhost:3000/api`
|
|
116
|
+
|
|
117
|
+
### Authentication
|
|
118
|
+
- `POST /register` - User registration
|
|
119
|
+
- `POST /login` - User login
|
|
120
|
+
- `POST /verify` - Verify JWT token
|
|
121
|
+
- `POST /backup-code` - Backup code login
|
|
122
|
+
- `GET /backup-codes` - Get backup code count
|
|
123
|
+
|
|
124
|
+
### User Management
|
|
125
|
+
- `POST /change-password` - Change password
|
|
126
|
+
- `POST /user/language` - Update user language
|
|
127
|
+
|
|
128
|
+
## Development
|
|
129
|
+
|
|
130
|
+
### Adding New Routes
|
|
131
|
+
|
|
132
|
+
1. Create route handler in `{{API_APP_NAME}}/src/routes/`
|
|
133
|
+
2. Register route in `{{API_APP_NAME}}/src/app.ts`
|
|
134
|
+
3. Add corresponding React component in `{{REACT_APP_NAME}}/src/app/`
|
|
135
|
+
4. Update routing in `{{REACT_APP_NAME}}/src/app/app.tsx`
|
|
136
|
+
|
|
137
|
+
### Database Initialization
|
|
138
|
+
|
|
139
|
+
The `inituserdb` utility creates three system users:
|
|
140
|
+
- **System User**: Internal operations
|
|
141
|
+
- **Admin User**: Administrative access
|
|
142
|
+
- **Member User**: Standard user for testing
|
|
143
|
+
|
|
144
|
+
Run with:
|
|
145
|
+
```bash
|
|
146
|
+
yarn inituserdb
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Technology Stack
|
|
150
|
+
|
|
151
|
+
### Frontend
|
|
152
|
+
- React 19
|
|
153
|
+
- TypeScript
|
|
154
|
+
- Material-UI (MUI)
|
|
155
|
+
- React Router
|
|
156
|
+
- Axios
|
|
157
|
+
- Vite
|
|
158
|
+
|
|
159
|
+
### Backend
|
|
160
|
+
- Node.js
|
|
161
|
+
- Express.js
|
|
162
|
+
- MongoDB with Mongoose
|
|
163
|
+
- JWT Authentication
|
|
164
|
+
- @digitaldefiance/node-express-suite
|
|
165
|
+
|
|
166
|
+
### Development Tools
|
|
167
|
+
- Nx (monorepo management)
|
|
168
|
+
- Jest (testing)
|
|
169
|
+
- Playwright (E2E testing)
|
|
170
|
+
- ESLint (linting)
|
|
171
|
+
- Prettier (formatting)
|
|
172
|
+
|
|
173
|
+
## License
|
|
174
|
+
|
|
175
|
+
MIT
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
SKIP_INSTALL=0
|
|
4
|
+
if [ "$1" == "--skip-install" ]; then
|
|
5
|
+
SKIP_INSTALL=1
|
|
6
|
+
fi
|
|
7
|
+
|
|
8
|
+
# change directories into the script directory
|
|
9
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
|
10
|
+
cd "$SCRIPT_DIR"
|
|
11
|
+
echo "Resetting the NX project"
|
|
12
|
+
npx nx reset
|
|
13
|
+
echo "Removing dist and node_modules directories"
|
|
14
|
+
rm -rf dist node_modules ./{{ LIB_NAME }}/node_modules ./{{ API_APP_NAME }}/node_modules ./{{ REACT_APP_NAME}}/node_modules
|
|
15
|
+
rm -rf yarn.lock ./{{ LIB_NAME }}/yarn.lock ./{{ API_APP_NAME }}/yarn.lock ./{{ REACT_APP_NAME}}/yarn.lock
|
|
16
|
+
|
|
17
|
+
echo "Doing yarn cache clean"
|
|
18
|
+
./do-yarn.sh cache clean
|
|
19
|
+
|
|
20
|
+
if [ $SKIP_INSTALL -eq 0 ]; then
|
|
21
|
+
echo "Doing yarn install"
|
|
22
|
+
./do-yarn.sh install
|
|
23
|
+
else
|
|
24
|
+
echo "Skipping yarn install"
|
|
25
|
+
fi
|