@simplens/onboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +214 -0
  2. package/dist/__tests__/errors.test.d.ts +2 -0
  3. package/dist/__tests__/errors.test.d.ts.map +1 -0
  4. package/dist/__tests__/errors.test.js +125 -0
  5. package/dist/__tests__/errors.test.js.map +1 -0
  6. package/dist/__tests__/utils.test.d.ts +2 -0
  7. package/dist/__tests__/utils.test.d.ts.map +1 -0
  8. package/dist/__tests__/utils.test.js +105 -0
  9. package/dist/__tests__/utils.test.js.map +1 -0
  10. package/dist/__tests__/validators.test.d.ts +2 -0
  11. package/dist/__tests__/validators.test.d.ts.map +1 -0
  12. package/dist/__tests__/validators.test.js +148 -0
  13. package/dist/__tests__/validators.test.js.map +1 -0
  14. package/dist/config/constants.d.ts +69 -0
  15. package/dist/config/constants.d.ts.map +1 -0
  16. package/dist/config/constants.js +79 -0
  17. package/dist/config/constants.js.map +1 -0
  18. package/dist/config/index.d.ts +2 -0
  19. package/dist/config/index.d.ts.map +1 -0
  20. package/dist/config/index.js +2 -0
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/env-config.d.ts +33 -0
  23. package/dist/env-config.d.ts.map +1 -0
  24. package/dist/env-config.js +285 -0
  25. package/dist/env-config.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +153 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infra.d.ts +31 -0
  31. package/dist/infra.d.ts.map +1 -0
  32. package/dist/infra.js +267 -0
  33. package/dist/infra.js.map +1 -0
  34. package/dist/plugins.d.ts +35 -0
  35. package/dist/plugins.d.ts.map +1 -0
  36. package/dist/plugins.js +164 -0
  37. package/dist/plugins.js.map +1 -0
  38. package/dist/services.d.ts +52 -0
  39. package/dist/services.d.ts.map +1 -0
  40. package/dist/services.js +158 -0
  41. package/dist/services.js.map +1 -0
  42. package/dist/templates.d.ts +3 -0
  43. package/dist/templates.d.ts.map +1 -0
  44. package/dist/templates.js +202 -0
  45. package/dist/templates.js.map +1 -0
  46. package/dist/types/domain.d.ts +119 -0
  47. package/dist/types/domain.d.ts.map +1 -0
  48. package/dist/types/domain.js +5 -0
  49. package/dist/types/domain.js.map +1 -0
  50. package/dist/types/errors.d.ts +69 -0
  51. package/dist/types/errors.d.ts.map +1 -0
  52. package/dist/types/errors.js +129 -0
  53. package/dist/types/errors.js.map +1 -0
  54. package/dist/types/index.d.ts +3 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/dist/utils/index.d.ts +2 -0
  59. package/dist/utils/index.d.ts.map +1 -0
  60. package/dist/utils/index.js +2 -0
  61. package/dist/utils/index.js.map +1 -0
  62. package/dist/utils/logger.d.ts +54 -0
  63. package/dist/utils/logger.d.ts.map +1 -0
  64. package/dist/utils/logger.js +92 -0
  65. package/dist/utils/logger.js.map +1 -0
  66. package/dist/utils.d.ts +32 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +79 -0
  69. package/dist/utils.js.map +1 -0
  70. package/dist/validators.d.ts +93 -0
  71. package/dist/validators.d.ts.map +1 -0
  72. package/dist/validators.js +180 -0
  73. package/dist/validators.js.map +1 -0
  74. package/package.json +45 -0
  75. package/src/__tests__/errors.test.ts +187 -0
  76. package/src/__tests__/utils.test.ts +142 -0
  77. package/src/__tests__/validators.test.ts +195 -0
  78. package/src/config/constants.ts +86 -0
  79. package/src/config/index.ts +1 -0
  80. package/src/env-config.ts +320 -0
  81. package/src/index.ts +203 -0
  82. package/src/infra.ts +300 -0
  83. package/src/plugins.ts +190 -0
  84. package/src/services.ts +190 -0
  85. package/src/templates.ts +203 -0
  86. package/src/types/domain.ts +127 -0
  87. package/src/types/errors.ts +173 -0
  88. package/src/types/index.ts +2 -0
  89. package/src/utils/index.ts +1 -0
  90. package/src/utils/logger.ts +118 -0
  91. package/src/utils.ts +105 -0
  92. package/src/validators.ts +192 -0
  93. package/tsconfig.json +19 -0
  94. package/vitest.config.ts +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAY,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,eAAe,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,eAAe,CAAC;AAEvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,mBAAmB,CAAC;KACzB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,SAAS,EAAE,6DAA6D,CAAC;KAChF,MAAM,CAAC,cAAc,EAAE,oDAAoD,CAAC;KAC5E,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;KACpD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAE/B;;GAEG;AACH,KAAK,UAAU,kBAAkB;IAK7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAClC;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,6EAA6E;YACtF,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;SAC1C;QACD;YACI,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,wCAAwC;YACjD,OAAO,EAAE;gBACL,EAAE,IAAI,EAAE,uDAAuD,EAAE,KAAK,EAAE,SAAS,EAAE;gBACnF,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,aAAa,EAAE;aAC3E;YACD,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG;SAC3B;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG;SAC3B;KACJ,CAAC,CAAC;IAEH,OAAO;QACH,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;QAClE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS;QACpD,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE;KAC/D,CAAC;AACN,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACf,IAAI,CAAC;QACD,iBAAiB;QACjB,aAAa,EAAE,CAAC;QAEhB,uCAAuC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,UAAU,CAAC;YACP,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;YAC1B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS;SAClF,CAAC,CAAC;QAEH,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAC/B,QAAQ,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjD,2CAA2C;QAC3C,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAEhD,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;QAC1C,QAAQ,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;QAEpD,iCAAiC;QACjC,MAAM,qBAAqB,EAAE,CAAC;QAE9B,6DAA6D;QAC7D,IAAI,qBAAqB,GAAa,EAAE,CAAC;QACzC,IAAI,SAAS,GAAG,sBAAsB,CAAC;QAEvC,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,+BAA+B,CAAC,CAAC;YACzC,qBAAqB,GAAG,MAAM,mBAAmB,EAAE,CAAC;YACpD,SAAS,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,6DAA6D,CAAC,CAAC;QAC3E,CAAC;QAED,kCAAkC;QAClC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC7C,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEjC,oCAAoC;QACpC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE1C,8BAA8B;QAC9B,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACtC,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QAEtE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,oBAAoB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEvD,4CAA4C;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,CAAC;YAEhE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,cAAc,CAAC,CAAC;gBAClE,MAAM,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAEhD,IAAI,WAAW,EAAE,CAAC;YACd,mDAAmD;YACnD,IAAI,YAAY,CAAC,KAAK,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;YAED,qBAAqB;YACrB,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAElC,yBAAyB;YACzB,MAAM,oBAAoB,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,sDAAsD,CAAC,CAAC;YAChE,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC5C,CAAC;QAED,wBAAwB;QACxB,UAAU,CAAC,oDAAoD,CAAC,CAAC;IAErE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,wBAAwB;QACxB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9C,yCAAyC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,oBAAoB;AACpB,IAAI,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Prompts user to select which infrastructure services to deploy.
