@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.
Files changed (214) hide show
  1. package/README.md +342 -0
  2. package/config/package-groups.json +83 -0
  3. package/config/presets/minimal.json +32 -0
  4. package/config/presets/standard.json +70 -0
  5. package/dist/scripts/addScriptsToPackageJson.d.ts +7 -0
  6. package/dist/scripts/addScriptsToPackageJson.d.ts.map +1 -0
  7. package/dist/scripts/addScriptsToPackageJson.js +69 -0
  8. package/dist/scripts/addScriptsToPackageJson.js.map +1 -0
  9. package/dist/scripts/albatross.d.ts +4 -0
  10. package/dist/scripts/albatross.d.ts.map +1 -0
  11. package/dist/scripts/albatross.js +36 -0
  12. package/dist/scripts/albatross.js.map +1 -0
  13. package/dist/scripts/fsUtils.d.ts +15 -0
  14. package/dist/scripts/fsUtils.d.ts.map +1 -0
  15. package/dist/scripts/fsUtils.js +99 -0
  16. package/dist/scripts/fsUtils.js.map +1 -0
  17. package/dist/scripts/generate-monorepo.d.ts +2 -0
  18. package/dist/scripts/generate-monorepo.d.ts.map +1 -0
  19. package/dist/scripts/generate-monorepo.js +227 -0
  20. package/dist/scripts/generate-monorepo.js.map +1 -0
  21. package/dist/scripts/licensePrompt.d.ts +5 -0
  22. package/dist/scripts/licensePrompt.d.ts.map +1 -0
  23. package/dist/scripts/licensePrompt.js +63 -0
  24. package/dist/scripts/licensePrompt.js.map +1 -0
  25. package/dist/scripts/monorepoConfig.d.ts +18 -0
  26. package/dist/scripts/monorepoConfig.d.ts.map +1 -0
  27. package/dist/scripts/monorepoConfig.js +83 -0
  28. package/dist/scripts/monorepoConfig.js.map +1 -0
  29. package/dist/scripts/nodeSetup.d.ts +5 -0
  30. package/dist/scripts/nodeSetup.d.ts.map +1 -0
  31. package/dist/scripts/nodeSetup.js +32 -0
  32. package/dist/scripts/nodeSetup.js.map +1 -0
  33. package/dist/scripts/passwordObfuscator.d.ts +14 -0
  34. package/dist/scripts/passwordObfuscator.d.ts.map +1 -0
  35. package/dist/scripts/passwordObfuscator.js +52 -0
  36. package/dist/scripts/passwordObfuscator.js.map +1 -0
  37. package/dist/scripts/shellUtils.d.ts +11 -0
  38. package/dist/scripts/shellUtils.d.ts.map +1 -0
  39. package/dist/scripts/shellUtils.js +28 -0
  40. package/dist/scripts/shellUtils.js.map +1 -0
  41. package/dist/scripts/templateUtils.d.ts +6 -0
  42. package/dist/scripts/templateUtils.d.ts.map +1 -0
  43. package/dist/scripts/templateUtils.js +15 -0
  44. package/dist/scripts/templateUtils.js.map +1 -0
  45. package/dist/src/cli/logger.d.ts +15 -0
  46. package/dist/src/cli/logger.d.ts.map +1 -0
  47. package/dist/src/cli/logger.js +48 -0
  48. package/dist/src/cli/logger.js.map +1 -0
  49. package/dist/src/cli.d.ts +6 -0
  50. package/dist/src/cli.d.ts.map +1 -0
  51. package/dist/src/cli.js +12 -0
  52. package/dist/src/cli.js.map +1 -0
  53. package/dist/src/core/config-schema.d.ts +3 -0
  54. package/dist/src/core/config-schema.d.ts.map +1 -0
  55. package/dist/src/core/config-schema.js +20 -0
  56. package/dist/src/core/config-schema.js.map +1 -0
  57. package/dist/src/core/dry-run-executor.d.ts +15 -0
  58. package/dist/src/core/dry-run-executor.d.ts.map +1 -0
  59. package/dist/src/core/dry-run-executor.js +86 -0
  60. package/dist/src/core/dry-run-executor.js.map +1 -0
  61. package/dist/src/core/interfaces/checkpoint.interface.d.ts +6 -0
  62. package/dist/src/core/interfaces/checkpoint.interface.d.ts.map +1 -0
  63. package/dist/src/core/interfaces/checkpoint.interface.js +3 -0
  64. package/dist/src/core/interfaces/checkpoint.interface.js.map +1 -0
  65. package/dist/src/core/interfaces/command-options.interface.d.ts +5 -0
  66. package/dist/src/core/interfaces/command-options.interface.d.ts.map +1 -0
  67. package/dist/src/core/interfaces/command-options.interface.js +3 -0
  68. package/dist/src/core/interfaces/command-options.interface.js.map +1 -0
  69. package/dist/src/core/interfaces/devcontainer-config.interface.d.ts +6 -0
  70. package/dist/src/core/interfaces/devcontainer-config.interface.d.ts.map +1 -0
  71. package/dist/src/core/interfaces/devcontainer-config.interface.js +3 -0
  72. package/dist/src/core/interfaces/devcontainer-config.interface.js.map +1 -0
  73. package/dist/src/core/interfaces/dry-run.interface.d.ts +16 -0
  74. package/dist/src/core/interfaces/dry-run.interface.d.ts.map +1 -0
  75. package/dist/src/core/interfaces/dry-run.interface.js +3 -0
  76. package/dist/src/core/interfaces/dry-run.interface.js.map +1 -0
  77. package/dist/src/core/interfaces/generator-config.interface.d.ts +17 -0
  78. package/dist/src/core/interfaces/generator-config.interface.d.ts.map +1 -0
  79. package/dist/src/core/interfaces/generator-config.interface.js +3 -0
  80. package/dist/src/core/interfaces/generator-config.interface.js.map +1 -0
  81. package/dist/src/core/interfaces/generator-context.interface.d.ts +6 -0
  82. package/dist/src/core/interfaces/generator-context.interface.d.ts.map +1 -0
  83. package/dist/src/core/interfaces/generator-context.interface.js +3 -0
  84. package/dist/src/core/interfaces/generator-context.interface.js.map +1 -0
  85. package/dist/src/core/interfaces/index.d.ts +16 -0
  86. package/dist/src/core/interfaces/index.d.ts.map +1 -0
  87. package/dist/src/core/interfaces/index.js +32 -0
  88. package/dist/src/core/interfaces/index.js.map +1 -0
  89. package/dist/src/core/interfaces/node-config.interface.d.ts +5 -0
  90. package/dist/src/core/interfaces/node-config.interface.d.ts.map +1 -0
  91. package/dist/src/core/interfaces/node-config.interface.js +3 -0
  92. package/dist/src/core/interfaces/node-config.interface.js.map +1 -0
  93. package/dist/src/core/interfaces/nx-config.interface.d.ts +9 -0
  94. package/dist/src/core/interfaces/nx-config.interface.d.ts.map +1 -0
  95. package/dist/src/core/interfaces/nx-config.interface.js +3 -0
  96. package/dist/src/core/interfaces/nx-config.interface.js.map +1 -0
  97. package/dist/src/core/interfaces/package-config.interface.d.ts +6 -0
  98. package/dist/src/core/interfaces/package-config.interface.d.ts.map +1 -0
  99. package/dist/src/core/interfaces/package-config.interface.js +3 -0
  100. package/dist/src/core/interfaces/package-config.interface.js.map +1 -0
  101. package/dist/src/core/interfaces/package-resolution.interface.d.ts +21 -0
  102. package/dist/src/core/interfaces/package-resolution.interface.d.ts.map +1 -0
  103. package/dist/src/core/interfaces/package-resolution.interface.js +3 -0
  104. package/dist/src/core/interfaces/package-resolution.interface.js.map +1 -0
  105. package/dist/src/core/interfaces/plugin.interface.d.ts +21 -0
  106. package/dist/src/core/interfaces/plugin.interface.d.ts.map +1 -0
  107. package/dist/src/core/interfaces/plugin.interface.js +3 -0
  108. package/dist/src/core/interfaces/plugin.interface.js.map +1 -0
  109. package/dist/src/core/interfaces/project-config.interface.d.ts +7 -0
  110. package/dist/src/core/interfaces/project-config.interface.d.ts.map +1 -0
  111. package/dist/src/core/interfaces/project-config.interface.js +3 -0
  112. package/dist/src/core/interfaces/project-config.interface.js.map +1 -0
  113. package/dist/src/core/interfaces/step.interface.d.ts +9 -0
  114. package/dist/src/core/interfaces/step.interface.d.ts.map +1 -0
  115. package/dist/src/core/interfaces/step.interface.js +3 -0
  116. package/dist/src/core/interfaces/step.interface.js.map +1 -0
  117. package/dist/src/core/interfaces/template-config.interface.d.ts +5 -0
  118. package/dist/src/core/interfaces/template-config.interface.d.ts.map +1 -0
  119. package/dist/src/core/interfaces/template-config.interface.js +3 -0
  120. package/dist/src/core/interfaces/template-config.interface.js.map +1 -0
  121. package/dist/src/core/interfaces/validation-issue.interface.d.ts +18 -0
  122. package/dist/src/core/interfaces/validation-issue.interface.d.ts.map +1 -0
  123. package/dist/src/core/interfaces/validation-issue.interface.js +3 -0
  124. package/dist/src/core/interfaces/validation-issue.interface.js.map +1 -0
  125. package/dist/src/core/interfaces/validation-result.interface.d.ts +5 -0
  126. package/dist/src/core/interfaces/validation-result.interface.d.ts.map +1 -0
  127. package/dist/src/core/interfaces/validation-result.interface.js +3 -0
  128. package/dist/src/core/interfaces/validation-result.interface.js.map +1 -0
  129. package/dist/src/core/interfaces/workspace-config.interface.d.ts +8 -0
  130. package/dist/src/core/interfaces/workspace-config.interface.d.ts.map +1 -0
  131. package/dist/src/core/interfaces/workspace-config.interface.js +3 -0
  132. package/dist/src/core/interfaces/workspace-config.interface.js.map +1 -0
  133. package/dist/src/core/package-resolver.d.ts +10 -0
  134. package/dist/src/core/package-resolver.d.ts.map +1 -0
  135. package/dist/src/core/package-resolver.js +68 -0
  136. package/dist/src/core/package-resolver.js.map +1 -0
  137. package/dist/src/core/plugin-manager.d.ts +13 -0
  138. package/dist/src/core/plugin-manager.d.ts.map +1 -0
  139. package/dist/src/core/plugin-manager.js +48 -0
  140. package/dist/src/core/plugin-manager.js.map +1 -0
  141. package/dist/src/core/plugins/example-plugin.d.ts +3 -0
  142. package/dist/src/core/plugins/example-plugin.d.ts.map +1 -0
  143. package/dist/src/core/plugins/example-plugin.js +30 -0
  144. package/dist/src/core/plugins/example-plugin.js.map +1 -0
  145. package/dist/src/core/project-config-builder.d.ts +11 -0
  146. package/dist/src/core/project-config-builder.d.ts.map +1 -0
  147. package/dist/src/core/project-config-builder.js +77 -0
  148. package/dist/src/core/project-config-builder.js.map +1 -0
  149. package/dist/src/core/project-generator.d.ts +11 -0
  150. package/dist/src/core/project-generator.d.ts.map +1 -0
  151. package/dist/src/core/project-generator.js +29 -0
  152. package/dist/src/core/project-generator.js.map +1 -0
  153. package/dist/src/core/step-executor.d.ts +19 -0
  154. package/dist/src/core/step-executor.d.ts.map +1 -0
  155. package/dist/src/core/step-executor.js +130 -0
  156. package/dist/src/core/step-executor.js.map +1 -0
  157. package/dist/src/core/validators/config-validator.d.ts +10 -0
  158. package/dist/src/core/validators/config-validator.d.ts.map +1 -0
  159. package/dist/src/core/validators/config-validator.js +44 -0
  160. package/dist/src/core/validators/config-validator.js.map +1 -0
  161. package/dist/src/core/validators/post-generation-validator.d.ts +10 -0
  162. package/dist/src/core/validators/post-generation-validator.d.ts.map +1 -0
  163. package/dist/src/core/validators/post-generation-validator.js +219 -0
  164. package/dist/src/core/validators/post-generation-validator.js.map +1 -0
  165. package/dist/src/generate-monorepo.d.ts +3 -0
  166. package/dist/src/generate-monorepo.d.ts.map +1 -0
  167. package/dist/src/generate-monorepo.js +668 -0
  168. package/dist/src/generate-monorepo.js.map +1 -0
  169. package/dist/src/templates/engines/handlebars-engine.d.ts +7 -0
  170. package/dist/src/templates/engines/handlebars-engine.d.ts.map +1 -0
  171. package/dist/src/templates/engines/handlebars-engine.js +19 -0
  172. package/dist/src/templates/engines/handlebars-engine.js.map +1 -0
  173. package/dist/src/templates/engines/mustache-engine.d.ts +5 -0
  174. package/dist/src/templates/engines/mustache-engine.d.ts.map +1 -0
  175. package/dist/src/templates/engines/mustache-engine.js +44 -0
  176. package/dist/src/templates/engines/mustache-engine.js.map +1 -0
  177. package/dist/src/templates/index.d.ts +5 -0
  178. package/dist/src/templates/index.d.ts.map +1 -0
  179. package/dist/src/templates/index.js +21 -0
  180. package/dist/src/templates/index.js.map +1 -0
  181. package/dist/src/templates/interfaces/template-engine.interface.d.ts +4 -0
  182. package/dist/src/templates/interfaces/template-engine.interface.d.ts.map +1 -0
  183. package/dist/src/templates/interfaces/template-engine.interface.js +3 -0
  184. package/dist/src/templates/interfaces/template-engine.interface.js.map +1 -0
  185. package/dist/src/templates/template-engine-factory.d.ts +3 -0
  186. package/dist/src/templates/template-engine-factory.d.ts.map +1 -0
  187. package/dist/src/templates/template-engine-factory.js +9 -0
  188. package/dist/src/templates/template-engine-factory.js.map +1 -0
  189. package/dist/src/utils/diff-viewer.d.ts +15 -0
  190. package/dist/src/utils/diff-viewer.d.ts.map +1 -0
  191. package/dist/src/utils/diff-viewer.js +61 -0
  192. package/dist/src/utils/diff-viewer.js.map +1 -0
  193. package/dist/src/utils/doc-generator.d.ts +8 -0
  194. package/dist/src/utils/doc-generator.d.ts.map +1 -0
  195. package/dist/src/utils/doc-generator.js +174 -0
  196. package/dist/src/utils/doc-generator.js.map +1 -0
  197. package/dist/src/utils/shell-utils.d.ts +4 -0
  198. package/dist/src/utils/shell-utils.d.ts.map +1 -0
  199. package/dist/src/utils/shell-utils.js +32 -0
  200. package/dist/src/utils/shell-utils.js.map +1 -0
  201. package/dist/src/utils/system-check.d.ts +11 -0
  202. package/dist/src/utils/system-check.d.ts.map +1 -0
  203. package/dist/src/utils/system-check.js +71 -0
  204. package/dist/src/utils/system-check.js.map +1 -0
  205. package/dist/src/utils/template-renderer.d.ts +3 -0
  206. package/dist/src/utils/template-renderer.d.ts.map +1 -0
  207. package/dist/src/utils/template-renderer.js +127 -0
  208. package/dist/src/utils/template-renderer.js.map +1 -0
  209. package/package.json +51 -0
  210. package/templates/api/.env.example.mustache +57 -0
  211. package/templates/api-lib/README.md.mustache +23 -0
  212. package/templates/react-lib/README.md.mustache +23 -0
  213. package/templates/root/README.md.mustache +175 -0
  214. 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":";;;AAAA,iDAAyC;AACzC,0CAAuC;AAQvC,MAAa,WAAW;IACtB,MAAM,CAAC,KAAK;QACV,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;YAC5B,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,GAAW;QACnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;YAClE,IAAA,wBAAQ,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAyB;QAC1C,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,eAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,eAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1D,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,eAAM,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;gBACjE,eAAM,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;gBAC7E,eAAM,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;YAC1F,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;gBAC5E,eAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACrE,eAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,eAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF;AAtED,kCAsEC"}
@@ -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