@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
package/README.md ADDED
@@ -0,0 +1,342 @@
1
+ # Node Express Suite Starter
2
+
3
+ <a alt="Nx logo" href="https://nx.dev" target="_blank" rel="noreferrer"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png" width="45"></a>
4
+
5
+ Automated generator for MERN stack monorepos using [@digitaldefiance/node-express-suite](https://www.npmjs.com/package/@digitaldefiance/node-express-suite).
6
+
7
+ Part of [Express Suite](https://github.com/Digital-Defiance/express-suite)
8
+
9
+ ## Features
10
+
11
+ - 🚀 **Nx Monorepo** - Modern build system with caching
12
+ - ⚛️ **React 19** - Latest React with TypeScript
13
+ - 🔧 **Express 5** - Node.js API with @digitaldefiance/node-express-suite
14
+ - 🗄️ **MongoDB** - Database with Mongoose ODM
15
+ - 🎨 **Material-UI** - Component library
16
+ - 🔐 **ECIES Encryption** - Built-in cryptography
17
+ - 🌍 **i18n** - Multi-language support with @digitaldefiance/i18n-lib
18
+ - 🧪 **Testing** - Jest + Playwright E2E
19
+ - 🎯 **Enhanced CLI** - Chalk-powered interface with progress tracking
20
+ - 📦 **Package Groups** - Optional feature sets (auth, validation, docs)
21
+ - 🔄 **Rollback Support** - Checkpoint/restore for failed generations
22
+ - 🎨 **Template Engines** - Mustache with variable substitution
23
+ - 🐳 **DevContainer** - 4 options (none, simple, MongoDB, MongoDB replica set)
24
+ - 🔌 **Plugin System** - Extensible with lifecycle hooks
25
+ - ✅ **Validation** - Post-generation checks with fix suggestions
26
+ - 🖥️ **Cross-Platform** - Windows, macOS, and Linux support
27
+
28
+ ## Quick Start
29
+
30
+ ### NPX (Recommended)
31
+
32
+ ```bash
33
+ npx @digitaldefiance/express-suite-starter
34
+ ```
35
+
36
+ ### Local Development
37
+
38
+ ```bash
39
+ yarn install
40
+ yarn build
41
+ yarn start
42
+ ```
43
+
44
+ Follow the interactive prompts to generate your monorepo.
45
+
46
+ ## What Gets Generated
47
+
48
+ ### Projects (7 total, some optional)
49
+
50
+ ```
51
+ my-app/
52
+ ├── my-app-lib/ # Shared library (i18n, constants, enumerations)
53
+ ├── my-app-api-lib/ # API business logic (App, Environment, Constants)
54
+ ├── my-app-api/ # Express server (main.ts, views, .env)
55
+ ├── my-app-api-e2e/ # API E2E tests (Jest)
56
+ ├── my-app-react/ # React frontend (Vite + Material-UI)
57
+ ├── my-app-react-lib/ # React component library (optional)
58
+ ├── my-app-react-e2e/ # React E2E tests (Playwright, optional)
59
+ └── my-app-inituserdb/ # DB initialization (optional)
60
+ ```
61
+
62
+ Note: Test utilities are provided by `@digitaldefiance/express-suite-test-utils` package.
63
+
64
+ ### Scaffolding Files
65
+
66
+ - **lib**: i18n setup, string enumerations, constants, interfaces
67
+ - **api-lib**: Application class, Environment, Constants, interfaces
68
+ - **api**: main.ts entry point, EJS views, .env.example
69
+ - **react**: App structure, components, pages, assets
70
+ - **react-lib**: Theme configuration
71
+ - **root**: CI workflows, scripts, .gitignore, devcontainer
72
+
73
+ ## Generated Scripts
74
+
75
+ The generated monorepo includes:
76
+
77
+ ```bash
78
+ # Development
79
+ yarn build:dev # Development build
80
+ yarn serve:dev # Start API server (dev mode)
81
+ yarn serve:dev:stream # Start API with streaming output
82
+
83
+ # Production
84
+ yarn build # Production build (copies .env to dist/)
85
+ yarn serve # Start API server (production mode)
86
+ node dist/example-project-api/main.js # Direct production run
87
+
88
+ # Testing & Database
89
+ yarn test:all # Run all tests
90
+ yarn inituserdb:full:drop # Initialize database
91
+ ```
92
+
93
+ ## Architecture
94
+
95
+ ### Structure (v2.1.40)
96
+
97
+ ```
98
+ src/
99
+ ├── core/
100
+ │ ├── interfaces/ # 15+ TypeScript interfaces
101
+ │ ├── validators/ # Config + post-generation validation
102
+ │ ├── config-schema.ts # Configuration validation
103
+ │ ├── step-executor.ts # Step execution with rollback
104
+ │ ├── dry-run-executor.ts # Preview mode
105
+ │ ├── plugin-manager.ts # Plugin system with 5 hooks
106
+ │ ├── project-generator.ts # Nx project generation
107
+ │ ├── project-config-builder.ts # Dynamic project configs
108
+ │ └── package-resolver.ts # Version resolution
109
+ ├── cli/
110
+ │ └── logger.ts # Chalk-based semantic logging
111
+ ├── templates/
112
+ │ ├── engines/ # Mustache + Handlebars
113
+ │ └── template-engine-factory.ts
114
+ └── utils/
115
+ ├── shell-utils.ts # Cross-platform commands
116
+ ├── system-check.ts # Build tool validation
117
+ ├── template-renderer.ts # File operations
118
+ ├── doc-generator.ts # README/ARCHITECTURE/API docs
119
+ └── diff-viewer.ts # Dry-run preview
120
+ ```
121
+
122
+ ### Interactive Prompts
123
+
124
+ - **Workspace Configuration**: Name, prefix, namespace, parent directory
125
+ - **Optional Projects**: react-lib, api-lib, E2E tests, inituserdb, test-utils
126
+ - **Package Groups**: Authentication, validation, documentation, UI components
127
+ - **Express Suite Packages**: react-components, test-utils
128
+ - **DevContainer**: None, simple (Node.js), MongoDB, MongoDB replica set
129
+ - **Documentation**: Auto-generate README, ARCHITECTURE, API docs
130
+ - **Git**: Optional commit and push
131
+ - **Playwright**: Optional browser installation
132
+
133
+ ### DevContainer Options
134
+
135
+ 1. **None** - No devcontainer
136
+ 2. **Simple** - Node.js 20 only
137
+ 3. **MongoDB** - Node.js + MongoDB single instance
138
+ 4. **MongoDB Replica Set** - Node.js + MongoDB with transactions support
139
+
140
+ All devcontainers include VS Code extensions and run on Linux regardless of host OS.
141
+
142
+ ### Template Processing
143
+
144
+ **Scaffolding files** with `.mustache` extension are automatically processed:
145
+ - Variables replaced: `{{workspaceName}}`, `{{WorkspaceName}}`, `{{prefix}}`, `{{namespace}}`, `{{hostname}}`
146
+ - Extension stripped: `app.tsx.mustache` → `app.tsx`
147
+ - Non-mustache files copied directly without modification
148
+
149
+ **Example:**
150
+ ```typescript
151
+ // scaffolding/lib/src/lib/i18n-setup.ts.mustache
152
+ export const ComponentId = '{{WorkspaceName}}';
153
+
154
+ // Generated as: example-project-lib/src/lib/i18n-setup.ts
155
+ export const ComponentId = 'ExampleProject';
156
+ ```
157
+
158
+ ## Development
159
+
160
+ ### Build
161
+
162
+ ```bash
163
+ yarn build # TypeScript compilation
164
+ ```
165
+
166
+ ### Test
167
+
168
+ ```bash
169
+ yarn test # Run all tests (21 suites, 137 tests)
170
+ yarn test:watch # Watch mode
171
+ yarn test:coverage # Coverage report
172
+ ```
173
+
174
+ ### System Requirements
175
+
176
+ Automatically checked before generation:
177
+ - **C++ compiler** (g++, clang++, or Visual Studio Build Tools)
178
+ - **Python 3** (for node-gyp)
179
+ - **make** (Unix) or **MSBuild** (Windows)
180
+ - **git** (optional, warning only)
181
+
182
+ ### Cross-Platform Support
183
+
184
+ ✅ **Windows**: Uses `where` for command checks, Visual Studio Build Tools
185
+ ✅ **macOS**: Uses `command -v`, Xcode Command Line Tools
186
+ ✅ **Linux**: Uses `command -v`, build-essential package
187
+
188
+ ## Packages Installed
189
+
190
+ ### Express Suite (Core)
191
+ - `@digitaldefiance/node-express-suite` - Backend framework with BaseApplication, BaseRouter
192
+ - `@digitaldefiance/suite-core-lib` - Core utilities and constants
193
+ - `@digitaldefiance/ecies-lib` - Browser ECIES encryption
194
+ - `@digitaldefiance/node-ecies-lib` - Node.js ECIES encryption
195
+ - `@digitaldefiance/i18n-lib` - Multi-language support with I18nEngine
196
+
197
+ ### Express Suite (Optional)
198
+ - `@digitaldefiance/express-suite-react-components` - Pre-built React components (useAuth, etc.)
199
+ - `@digitaldefiance/express-suite-test-utils` - Testing utilities (always included)
200
+
201
+ ### Core Stack
202
+ - **Backend**: Express 5, MongoDB, Mongoose
203
+ - **Frontend**: React 19, Vite, Material-UI
204
+ - **Testing**: Jest, Playwright
205
+ - **Build**: Nx, TypeScript, ESLint, Prettier
206
+
207
+ ## Advanced Features
208
+
209
+ ### Plugin System
210
+
211
+ Create custom plugins with 5 lifecycle hooks:
212
+
213
+ ```typescript
214
+ import { Plugin } from '@digitaldefiance/express-suite-starter';
215
+
216
+ export const myPlugin: Plugin = {
217
+ name: 'my-plugin',
218
+ hooks: {
219
+ beforeGeneration: async (context) => { /* ... */ },
220
+ afterGeneration: async (context) => { /* ... */ },
221
+ beforeStep: async (step, context) => { /* ... */ },
222
+ afterStep: async (step, context) => { /* ... */ },
223
+ onError: async (error, step, context) => { /* ... */ },
224
+ },
225
+ };
226
+ ```
227
+
228
+ ### Dry-Run Mode
229
+
230
+ Preview changes without creating files:
231
+
232
+ ```bash
233
+ npx @digitaldefiance/express-suite-starter --dry-run
234
+ ```
235
+
236
+ ### Post-Generation Validation
237
+
238
+ Automatic checks after generation:
239
+ - ✅ package.json validation
240
+ - ✅ Dependency conflict detection
241
+ - ✅ Best practices checking
242
+ - ✅ Fix suggestions
243
+
244
+ ### Package Groups
245
+
246
+ Optional feature sets in `config/package-groups.json`:
247
+ - **testing**: Additional test utilities
248
+ - **linting**: Enhanced linting rules
249
+ - **ui-components**: Extra UI libraries
250
+ - **database**: Database tools
251
+ - **authentication**: Auth utilities
252
+ - **validation**: Validation libraries
253
+ - **documentation**: Doc generation tools
254
+
255
+ ## CLI Features
256
+
257
+ ### Progress Tracking
258
+ ```
259
+ [1/15] Checking target directory ✓
260
+ [2/15] Creating Nx monorepo ✓
261
+ [3/15] Setting up git remote ✓
262
+ ...
263
+ [15/15] Installing Playwright browsers ✓
264
+ ```
265
+
266
+ ### Color-Coded Output
267
+ - ✓ Green: Success
268
+ - ✗ Red: Errors
269
+ - ⚠ Yellow: Warnings
270
+ - ℹ Blue: Information
271
+ - $ Gray: Commands
272
+
273
+ ### Semantic Logging
274
+ ```typescript
275
+ Logger.success('message') // ✓ Green
276
+ Logger.error('message') // ✗ Red
277
+ Logger.warning('message') // ⚠ Yellow
278
+ Logger.info('message') // ℹ Blue
279
+ Logger.step(1, 5, 'msg') // [1/5] Cyan
280
+ Logger.command('cmd') // $ Gray
281
+ ```
282
+
283
+ ## Documentation
284
+
285
+ - **ARCHITECTURE.md** - Comprehensive architecture documentation
286
+ - **CONTEXT.md** - Development context and decisions
287
+ - **PLUGIN_GUIDE.md** - Plugin development guide
288
+ - **QUICKSTART.md** - 10-minute quick start
289
+ - **EXAMPLES.md** - Usage examples
290
+
291
+ ## Testing
292
+
293
+ - **21 test suites** (18 unit + 3 integration)
294
+ - **137 tests** passing
295
+ - **95%+ coverage** on core components
296
+ - **100% coverage** on critical paths
297
+
298
+ ## Environment Configuration
299
+
300
+ ### Development
301
+
302
+ 1. **API .env**: Update `{prefix}-api/.env` with your configuration
303
+ 2. **DevContainer .env** (if using MongoDB devcontainer): Update `.devcontainer/.env`
304
+ - Replica set: `MONGO_URI=mongodb://localhost:27017/dbname?replicaSet=rs0&directConnection=true`
305
+ - Single instance: `MONGO_URI=mongodb://localhost:27017/dbname?directConnection=true`
306
+
307
+ ### Production Deployment
308
+
309
+ ```bash
310
+ # Build (copies .env to dist/)
311
+ yarn build
312
+
313
+ # Run from dist/
314
+ node dist/example-project-api/main.js
315
+
316
+ # Or use process manager
317
+ pm2 start dist/example-project-api/main.js
318
+ ```
319
+
320
+ The `.env` file is automatically copied to `dist/` during build via `post-build` target in `project.json`.
321
+
322
+ ## Version
323
+
324
+ **Current**: 2.1.40
325
+
326
+ **Status**: Production Ready ✅
327
+
328
+ ## Links
329
+
330
+ - [Express Suite Packages](https://www.npmjs.com/search?q=%40digitaldefiance)
331
+ - [GitHub Repository](https://github.com/Digital-Defiance/express-suite)
332
+ - [Nx Documentation](https://nx.dev)
333
+
334
+ ## License
335
+
336
+ MIT © Digital Defiance
337
+
338
+ ## ChangeLog
339
+
340
+ ### Version 2.1.41
341
+
342
+ - Update MONGO_URI and docs
@@ -0,0 +1,83 @@
1
+ {
2
+ "groups": [
3
+ {
4
+ "name": "testing",
5
+ "description": "Testing utilities and frameworks",
6
+ "enabled": true,
7
+ "packages": [
8
+ "jest",
9
+ "@types/jest",
10
+ "ts-jest",
11
+ "playwright",
12
+ "@playwright/test"
13
+ ]
14
+ },
15
+ {
16
+ "name": "linting",
17
+ "description": "Code quality and linting tools",
18
+ "enabled": true,
19
+ "packages": [
20
+ "eslint",
21
+ "@typescript-eslint/eslint-plugin",
22
+ "@typescript-eslint/parser",
23
+ "eslint-config-prettier",
24
+ "eslint-plugin-prettier"
25
+ ]
26
+ },
27
+ {
28
+ "name": "ui-components",
29
+ "description": "Material-UI component library",
30
+ "enabled": true,
31
+ "packages": [
32
+ "@mui/material",
33
+ "@mui/icons-material",
34
+ "@emotion/react",
35
+ "@emotion/styled"
36
+ ]
37
+ },
38
+ {
39
+ "name": "database",
40
+ "description": "MongoDB and database tools",
41
+ "enabled": true,
42
+ "packages": [
43
+ "mongodb",
44
+ "mongoose",
45
+ "mongodb-memory-server"
46
+ ]
47
+ },
48
+ {
49
+ "name": "authentication",
50
+ "description": "Authentication and security",
51
+ "enabled": false,
52
+ "packages": [
53
+ "jsonwebtoken",
54
+ "@types/jsonwebtoken",
55
+ "bcrypt",
56
+ "@types/bcrypt",
57
+ "passport",
58
+ "passport-jwt"
59
+ ]
60
+ },
61
+ {
62
+ "name": "validation",
63
+ "description": "Input validation libraries",
64
+ "enabled": false,
65
+ "packages": [
66
+ "joi",
67
+ "yup",
68
+ "validator",
69
+ "@types/validator"
70
+ ]
71
+ },
72
+ {
73
+ "name": "documentation",
74
+ "description": "API documentation tools",
75
+ "enabled": false,
76
+ "packages": [
77
+ "swagger-ui-express",
78
+ "@types/swagger-ui-express",
79
+ "swagger-jsdoc"
80
+ ]
81
+ }
82
+ ]
83
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "templates": {
3
+ "engine": "mustache"
4
+ },
5
+ "nx": {
6
+ "linter": "eslint",
7
+ "unitTestRunner": "jest",
8
+ "e2eTestRunner": "none",
9
+ "style": "css",
10
+ "bundler": "vite",
11
+ "ciProvider": "github"
12
+ },
13
+ "node": {
14
+ "version": "22",
15
+ "yarnVersion": "4.9.1"
16
+ },
17
+ "packages": {
18
+ "dev": [
19
+ "@typescript-eslint/eslint-plugin",
20
+ "@typescript-eslint/parser",
21
+ "@types/node",
22
+ "@types/react",
23
+ "@types/react-dom"
24
+ ],
25
+ "prod": [
26
+ "react",
27
+ "react-dom",
28
+ "express",
29
+ "dotenv"
30
+ ]
31
+ }
32
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "templates": {
3
+ "engine": "mustache"
4
+ },
5
+ "nx": {
6
+ "linter": "eslint",
7
+ "unitTestRunner": "jest",
8
+ "e2eTestRunner": "playwright",
9
+ "style": "scss",
10
+ "bundler": "vite",
11
+ "ciProvider": "github"
12
+ },
13
+ "node": {
14
+ "version": "22",
15
+ "yarnVersion": "4.9.1"
16
+ },
17
+ "packages": {
18
+ "dev": [
19
+ "@digitaldefiance/express-suite-test-utils@1.0.7",
20
+ "@typescript-eslint/eslint-plugin",
21
+ "@typescript-eslint/parser",
22
+ "eslint-config-prettier",
23
+ "eslint-plugin-prettier",
24
+ "eslint-plugin-react",
25
+ "eslint-plugin-react-hooks",
26
+ "eslint-plugin-import",
27
+ "eslint-plugin-jsx-a11y",
28
+ "eslint-plugin-playwright",
29
+ "mongodb-memory-server",
30
+ "supertest",
31
+ "patch-package",
32
+ "@types/cors",
33
+ "@types/express",
34
+ "@types/jsonwebtoken",
35
+ "@types/supertest",
36
+ "@types/node",
37
+ "@types/react",
38
+ "@types/react-dom",
39
+ "sass"
40
+ ],
41
+ "prod": [
42
+ "@digitaldefiance/node-express-suite",
43
+ "@digitaldefiance/ecies-lib",
44
+ "@digitaldefiance/node-ecies-lib",
45
+ "@digitaldefiance/i18n-lib",
46
+ "@digitaldefiance/suite-core-lib",
47
+ "@digitaldefiance/express-suite-react-components",
48
+ "@emotion/react",
49
+ "@emotion/styled",
50
+ "@mui/icons-material",
51
+ "@mui/material",
52
+ "@mui/system",
53
+ "@mui/x-date-pickers",
54
+ "axios",
55
+ "bip39",
56
+ "currency-codes",
57
+ "date-fns",
58
+ "react",
59
+ "react-dom",
60
+ "react-router-dom",
61
+ "cors",
62
+ "dotenv",
63
+ "express",
64
+ "helmet",
65
+ "jsonwebtoken",
66
+ "mongodb",
67
+ "mongoose"
68
+ ]
69
+ }
70
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Adds or updates a script in the "scripts" section of a package.json file.
3
+ * @param packageJsonPath Path to the package.json file.
4
+ * @param scripts Object containing script names and their corresponding commands.
5
+ */
6
+ export declare function addScriptsToPackageJson(packageJsonPath: string, scripts: Record<string, string>): void;
7
+ //# sourceMappingURL=addScriptsToPackageJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addScriptsToPackageJson.d.ts","sourceRoot":"","sources":["../../scripts/addScriptsToPackageJson.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI,CA4BN"}
@@ -0,0 +1,69 @@
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.addScriptsToPackageJson = addScriptsToPackageJson;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Adds or updates a script in the "scripts" section of a package.json file.
41
+ * @param packageJsonPath Path to the package.json file.
42
+ * @param scripts Object containing script names and their corresponding commands.
43
+ */
44
+ function addScriptsToPackageJson(packageJsonPath, scripts) {
45
+ const resolvedPath = path.resolve(packageJsonPath);
46
+ if (!fs.existsSync(resolvedPath)) {
47
+ throw new Error(`package.json not found at path: ${resolvedPath}`);
48
+ }
49
+ const packageJsonRaw = fs.readFileSync(resolvedPath, 'utf-8');
50
+ let packageJson;
51
+ try {
52
+ packageJson = JSON.parse(packageJsonRaw);
53
+ }
54
+ catch (err) {
55
+ throw new Error(`Failed to parse package.json: ${err}`);
56
+ }
57
+ if (!packageJson.scripts || typeof packageJson.scripts !== 'object') {
58
+ packageJson.scripts = {};
59
+ }
60
+ for (const [scriptName, command] of Object.entries(scripts)) {
61
+ if (typeof scriptName !== 'string' || typeof command !== 'string') {
62
+ throw new Error(`Invalid script name or command: ${scriptName}, ${command}`);
63
+ }
64
+ packageJson.scripts[scriptName] = command;
65
+ }
66
+ // Write back with 2-space indentation
67
+ fs.writeFileSync(resolvedPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
68
+ }
69
+ //# sourceMappingURL=addScriptsToPackageJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addScriptsToPackageJson.js","sourceRoot":"","sources":["../../scripts/addScriptsToPackageJson.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,0DA+BC;AAvCD,uCAAyB;AACzB,2CAA6B;AAE7B;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,eAAuB,EACvB,OAA+B;IAE/B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,WAAgB,CAAC;IACrB,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpE,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAC5C,CAAC;IAED,sCAAsC;IACtC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const STARTER_VERSION = "1.0.0";
2
+ export declare const STARTER_DESCRIPTION = "Node Express Suite Starter generates an NX monorepo MERN stack with React app, Express API, shared libraries, @digitaldefiance/node-express-suite, and @digitaldefiance/express-suite-react-components integration.";
3
+ export declare function printBanner(): void;
4
+ //# sourceMappingURL=albatross.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"albatross.d.ts","sourceRoot":"","sources":["../../scripts/albatross.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,mBAAmB,wNAAwN,CAAC;AAEzP,wBAAgB,WAAW,IAAI,IAAI,CA4BlC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STARTER_DESCRIPTION = exports.STARTER_VERSION = void 0;
4
+ exports.printBanner = printBanner;
5
+ exports.STARTER_VERSION = "1.0.0";
6
+ exports.STARTER_DESCRIPTION = "Node Express Suite Starter generates an NX monorepo MERN stack with React app, Express API, shared libraries, @digitaldefiance/node-express-suite, and @digitaldefiance/express-suite-react-components integration.";
7
+ function printBanner() {
8
+ console.log(`
9
+ \u001b[48;5;116m \u001b[m
10
+ \u001b[48;5;116m \u001b[m
11
+ \u001b[48;5;116m \u001b[m
12
+ \u001b[48;5;116m \u001b[m
13
+ \u001b[48;5;116m \u001b[38;5;254;48;5;152m▄\u001b[48;5;15m \u001b[38;5;15;48;5;254m▄\u001b[38;5;255;48;5;152m▄\u001b[38;5;250;48;5;116m▄\u001b[48;5;116m \u001b[m
14
+ \u001b[48;5;116m \u001b[38;5;255;48;5;116m▄\u001b[48;5;15m \u001b[38;5;15;48;5;240m▄▄\u001b[48;5;15m \u001b[38;5;187;48;5;223m▄\u001b[38;5;130;48;5;166m▄\u001b[38;5;166;48;5;167m▄▄▄▄\u001b[48;5;116m \u001b[m
15
+ \u001b[48;5;116m \u001b[48;5;255m \u001b[48;5;15m \u001b[38;5;255;48;5;15m▄▄\u001b[38;5;254;48;5;255m▄\u001b[38;5;116;48;5;116m▄\u001b[48;5;116m \u001b[m
16
+ \u001b[48;5;116m \u001b[38;5;152;48;5;116m▄\u001b[38;5;15;48;5;255m▄\u001b[48;5;15m \u001b[38;5;15;48;5;255m▄\u001b[38;5;255;48;5;255m▄\u001b[48;5;254m \u001b[48;5;116m \u001b[m
17
+ \u001b[48;5;116m \u001b[38;5;116;48;5;116m▄\u001b[38;5;247;48;5;116m▄▄▄▄▄▄▄▄▄▄▄▄▄\u001b[38;5;251;48;5;255m▄\u001b[48;5;15m \u001b[38;5;15;48;5;255m▄\u001b[48;5;254m \u001b[48;5;116m \u001b[m
18
+ \u001b[48;5;116m \u001b[38;5;242;48;5;116m▄\u001b[38;5;237;48;5;116m▄\u001b[38;5;237;48;5;238m▄▄\u001b[48;5;237m \u001b[38;5;237;48;5;237m▄\u001b[38;5;237;48;5;252m▄\u001b[38;5;249;48;5;15m▄\u001b[48;5;15m \u001b[38;5;255;48;5;254m▄\u001b[48;5;116m \u001b[m
19
+ \u001b[48;5;116m \u001b[38;5;109;48;5;109m▄\u001b[38;5;242;48;5;243m▄\u001b[38;5;237;48;5;109m▄▄\u001b[38;5;237;48;5;236m▄\u001b[38;5;236;48;5;236m▄\u001b[38;5;236;48;5;237m▄▄▄\u001b[48;5;237m \u001b[48;5;15m \u001b[48;5;255m \u001b[48;5;116m \u001b[m
20
+ \u001b[48;5;116m \u001b[38;5;116;48;5;66m▄\u001b[38;5;116;48;5;238m▄\u001b[38;5;246;48;5;237m▄\u001b[38;5;239;48;5;237m▄\u001b[38;5;239;48;5;236m▄\u001b[38;5;237;48;5;236m▄▄\u001b[38;5;241;48;5;236m▄\u001b[38;5;238;48;5;236m▄\u001b[38;5;236;48;5;236m▄▄\u001b[38;5;236;48;5;237m▄▄▄▄\u001b[38;5;237;48;5;237m▄▄▄▄▄▄\u001b[38;5;188;48;5;237m▄\u001b[38;5;15;48;5;251m▄\u001b[48;5;15m \u001b[38;5;15;48;5;255m▄\u001b[38;5;152;48;5;116m▄\u001b[48;5;116m \u001b[m
21
+ \u001b[48;5;116m \u001b[38;5;116;48;5;109m▄\u001b[38;5;116;48;5;253m▄\u001b[38;5;255;48;5;255m▄\u001b[38;5;15;48;5;255m▄\u001b[38;5;15;48;5;188m▄\u001b[38;5;15;48;5;236m▄\u001b[38;5;248;48;5;236m▄\u001b[38;5;245;48;5;236m▄\u001b[48;5;236m \u001b[38;5;240;48;5;236m▄\u001b[38;5;15;48;5;253m▄\u001b[48;5;15m \u001b[38;5;255;48;5;255m▄\u001b[38;5;116;48;5;116m▄\u001b[48;5;116m \u001b[m
22
+ \u001b[48;5;116m \u001b[38;5;152;48;5;254m▄\u001b[38;5;254;48;5;15m▄\u001b[38;5;255;48;5;15m▄▄\u001b[38;5;15;48;5;15m▄\u001b[48;5;15m \u001b[38;5;15;48;5;238m▄\u001b[38;5;252;48;5;236m▄\u001b[38;5;251;48;5;236m▄▄\u001b[38;5;255;48;5;238m▄\u001b[48;5;15m \u001b[38;5;152;48;5;255m▄\u001b[48;5;116m \u001b[m
23
+ \u001b[48;5;116m \u001b[38;5;116;48;5;116m▄\u001b[38;5;116;48;5;188m▄\u001b[38;5;116;48;5;254m▄\u001b[38;5;254;48;5;254m▄▄\u001b[38;5;254;48;5;255m▄▄\u001b[38;5;255;48;5;255m▄\u001b[48;5;15m \u001b[38;5;15;48;5;15m▄\u001b[38;5;116;48;5;255m▄\u001b[38;5;116;48;5;152m▄\u001b[48;5;116m \u001b[m
24
+ \u001b[48;5;116m \u001b[38;5;116;48;5;152m▄\u001b[38;5;152;48;5;152m▄\u001b[38;5;251;48;5;254m▄\u001b[38;5;254;48;5;255m▄\u001b[48;5;15m \u001b[38;5;255;48;5;15m▄\u001b[38;5;116;48;5;15m▄\u001b[38;5;116;48;5;152m▄▄\u001b[48;5;116m \u001b[m
25
+ \u001b[48;5;116m \u001b[38;5;116;48;5;251m▄\u001b[38;5;188;48;5;254m▄\u001b[48;5;15m \u001b[38;5;255;48;5;15m▄\u001b[38;5;116;48;5;255m▄\u001b[38;5;116;48;5;116m▄\u001b[48;5;116m \u001b[m
26
+ \u001b[48;5;116m \u001b[38;5;116;48;5;109m▄\u001b[38;5;8;48;5;102m▄\u001b[38;5;246;48;5;248m▄\u001b[38;5;250;48;5;116m▄\u001b[48;5;116m \u001b[m
27
+ \u001b[48;5;116m \u001b[38;5;116;48;5;116m▄\u001b[38;5;109;48;5;116m▄▄▄▄▄▄▄▄\u001b[38;5;109;48;5;247m▄\u001b[38;5;246;48;5;245m▄\u001b[38;5;247;48;5;246m▄\u001b[38;5;8;48;5;8m▄▄\u001b[38;5;8;48;5;245m▄\u001b[38;5;109;48;5;109m▄\u001b[38;5;109;48;5;116m▄▄▄▄▄\u001b[38;5;116;48;5;116m▄▄\u001b[48;5;116m \u001b[m
28
+ \u001b[48;5;116m \u001b[38;5;116;48;5;109m▄▄\u001b[48;5;109m \u001b[38;5;109;48;5;109m▄\u001b[38;5;109;48;5;248m▄▄▄▄▄\u001b[38;5;109;48;5;109m▄\u001b[48;5;109m \u001b[38;5;110;48;5;109m▄\u001b[38;5;116;48;5;109m▄\u001b[38;5;116;48;5;116m▄\u001b[48;5;116m \u001b[m
29
+ \u001b[48;5;116m \u001b[38;5;116;48;5;110m▄▄▄▄▄▄▄▄▄▄▄▄\u001b[38;5;116;48;5;116m▄\u001b[48;5;116m \u001b[m
30
+ \u001b[48;5;116m \u001b[m
31
+ \u001b[48;5;116m \u001b[m
32
+ \u001b[48;5;116m \u001b[m
33
+ `);
34
+ console.log(`\nNode Express Suite Starter (v${exports.STARTER_VERSION})\n\n${exports.STARTER_DESCRIPTION}\n`);
35
+ }
36
+ //# sourceMappingURL=albatross.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"albatross.js","sourceRoot":"","sources":["../../scripts/albatross.ts"],"names":[],"mappings":";;;AAGA,kCA4BC;AA/BY,QAAA,eAAe,GAAG,OAAO,CAAC;AAC1B,QAAA,mBAAmB,GAAG,qNAAqN,CAAC;AAEzP,SAAgB,WAAW;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,uBAAe,QAAQ,2BAAmB,IAAI,CAAC,CAAC;AAC9F,CAAC"}