3
+ * Services include MongoDB, Kafka, Redis, Loki, and Grafana.
4
+ *
5
+ * @returns Array of selected service IDs (e.g., ['mongo', 'kafka', 'redis'])
6
+ * @throws Error if no services are selected
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const services = await promptInfraServices();
11
+ * // Returns: ['mongo', 'kafka', 'kafka-ui', 'redis']
12
+ * ```
13
+ */
14
+ export declare function promptInfraServices(): Promise<string[]>;
15
+ /**
16
+ * Get infrastructure host based on OS
17
+ */
18
+ export declare function getInfraHost(): string;
19
+ /**
20
+ * Replace INFRA_HOST placeholder in template
21
+ */
22
+ export declare function replaceInfraHost(template: string, infraHost: string): string;
23
+ /**
24
+ * Generate and write docker-compose.infra.yaml
25
+ */
26
+ export declare function generateInfraCompose(targetDir: string, selectedServices: string[]): Promise<string>;
27
+ /**
28
+ * Write app docker-compose.yaml
29
+ */
30
+ export declare function writeAppCompose(targetDir: string): Promise<void>;
31
+ //# sourceMappingURL=infra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB7D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAmCrC;AA2KD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE"}
package/dist/infra.js ADDED
@@ -0,0 +1,267 @@
1
+ import inquirer from 'inquirer';
2
+ import { APP_COMPOSE_TEMPLATE } from './templates.js';
3
+ import { writeFile, logInfo, logSuccess } from './utils.js';
4
+ import path from 'path';
5
+ const INFRA_SERVICES = [
6
+ { name: 'MongoDB (Database)', value: 'mongo', checked: true },
7
+ { name: 'Kafka (Message Queue)', value: 'kafka', checked: true },
8
+ { name: 'Kafka UI (Dashboard)', value: 'kafka-ui', checked: true },
9
+ { name: 'Redis (Cache)', value: 'redis', checked: true },
10
+ { name: 'Loki (Log Aggregation)', value: 'loki', checked: false },
11
+ { name: 'Grafana (Observability Dashboard)', value: 'grafana', checked: false },
12
+ ];
13
+ /**
14
+ * Prompts user to select which infrastructure services to deploy.
15
+ * Services include MongoDB, Kafka, Redis, Loki, and Grafana.
16
+ *
17
+ * @returns Array of selected service IDs (e.g., ['mongo', 'kafka', 'redis'])
18
+ * @throws Error if no services are selected
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const services = await promptInfraServices();
23
+ * // Returns: ['mongo', 'kafka', 'kafka-ui', 'redis']
24
+ * ```
25
+ */
26
+ export async function promptInfraServices() {
27
+ const answer = await inquirer.prompt([
28
+ {
29
+ type: 'checkbox',
30
+ name: 'services',
31
+ message: 'Select infrastructure services to run:',
32
+ choices: INFRA_SERVICES,
33
+ validate: (input) => {
34
+ if (input.length === 0) {
35
+ return 'Please select at least one service';
36
+ }
37
+ return true;
38
+ },
39
+ },
40
+ ]);
41
+ return answer.services;
42
+ }
43
+ /**
44
+ * Get infrastructure host based on OS
45
+ */
46
+ export function getInfraHost() {
47
+ // const os = detectOS();
48
+ // if (os === 'linux') {
49
+ // logWarning('Linux detected: host.docker.internal does not work by default.');
50
+ // const answer = await inquirer.prompt<{ hostChoice: string; customHost?: string }>([
51
+ // {
52
+ // type: 'list',
53
+ // name: 'hostChoice',
54
+ // message: 'Select host configuration:',
55
+ // choices: [
56
+ // { name: 'Use Docker bridge IP (172.17.0.1)', value: '172.17.0.1' },
57
+ // { name: 'Enter custom IP/hostname', value: 'custom' },
58
+ // ],
59
+ // },
60
+ // {
61
+ // type: 'input',
62
+ // name: 'customHost',
63
+ // message: 'Enter your machine IP or hostname:',
64
+ // when: (answers) => answers.hostChoice === 'custom',
65
+ // validate: (input: string) => {
66
+ // if (!input || input.trim().length === 0) {
67
+ // return 'Please enter a valid IP or hostname';
68
+ // }
69
+ // return true;
70
+ // },
71
+ // },
72
+ // ]);
73
+ // return answer.hostChoice === 'custom' ? answer.customHost! : answer.hostChoice;
74
+ // }
75
+ // For Windows, linux and macOS, use host.docker.internal
76
+ return 'host.docker.internal';
77
+ }
78
+ /**
79
+ * Service chunk definitions - each service as a complete block
80
+ */
81
+ const SERVICE_CHUNKS = {
82
+ 'mongo': ` mongo:
83
+ image: mongo:7.0
84
+ container_name: mongo
85
+ command: [ "--replSet", "rs0", "--bind_ip_all", "--port", "27017" ]
86
+ ports:
87
+ - 27017:27017
88
+ extra_hosts:
89
+ - "host.docker.internal:host-gateway"
90
+ healthcheck:
91
+ test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }" | mongosh --port 27017 --quiet
92
+ interval: 5s
93
+ timeout: 30s
94
+ start_period: 0s
95
+ start_interval: 1s
96
+ retries: 30
97
+ volumes:
98
+ - "mongo_data:/data/db"
99
+ - "mongo_config:/data/configdb"`,
100
+ 'kafka': ` kafka:
101
+ image: apache/kafka-native
102
+ container_name: kafka
103
+ ports:
104
+ - "9092:9092"
105
+ environment:
106
+ # Configure listeners for both docker and host communication
107
+ KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093
108
+ KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093
109
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT
110
+
111
+ # Settings required for KRaft mode
112
+ KAFKA_NODE_ID: 1
113
+ KAFKA_PROCESS_ROLES: broker,controller
114
+ KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
115
+ KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091
116
+
117
+ # Listener to use for broker-to-broker communication
118
+ KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
119
+
120
+ # Required for a single node cluster
121
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
122
+
123
+ # Disable auto-topic creation - API server will create topics with correct partitions
124
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
125
+ volumes:
126
+ - "kafka_data:/var/lib/kafka/data"`,
127
+ 'kafka-ui': ` kafka-ui:
128
+ image: kafbat/kafka-ui:main
129
+ container_name: kafka-ui
130
+ ports:
131
+ - 8080:8080
132
+ environment:
133
+ DYNAMIC_CONFIG_ENABLED: "true"
134
+ KAFKA_CLUSTERS_0_NAME: local
135
+ KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093
136
+ depends_on:
137
+ - kafka`,
138
+ 'redis': ` redis:
139
+ image: redis:7-alpine
140
+ container_name: redis
141
+ ports:
142
+ - "6379:6379"
143
+ command: redis-server --appendonly yes
144
+ volumes:
145
+ - "redis_data:/data"
146
+ healthcheck:
147
+ test: [ "CMD", "redis-cli", "ping" ]
148
+ interval: 5s
149
+ timeout: 3s
150
+ retries: 5`,
151
+ 'loki': ` loki:
152
+ image: grafana/loki:2.9.0
153
+ container_name: loki
154
+ ports:
155
+ - "3100:3100"
156
+ command: -config.file=/etc/loki/local-config.yaml
157
+ volumes:
158
+ - "loki_data:/loki"
159
+ healthcheck:
160
+ test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
161
+ interval: 10s
162
+ timeout: 5s
163
+ retries: 5`,
164
+ 'grafana': ` grafana:
165
+ image: grafana/grafana:10.2.0
166
+ container_name: grafana
167
+ ports:
168
+ - "3001:3000"
169
+ environment:
170
+ - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
171
+ - GF_AUTH_ANONYMOUS_ENABLED=true
172
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
173
+ - GF_SECURITY_ADMIN_PASSWORD=admin
174
+ volumes:
175
+ - "grafana_data:/var/lib/grafana"
176
+ depends_on:
177
+ loki:
178
+ condition: service_healthy`,
179
+ };
180
+ /**
181
+ * Service-to-volumes mapping
182
+ */
183
+ const SERVICE_VOLUMES = {
184
+ 'mongo': ['mongo_data', 'mongo_config'],
185
+ 'kafka': ['kafka_data'],
186
+ 'kafka-ui': [],
187
+ 'redis': ['redis_data'],
188
+ 'loki': ['loki_data'],
189
+ 'grafana': ['grafana_data'],
190
+ };
191
+ /**
192
+ * Build docker-compose content from selected services
193
+ */
194
+ function buildInfraCompose(selectedServices) {
195
+ // Header
196
+ const header = `# ============================================
197
+ # INFRA_HOST: Set this in .env to your machine's IP/hostname when running
198
+ # infrastructure on a separate system from application services.
199
+ # Default: host.docker.internal (for same-system deployment)
200
+ # ============================================
201
+
202
+ services:
203
+ # ============================================
204
+ # Infrastructure Services
205
+ # ============================================`;
206
+ // Assemble selected service chunks
207
+ const serviceBlocks = [];
208
+ for (const service of selectedServices) {
209
+ if (SERVICE_CHUNKS[service]) {
210
+ serviceBlocks.push(SERVICE_CHUNKS[service]);
211
+ }
212
+ }
213
+ // Collect volumes for selected services
214
+ const volumeSet = new Set();
215
+ for (const service of selectedServices) {
216
+ const volumes = SERVICE_VOLUMES[service] || [];
217
+ volumes.forEach(v => volumeSet.add(v));
218
+ }
219
+ // Build volumes section
220
+ const volumeLines = ['', 'volumes:'];
221
+ for (const volume of Array.from(volumeSet).sort()) {
222
+ volumeLines.push(` ${volume}:`);
223
+ }
224
+ // Build networks section with custom default network name
225
+ const networkLines = ['', 'networks:', ' default:', ' name: simplens'];
226
+ // Combine all parts
227
+ return [
228
+ header,
229
+ serviceBlocks.join('\n\n'),
230
+ volumeLines.join('\n'),
231
+ networkLines.join('\n'),
232
+ ].join('\n');
233
+ }
234
+ /**
235
+ * Replace INFRA_HOST placeholder in template
236
+ */
237
+ export function replaceInfraHost(template, infraHost) {
238
+ return template.replace(/\{\{INFRA_HOST\}\}/g, infraHost);
239
+ }
240
+ /**
241
+ * Generate and write docker-compose.infra.yaml
242
+ */
243
+ export async function generateInfraCompose(targetDir, selectedServices) {
244
+ logInfo('Generating docker-compose.infra.yaml...');
245
+ // Get infrastructure host
246
+ const infraHost = getInfraHost();
247
+ logSuccess(`Using infrastructure host: ${infraHost}`);
248
+ // Build compose content from service chunks
249
+ let infraContent = buildInfraCompose(selectedServices);
250
+ // Replace host placeholder
251
+ infraContent = replaceInfraHost(infraContent, infraHost);
252
+ // Write infrastructure compose file
253
+ const infraPath = path.join(targetDir, 'docker-compose.infra.yaml');
254
+ await writeFile(infraPath, infraContent);
255
+ logSuccess('Generated docker-compose.infra.yaml');
256
+ // Return infraHost for env configuration
257
+ return infraHost;
258
+ }
259
+ /**
260
+ * Write app docker-compose.yaml
261
+ */
262
+ export async function writeAppCompose(targetDir) {
263
+ const appPath = path.join(targetDir, 'docker-compose.yaml');
264
+ await writeFile(appPath, APP_COMPOSE_TEMPLATE);
265
+ logSuccess('Generated docker-compose.yaml');
266
+ }
267
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { PluginInfo } from './types/domain.js';
2
+ /**
3
+ * Fetches available SimpleNS plugins using the config-gen CLI tool.
4
+ * Falls back to default plugins if fetching fails.
5
+ *
6
+ * @returns Array of available plugin information
7
+ *
8
+ * @remarks
9
+ * Uses `npx @simplens/config-gen list --official` to fetch plugins.
10
+ * Default fallback plugins: mock, nodemailer-gmail, resend
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const plugins = await fetchAvailablePlugins();
15
+ * // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
16
+ * ```
17
+ */
18
+ export declare function fetchAvailablePlugins(): Promise<PluginInfo[]>;
19
+ /**
20
+ * Prompt user to select plugins
21
+ */
22
+ export declare function promptPluginSelection(availablePlugins: PluginInfo[]): Promise<string[]>;
23
+ /**
24
+ * Generate plugin configuration using config-gen
25
+ */
26
+ export declare function generatePluginConfig(targetDir: string, selectedPlugins: string[]): Promise<void>;
27
+ /**
28
+ * Parse simplens.config.yaml to extract credential keys
29
+ */
30
+ export declare function parseConfigCredentials(configPath: string): Promise<string[]>;
31
+ /**
32
+ * Prompt for plugin-specific credentials
33
+ */
34
+ export declare function promptPluginCredentials(credentialKeys: string[]): Promise<Map<string, string>>;
35
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAwCnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoB7F;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BlF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA+BpG"}
@@ -0,0 +1,164 @@
1
+ import inquirer from 'inquirer';
2
+ import { execa } from 'execa';
3
+ import yaml from 'js-yaml';
4
+ import { readFile, logInfo, logSuccess, logError, logWarning } from './utils.js';
5
+ import path from 'path';
6
+ /**
7
+ * Fetches available SimpleNS plugins using the config-gen CLI tool.
8
+ * Falls back to default plugins if fetching fails.
9
+ *
10
+ * @returns Array of available plugin information
11
+ *
12
+ * @remarks
13
+ * Uses `npx @simplens/config-gen list --official` to fetch plugins.
14
+ * Default fallback plugins: mock, nodemailer-gmail, resend
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const plugins = await fetchAvailablePlugins();
19
+ * // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
20
+ * ```
21
+ */
22
+ export async function fetchAvailablePlugins() {
23
+ logInfo('Fetching available plugins...');
24
+ try {
25
+ // Execute config-gen list command
26
+ const { stdout } = await execa('npx', ['@simplens/config-gen', 'list', '--official'], {
27
+ stdio: 'pipe',
28
+ });
29
+ // Parse output to extract plugins
30
+ // Expected format: " @simplens/package-name Plugin Name"
31
+ const plugins = [];
32
+ const lines = stdout.split('\n');
33
+ for (const line of lines) {
34
+ // Match plugin lines (starts with @simplens/)
35
+ const match = line.match(/^\s+(@simplens\/[\w-]+)\s+(.+)$/);
36
+ if (match) {
37
+ const [, packageName, rest] = match;
38
+ // Extract name and description
39
+ const parts = rest.split(/\s{2,}/); // Split by multiple spaces
40
+ plugins.push({
41
+ package: packageName.trim(),
42
+ name: parts[0]?.trim() || packageName,
43
+ description: parts[1]?.trim() || '',
44
+ });
45
+ }
46
+ }
47
+ logSuccess(`Found ${plugins.length} available plugins`);
48
+ return plugins;
49
+ }
50
+ catch (error) {
51
+ logWarning('Could not fetch plugins list. Using defaults.');
52
+ // Return default plugins as fallback
53
+ return [
54
+ { package: '@simplens/mock', name: 'Mock Provider', description: 'Mock notification provider for testing' },
55
+ { package: '@simplens/nodemailer-gmail', name: 'Gmail', description: 'Send emails via Gmail' },
56
+ { package: '@simplens/resend', name: 'Resend', description: 'Send emails via Resend' },
57
+ ];
58
+ }
59
+ }
60
+ /**
61
+ * Prompt user to select plugins
62
+ */
63
+ export async function promptPluginSelection(availablePlugins) {
64
+ if (availablePlugins.length === 0) {
65
+ logWarning('No plugins available to select.');
66
+ return [];
67
+ }
68
+ const answer = await inquirer.prompt([
69
+ {
70
+ type: 'checkbox',
71
+ name: 'plugins',
72
+ message: 'Select plugins to install:',
73
+ choices: availablePlugins.map(p => ({
74
+ name: `${p.name} (${p.package}) - ${p.description}`,
75
+ value: p.package,
76
+ checked: p.package === '@simplens/mock', // Mock checked by default
77
+ })),
78
+ },
79
+ ]);
80
+ return answer.plugins;
81
+ }
82
+ /**
83
+ * Generate plugin configuration using config-gen
84
+ */
85
+ export async function generatePluginConfig(targetDir, selectedPlugins) {
86
+ if (selectedPlugins.length === 0) {
87
+ logInfo('No plugins selected, skipping config generation.');
88
+ return;
89
+ }
90
+ logInfo(`Generating configuration for ${selectedPlugins.length} plugin(s)...`);
91
+ try {
92
+ const configPath = path.join(targetDir, 'simplens.config.yaml');
93
+ // Execute config-gen for all selected plugins
94
+ // Use relative path to avoid WSL path issues when npx runs Windows binaries
95
+ await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: 'inherit' });
96
+ logSuccess('Generated simplens.config.yaml');
97
+ }
98
+ catch (error) {
99
+ logError('Failed to generate plugin configuration');
100
+ throw error;
101
+ }
102
+ }
103
+ /**
104
+ * Parse simplens.config.yaml to extract credential keys
105
+ */
106
+ export async function parseConfigCredentials(configPath) {
107
+ try {
108
+ const content = await readFile(configPath);
109
+ const config = yaml.load(content);
110
+ const credentialKeys = new Set();
111
+ // Extract credential keys from providers (ONLY from credentials, not optionalConfig)
112
+ if (config.providers && Array.isArray(config.providers)) {
113
+ for (const provider of config.providers) {
114
+ if (provider.credentials && typeof provider.credentials === 'object') {
115
+ for (const [key, value] of Object.entries(provider.credentials)) {
116
+ // Extract env var name from ${ENV_VAR} format
117
+ if (typeof value === 'string' && value.startsWith('${') && value.endsWith('}')) {
118
+ const envVar = value.slice(2, -1);
119
+ credentialKeys.add(envVar);
120
+ }
121
+ }
122
+ }
123
+ // NOTE: We intentionally skip optionalConfig - those are optional!
124
+ }
125
+ }
126
+ return Array.from(credentialKeys);
127
+ }
128
+ catch (error) {
129
+ logWarning('Could not parse config file for credentials');
130
+ return [];
131
+ }
132
+ }
133
+ /**
134
+ * Prompt for plugin-specific credentials
135
+ */
136
+ export async function promptPluginCredentials(credentialKeys) {
137
+ if (credentialKeys.length === 0) {
138
+ logInfo('No plugin credentials required.');
139
+ return new Map();
140
+ }
141
+ logInfo('Configuring plugin credentials...');
142
+ const result = new Map();
143
+ for (const key of credentialKeys) {
144
+ const answer = await inquirer.prompt([
145
+ {
146
+ type: key.toLowerCase().includes('password') || key.toLowerCase().includes('key')
147
+ ? 'password'
148
+ : 'input',
149
+ name: 'value',
150
+ message: `${key}:`,
151
+ validate: (input) => {
152
+ if (!input || input.trim().length === 0) {
153
+ return `${key} is required`;
154
+ }
155
+ return true;
156
+ },
157
+ },
158
+ ]);
159
+ result.set(key, answer.value);
160
+ }
161
+ logSuccess('Plugin credentials configured');
162
+ return result;
163
+ }
164
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Prompts user whether to start the services immediately after setup.
3
+ *
4
+ * @returns `true` if user wants to start services, `false` otherwise
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * if (await promptStartServices()) {
9
+ * await startInfraServices(targetDir);
10
+ * }
11
+ * ```
12
+ */
13
+ export declare function promptStartServices(): Promise<boolean>;
14
+ /**
15
+ * Starts infrastructure services using docker-compose.
16
+ * Runs `docker-compose -f docker-compose.infra.yaml up -d` in the target directory.
17
+ *
18
+ * @param targetDir - Directory containing docker-compose.infra.yaml
19
+ * @throws Error if docker-compose command fails
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * await startInfraServices('/opt/simplens');
24
+ * ```
25
+ */
26
+ export declare function startInfraServices(targetDir: string): Promise<void>;
27
+ /**
28
+ * Waits for infrastructure services to become healthy.
29
+ * Polls Docker health checks for up to 60 seconds (30 retries × 2s).
30
+ *
31
+ * @param targetDir - Directory where services are running
32
+ *
33
+ * @remarks
34
+ * Checks for healthy containers running MongoDB or Redis.
35
+ * Configuration: 30 max retries, 2000ms delay between retries.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * await startInfraServices(targetDir);
40
+ * await waitForInfraHealth(targetDir); // Wait for services to be ready
41
+ * ```
42
+ */
43
+ export declare function waitForInfraHealth(targetDir: string): Promise<void>;
44
+ /**
45
+ * Start application services
46
+ */
47
+ export declare function startAppServices(targetDir: string): Promise<void>;
48
+ /**
49
+ * Display service status and URLs
50
+ */
51
+ export declare function displayServiceStatus(): Promise<void>;
52
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C1D"}