@reyemtech/nimbus 0.1.0 → 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 (260) hide show
  1. package/README.md +71 -311
  2. package/dist/cjs/aws/dns.d.ts.map +1 -1
  3. package/dist/cjs/aws/dns.js +3 -1
  4. package/dist/cjs/aws/dns.js.map +1 -1
  5. package/dist/cjs/aws/index.d.ts +1 -0
  6. package/dist/cjs/aws/index.d.ts.map +1 -1
  7. package/dist/cjs/aws/index.js +3 -1
  8. package/dist/cjs/aws/index.js.map +1 -1
  9. package/dist/cjs/aws/network.d.ts.map +1 -1
  10. package/dist/cjs/aws/network.js +3 -1
  11. package/dist/cjs/aws/network.js.map +1 -1
  12. package/dist/cjs/aws/state.d.ts +32 -0
  13. package/dist/cjs/aws/state.d.ts.map +1 -0
  14. package/dist/cjs/aws/state.js +209 -0
  15. package/dist/cjs/aws/state.js.map +1 -0
  16. package/dist/cjs/azure/cluster.d.ts.map +1 -1
  17. package/dist/cjs/azure/cluster.js +15 -5
  18. package/dist/cjs/azure/cluster.js.map +1 -1
  19. package/dist/cjs/azure/dns.d.ts.map +1 -1
  20. package/dist/cjs/azure/dns.js +3 -1
  21. package/dist/cjs/azure/dns.js.map +1 -1
  22. package/dist/cjs/azure/index.d.ts +1 -0
  23. package/dist/cjs/azure/index.d.ts.map +1 -1
  24. package/dist/cjs/azure/index.js +3 -1
  25. package/dist/cjs/azure/index.js.map +1 -1
  26. package/dist/cjs/azure/network.d.ts.map +1 -1
  27. package/dist/cjs/azure/network.js +9 -3
  28. package/dist/cjs/azure/network.js.map +1 -1
  29. package/dist/cjs/azure/secrets.d.ts.map +1 -1
  30. package/dist/cjs/azure/secrets.js +6 -2
  31. package/dist/cjs/azure/secrets.js.map +1 -1
  32. package/dist/cjs/azure/state.d.ts +30 -0
  33. package/dist/cjs/azure/state.d.ts.map +1 -0
  34. package/dist/cjs/azure/state.js +115 -0
  35. package/dist/cjs/azure/state.js.map +1 -0
  36. package/dist/cjs/cache/interfaces.d.ts +12 -0
  37. package/dist/cjs/cache/interfaces.d.ts.map +1 -1
  38. package/dist/cjs/cli/templates.d.ts +67 -0
  39. package/dist/cjs/cli/templates.d.ts.map +1 -0
  40. package/dist/cjs/cli/templates.js +752 -0
  41. package/dist/cjs/cli/templates.js.map +1 -0
  42. package/dist/cjs/cli.d.ts +15 -0
  43. package/dist/cjs/cli.d.ts.map +1 -0
  44. package/dist/cjs/cli.js +209 -0
  45. package/dist/cjs/cli.js.map +1 -0
  46. package/dist/cjs/cluster/interfaces.d.ts +28 -0
  47. package/dist/cjs/cluster/interfaces.d.ts.map +1 -1
  48. package/dist/cjs/database/interfaces.d.ts +15 -0
  49. package/dist/cjs/database/interfaces.d.ts.map +1 -1
  50. package/dist/cjs/dns/interfaces.d.ts +11 -0
  51. package/dist/cjs/dns/interfaces.d.ts.map +1 -1
  52. package/dist/cjs/factories/cluster.d.ts +4 -3
  53. package/dist/cjs/factories/cluster.d.ts.map +1 -1
  54. package/dist/cjs/factories/cluster.js +46 -11
  55. package/dist/cjs/factories/cluster.js.map +1 -1
  56. package/dist/cjs/factories/dns.d.ts +3 -2
  57. package/dist/cjs/factories/dns.d.ts.map +1 -1
  58. package/dist/cjs/factories/dns.js +44 -9
  59. package/dist/cjs/factories/dns.js.map +1 -1
  60. package/dist/cjs/factories/index.d.ts +1 -0
  61. package/dist/cjs/factories/index.d.ts.map +1 -1
  62. package/dist/cjs/factories/index.js +3 -1
  63. package/dist/cjs/factories/index.js.map +1 -1
  64. package/dist/cjs/factories/network.d.ts +4 -3
  65. package/dist/cjs/factories/network.d.ts.map +1 -1
  66. package/dist/cjs/factories/network.js +46 -11
  67. package/dist/cjs/factories/network.js.map +1 -1
  68. package/dist/cjs/factories/secrets.d.ts +4 -3
  69. package/dist/cjs/factories/secrets.d.ts.map +1 -1
  70. package/dist/cjs/factories/secrets.js +45 -10
  71. package/dist/cjs/factories/secrets.js.map +1 -1
  72. package/dist/cjs/factories/state.d.ts +33 -0
  73. package/dist/cjs/factories/state.d.ts.map +1 -0
  74. package/dist/cjs/factories/state.js +96 -0
  75. package/dist/cjs/factories/state.js.map +1 -0
  76. package/dist/cjs/factories/types.d.ts +22 -0
  77. package/dist/cjs/factories/types.d.ts.map +1 -1
  78. package/dist/cjs/factories/types.js +18 -0
  79. package/dist/cjs/factories/types.js.map +1 -1
  80. package/dist/cjs/global-lb/glb.d.ts.map +1 -1
  81. package/dist/cjs/global-lb/glb.js +23 -9
  82. package/dist/cjs/global-lb/glb.js.map +1 -1
  83. package/dist/cjs/index.d.ts +2 -3
  84. package/dist/cjs/index.d.ts.map +1 -1
  85. package/dist/cjs/index.js +2 -13
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/network/cidr.d.ts +34 -0
  88. package/dist/cjs/network/cidr.d.ts.map +1 -1
  89. package/dist/cjs/network/cidr.js +34 -0
  90. package/dist/cjs/network/cidr.js.map +1 -1
  91. package/dist/cjs/network/interfaces.d.ts +16 -0
  92. package/dist/cjs/network/interfaces.d.ts.map +1 -1
  93. package/dist/cjs/platform/interfaces.d.ts +1 -1
  94. package/dist/cjs/platform/interfaces.d.ts.map +1 -1
  95. package/dist/cjs/platform/stack.d.ts.map +1 -1
  96. package/dist/cjs/platform/stack.js +6 -1
  97. package/dist/cjs/platform/stack.js.map +1 -1
  98. package/dist/cjs/queue/interfaces.d.ts +8 -0
  99. package/dist/cjs/queue/interfaces.d.ts.map +1 -1
  100. package/dist/cjs/secrets/interfaces.d.ts +5 -0
  101. package/dist/cjs/secrets/interfaces.d.ts.map +1 -1
  102. package/dist/cjs/state/index.d.ts +7 -0
  103. package/dist/cjs/state/index.d.ts.map +1 -0
  104. package/dist/cjs/state/index.js +8 -0
  105. package/dist/cjs/state/index.js.map +1 -0
  106. package/dist/cjs/state/interfaces.d.ts +82 -0
  107. package/dist/cjs/state/interfaces.d.ts.map +1 -0
  108. package/dist/cjs/state/interfaces.js +11 -0
  109. package/dist/cjs/state/interfaces.js.map +1 -0
  110. package/dist/cjs/storage/interfaces.d.ts +17 -0
  111. package/dist/cjs/storage/interfaces.d.ts.map +1 -1
  112. package/dist/cjs/types/cloud-target.d.ts +12 -0
  113. package/dist/cjs/types/cloud-target.d.ts.map +1 -1
  114. package/dist/cjs/types/cloud-target.js +12 -0
  115. package/dist/cjs/types/cloud-target.js.map +1 -1
  116. package/dist/cjs/types/tags.d.ts +16 -0
  117. package/dist/cjs/types/tags.d.ts.map +1 -1
  118. package/dist/cjs/types/tags.js +16 -0
  119. package/dist/cjs/types/tags.js.map +1 -1
  120. package/dist/cjs/types/validation.d.ts.map +1 -1
  121. package/dist/cjs/types/validation.js +14 -11
  122. package/dist/cjs/types/validation.js.map +1 -1
  123. package/dist/cjs/utils/index.d.ts +7 -0
  124. package/dist/cjs/utils/index.d.ts.map +1 -0
  125. package/dist/cjs/utils/index.js +11 -0
  126. package/dist/cjs/utils/index.js.map +1 -0
  127. package/dist/cjs/utils/provider-loader.d.ts +14 -0
  128. package/dist/cjs/utils/provider-loader.d.ts.map +1 -0
  129. package/dist/cjs/utils/provider-loader.js +66 -0
  130. package/dist/cjs/utils/provider-loader.js.map +1 -0
  131. package/dist/esm/aws/dns.d.ts.map +1 -1
  132. package/dist/esm/aws/dns.js +3 -1
  133. package/dist/esm/aws/dns.js.map +1 -1
  134. package/dist/esm/aws/index.d.ts +1 -0
  135. package/dist/esm/aws/index.d.ts.map +1 -1
  136. package/dist/esm/aws/index.js +3 -1
  137. package/dist/esm/aws/index.js.map +1 -1
  138. package/dist/esm/aws/network.d.ts.map +1 -1
  139. package/dist/esm/aws/network.js +3 -1
  140. package/dist/esm/aws/network.js.map +1 -1
  141. package/dist/esm/aws/state.d.ts +32 -0
  142. package/dist/esm/aws/state.d.ts.map +1 -0
  143. package/dist/esm/aws/state.js +209 -0
  144. package/dist/esm/aws/state.js.map +1 -0
  145. package/dist/esm/azure/cluster.d.ts.map +1 -1
  146. package/dist/esm/azure/cluster.js +15 -5
  147. package/dist/esm/azure/cluster.js.map +1 -1
  148. package/dist/esm/azure/dns.d.ts.map +1 -1
  149. package/dist/esm/azure/dns.js +3 -1
  150. package/dist/esm/azure/dns.js.map +1 -1
  151. package/dist/esm/azure/index.d.ts +1 -0
  152. package/dist/esm/azure/index.d.ts.map +1 -1
  153. package/dist/esm/azure/index.js +3 -1
  154. package/dist/esm/azure/index.js.map +1 -1
  155. package/dist/esm/azure/network.d.ts.map +1 -1
  156. package/dist/esm/azure/network.js +9 -3
  157. package/dist/esm/azure/network.js.map +1 -1
  158. package/dist/esm/azure/secrets.d.ts.map +1 -1
  159. package/dist/esm/azure/secrets.js +6 -2
  160. package/dist/esm/azure/secrets.js.map +1 -1
  161. package/dist/esm/azure/state.d.ts +30 -0
  162. package/dist/esm/azure/state.d.ts.map +1 -0
  163. package/dist/esm/azure/state.js +115 -0
  164. package/dist/esm/azure/state.js.map +1 -0
  165. package/dist/esm/cache/interfaces.d.ts +12 -0
  166. package/dist/esm/cache/interfaces.d.ts.map +1 -1
  167. package/dist/esm/cli/templates.d.ts +67 -0
  168. package/dist/esm/cli/templates.d.ts.map +1 -0
  169. package/dist/esm/cli/templates.js +752 -0
  170. package/dist/esm/cli/templates.js.map +1 -0
  171. package/dist/esm/cli.d.ts +15 -0
  172. package/dist/esm/cli.d.ts.map +1 -0
  173. package/dist/esm/cli.js +176 -0
  174. package/dist/esm/cli.js.map +1 -0
  175. package/dist/esm/cluster/interfaces.d.ts +28 -0
  176. package/dist/esm/cluster/interfaces.d.ts.map +1 -1
  177. package/dist/esm/database/interfaces.d.ts +15 -0
  178. package/dist/esm/database/interfaces.d.ts.map +1 -1
  179. package/dist/esm/dns/interfaces.d.ts +11 -0
  180. package/dist/esm/dns/interfaces.d.ts.map +1 -1
  181. package/dist/esm/factories/cluster.d.ts +4 -3
  182. package/dist/esm/factories/cluster.d.ts.map +1 -1
  183. package/dist/esm/factories/cluster.js +13 -11
  184. package/dist/esm/factories/cluster.js.map +1 -1
  185. package/dist/esm/factories/dns.d.ts +3 -2
  186. package/dist/esm/factories/dns.d.ts.map +1 -1
  187. package/dist/esm/factories/dns.js +11 -9
  188. package/dist/esm/factories/dns.js.map +1 -1
  189. package/dist/esm/factories/index.d.ts +1 -0
  190. package/dist/esm/factories/index.d.ts.map +1 -1
  191. package/dist/esm/factories/index.js +3 -1
  192. package/dist/esm/factories/index.js.map +1 -1
  193. package/dist/esm/factories/network.d.ts +4 -3
  194. package/dist/esm/factories/network.d.ts.map +1 -1
  195. package/dist/esm/factories/network.js +13 -11
  196. package/dist/esm/factories/network.js.map +1 -1
  197. package/dist/esm/factories/secrets.d.ts +4 -3
  198. package/dist/esm/factories/secrets.d.ts.map +1 -1
  199. package/dist/esm/factories/secrets.js +12 -10
  200. package/dist/esm/factories/secrets.js.map +1 -1
  201. package/dist/esm/factories/state.d.ts +33 -0
  202. package/dist/esm/factories/state.d.ts.map +1 -0
  203. package/dist/esm/factories/state.js +63 -0
  204. package/dist/esm/factories/state.js.map +1 -0
  205. package/dist/esm/factories/types.d.ts +22 -0
  206. package/dist/esm/factories/types.d.ts.map +1 -1
  207. package/dist/esm/factories/types.js +18 -0
  208. package/dist/esm/factories/types.js.map +1 -1
  209. package/dist/esm/global-lb/glb.d.ts.map +1 -1
  210. package/dist/esm/global-lb/glb.js +23 -9
  211. package/dist/esm/global-lb/glb.js.map +1 -1
  212. package/dist/esm/index.d.ts +2 -3
  213. package/dist/esm/index.d.ts.map +1 -1
  214. package/dist/esm/index.js +2 -13
  215. package/dist/esm/index.js.map +1 -1
  216. package/dist/esm/network/cidr.d.ts +34 -0
  217. package/dist/esm/network/cidr.d.ts.map +1 -1
  218. package/dist/esm/network/cidr.js +34 -0
  219. package/dist/esm/network/cidr.js.map +1 -1
  220. package/dist/esm/network/interfaces.d.ts +16 -0
  221. package/dist/esm/network/interfaces.d.ts.map +1 -1
  222. package/dist/esm/platform/interfaces.d.ts +1 -1
  223. package/dist/esm/platform/interfaces.d.ts.map +1 -1
  224. package/dist/esm/platform/stack.d.ts.map +1 -1
  225. package/dist/esm/platform/stack.js +6 -1
  226. package/dist/esm/platform/stack.js.map +1 -1
  227. package/dist/esm/queue/interfaces.d.ts +8 -0
  228. package/dist/esm/queue/interfaces.d.ts.map +1 -1
  229. package/dist/esm/secrets/interfaces.d.ts +5 -0
  230. package/dist/esm/secrets/interfaces.d.ts.map +1 -1
  231. package/dist/esm/state/index.d.ts +7 -0
  232. package/dist/esm/state/index.d.ts.map +1 -0
  233. package/dist/esm/state/index.js +8 -0
  234. package/dist/esm/state/index.js.map +1 -0
  235. package/dist/esm/state/interfaces.d.ts +82 -0
  236. package/dist/esm/state/interfaces.d.ts.map +1 -0
  237. package/dist/esm/state/interfaces.js +11 -0
  238. package/dist/esm/state/interfaces.js.map +1 -0
  239. package/dist/esm/storage/interfaces.d.ts +17 -0
  240. package/dist/esm/storage/interfaces.d.ts.map +1 -1
  241. package/dist/esm/types/cloud-target.d.ts +12 -0
  242. package/dist/esm/types/cloud-target.d.ts.map +1 -1
  243. package/dist/esm/types/cloud-target.js +12 -0
  244. package/dist/esm/types/cloud-target.js.map +1 -1
  245. package/dist/esm/types/tags.d.ts +16 -0
  246. package/dist/esm/types/tags.d.ts.map +1 -1
  247. package/dist/esm/types/tags.js +16 -0
  248. package/dist/esm/types/tags.js.map +1 -1
  249. package/dist/esm/types/validation.d.ts.map +1 -1
  250. package/dist/esm/types/validation.js +14 -11
  251. package/dist/esm/types/validation.js.map +1 -1
  252. package/dist/esm/utils/index.d.ts +7 -0
  253. package/dist/esm/utils/index.d.ts.map +1 -0
  254. package/dist/esm/utils/index.js +11 -0
  255. package/dist/esm/utils/index.js.map +1 -0
  256. package/dist/esm/utils/provider-loader.d.ts +14 -0
  257. package/dist/esm/utils/provider-loader.d.ts.map +1 -0
  258. package/dist/esm/utils/provider-loader.js +33 -0
  259. package/dist/esm/utils/provider-loader.js.map +1 -0
  260. package/package.json +41 -3
@@ -0,0 +1,752 @@
1
+ "use strict";
2
+ /**
3
+ * Embedded project templates for `nimbus new`.
4
+ *
5
+ * Each template function returns the contents for `index.ts` and `README.md`
6
+ * with the project name substituted into resource names.
7
+ *
8
+ * @module cli/templates
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.TEMPLATES = exports.TEMPLATE_NAMES = void 0;
12
+ exports.emptyTemplate = emptyTemplate;
13
+ exports.minimalAwsTemplate = minimalAwsTemplate;
14
+ exports.minimalAzureTemplate = minimalAzureTemplate;
15
+ exports.awsTemplate = awsTemplate;
16
+ exports.azureTemplate = azureTemplate;
17
+ exports.multiCloudTemplate = multiCloudTemplate;
18
+ /** Valid template names accepted by the CLI. */
19
+ exports.TEMPLATE_NAMES = [
20
+ "empty",
21
+ "minimal-aws",
22
+ "minimal-azure",
23
+ "aws",
24
+ "azure",
25
+ "multi-cloud",
26
+ ];
27
+ /** Common operations section included in every generated README. */
28
+ const OPERATIONS_SECTION = `## Operations
29
+
30
+ \`\`\`bash
31
+ pulumi preview # Preview changes before deploying
32
+ pulumi up # Deploy infrastructure
33
+ pulumi refresh # Sync state with actual cloud resources
34
+ pulumi destroy # Tear down all resources
35
+ pulumi config set <key> <value> # Set stack configuration (e.g. secrets)
36
+ pulumi stack output # View stack outputs
37
+ pulumi logs # View cloud resource logs (if supported)
38
+ \`\`\`
39
+ `;
40
+ /** Template registry with metadata and provider dependencies. */
41
+ exports.TEMPLATES = {
42
+ empty: {
43
+ description: "Blank scaffold with TODO placeholders",
44
+ providers: [],
45
+ generate: emptyTemplate,
46
+ },
47
+ "minimal-aws": {
48
+ description: "State backend + Secrets Manager (no cluster)",
49
+ providers: ["aws"],
50
+ generate: minimalAwsTemplate,
51
+ },
52
+ "minimal-azure": {
53
+ description: "State backend + Key Vault (no cluster)",
54
+ providers: ["azure"],
55
+ generate: minimalAzureTemplate,
56
+ },
57
+ aws: {
58
+ description: "Full stack: VPC + EKS + Route 53 + Secrets + Platform",
59
+ providers: ["aws", "kubernetes"],
60
+ generate: awsTemplate,
61
+ },
62
+ azure: {
63
+ description: "Full stack: VNet + AKS + Azure DNS + Key Vault + Platform",
64
+ providers: ["azure", "kubernetes"],
65
+ generate: azureTemplate,
66
+ },
67
+ "multi-cloud": {
68
+ description: "AWS + Azure active-active with Global Load Balancer",
69
+ providers: ["aws", "azure", "kubernetes"],
70
+ generate: multiCloudTemplate,
71
+ },
72
+ };
73
+ /**
74
+ * Empty scaffold with imports and TODO placeholders.
75
+ *
76
+ * @param name - Project name used in comments
77
+ * @returns Template files
78
+ */
79
+ function emptyTemplate(name) {
80
+ const indexTs = `/**
81
+ * ${name} — Nimbus infrastructure project.
82
+ *
83
+ * Usage:
84
+ * pulumi up
85
+ */
86
+
87
+ // import {
88
+ // createNetwork,
89
+ // createCluster,
90
+ // createDns,
91
+ // createSecrets,
92
+ // createStateBackend,
93
+ // createPlatformStack,
94
+ // } from "@reyemtech/nimbus";
95
+ // import type { INetwork, ICluster, IDns, ISecrets, IStateBackend } from "@reyemtech/nimbus";
96
+
97
+ // TODO: Define your cloud target
98
+ // const cloud = "aws";
99
+
100
+ // TODO: Create resources
101
+ // const network = createNetwork("${name}", { cloud, cidr: "10.0.0.0/16" });
102
+
103
+ // TODO: Export outputs
104
+ // export const output = "replace-me";
105
+ `;
106
+ const readmeMd = `# ${name}
107
+
108
+ Nimbus infrastructure project.
109
+
110
+ ## Getting Started
111
+
112
+ Edit \`index.ts\` to define your cloud resources, then deploy.
113
+
114
+ ${OPERATIONS_SECTION}
115
+ ## Resources
116
+
117
+ - [Nimbus Documentation](https://github.com/reyemtech/nimbus)
118
+ - [Pulumi Documentation](https://www.pulumi.com/docs/)
119
+ `;
120
+ return { indexTs, readmeMd };
121
+ }
122
+ /**
123
+ * Minimal AWS template — state backend + Secrets Manager, no cluster.
124
+ *
125
+ * @param name - Project name substituted into resource names
126
+ * @returns Template files
127
+ */
128
+ function minimalAwsTemplate(name) {
129
+ const indexTs = `/**
130
+ * ${name} — Minimal AWS infrastructure.
131
+ *
132
+ * Deploys: S3 state backend + AWS Secrets Manager
133
+ *
134
+ * Usage:
135
+ * pulumi up
136
+ */
137
+
138
+ import { createStateBackend, createSecrets } from "@reyemtech/nimbus";
139
+ import type { IStateBackend, ISecrets } from "@reyemtech/nimbus";
140
+
141
+ // 1. State Backend — S3 with versioning, encryption, and DynamoDB locking
142
+ const backend = createStateBackend("${name}", {
143
+ cloud: "aws",
144
+ versioning: true,
145
+ encryption: true,
146
+ locking: { enabled: true },
147
+ tags: { environment: "production" },
148
+ }) as IStateBackend;
149
+
150
+ // 2. Secrets — AWS Secrets Manager
151
+ const secrets = createSecrets("${name}", {
152
+ cloud: "aws",
153
+ backend: "aws-secrets-manager",
154
+ tags: { environment: "production" },
155
+ }) as ISecrets;
156
+
157
+ secrets.putSecret("database", {
158
+ host: "db.internal.example.com",
159
+ password: "change-me-in-pulumi-config",
160
+ });
161
+
162
+ // Exports
163
+ export const backendUrl = backend.backendUrl;
164
+ export const bucketName = backend.bucketName;
165
+ `;
166
+ const readmeMd = `# ${name}
167
+
168
+ Minimal AWS infrastructure — state backend + secrets, no cluster required.
169
+
170
+ ## Components
171
+
172
+ - **State Backend** — S3 bucket with versioning, encryption, and DynamoDB locking
173
+ - **Secrets** — AWS Secrets Manager for sensitive configuration
174
+
175
+ ## Architecture
176
+
177
+ \`\`\`mermaid
178
+ graph LR
179
+ subgraph AWS["AWS"]
180
+ S3[S3 State Backend]
181
+ DDB[DynamoDB Lock Table]
182
+ SM[Secrets Manager]
183
+ end
184
+
185
+ S3 --> DDB
186
+ \`\`\`
187
+
188
+ ${OPERATIONS_SECTION}
189
+ `;
190
+ return { indexTs, readmeMd };
191
+ }
192
+ /**
193
+ * Minimal Azure template — state backend + Key Vault, no cluster.
194
+ *
195
+ * @param name - Project name substituted into resource names
196
+ * @returns Template files
197
+ */
198
+ function minimalAzureTemplate(name) {
199
+ const indexTs = `/**
200
+ * ${name} — Minimal Azure infrastructure.
201
+ *
202
+ * Deploys: Azure Blob state backend + Key Vault
203
+ *
204
+ * Usage:
205
+ * pulumi up
206
+ */
207
+
208
+ import { createStateBackend, createSecrets } from "@reyemtech/nimbus";
209
+ import type { IStateBackend, ISecrets } from "@reyemtech/nimbus";
210
+
211
+ const resourceGroupName = "rg-${name}-canadacentral";
212
+
213
+ const azureOptions = {
214
+ azure: { resourceGroupName },
215
+ };
216
+
217
+ // 1. State Backend — Azure Blob Storage with versioning and encryption
218
+ const backend = createStateBackend("${name}", {
219
+ cloud: "azure",
220
+ versioning: true,
221
+ encryption: true,
222
+ tags: { environment: "production" },
223
+ providerOptions: azureOptions,
224
+ }) as IStateBackend;
225
+
226
+ // 2. Secrets — Azure Key Vault
227
+ const secrets = createSecrets("${name}", {
228
+ cloud: "azure",
229
+ backend: "azure-key-vault",
230
+ tags: { environment: "production" },
231
+ providerOptions: azureOptions,
232
+ }) as ISecrets;
233
+
234
+ secrets.putSecret("database", {
235
+ host: "db.internal.example.com",
236
+ password: "change-me-in-pulumi-config",
237
+ });
238
+
239
+ // Exports
240
+ export const backendUrl = backend.backendUrl;
241
+ export const storageAccountName = backend.storageAccountName;
242
+ `;
243
+ const readmeMd = `# ${name}
244
+
245
+ Minimal Azure infrastructure — state backend + secrets, no cluster required.
246
+
247
+ ## Components
248
+
249
+ - **State Backend** — Azure Blob Storage with versioning and encryption
250
+ - **Secrets** — Azure Key Vault for sensitive configuration
251
+
252
+ ## Architecture
253
+
254
+ \`\`\`mermaid
255
+ graph LR
256
+ subgraph Azure["Azure"]
257
+ SA[Storage Account]
258
+ BC[Blob Container]
259
+ KV[Key Vault]
260
+ end
261
+
262
+ SA --> BC
263
+ \`\`\`
264
+
265
+ ${OPERATIONS_SECTION}
266
+ `;
267
+ return { indexTs, readmeMd };
268
+ }
269
+ /**
270
+ * Full AWS stack — VPC + EKS + Route 53 + Secrets + Platform.
271
+ *
272
+ * @param name - Project name substituted into resource names
273
+ * @returns Template files
274
+ */
275
+ function awsTemplate(name) {
276
+ const indexTs = `/**
277
+ * ${name} — Full AWS infrastructure stack.
278
+ *
279
+ * Deploys: VPC + EKS + Route 53 + Secrets Manager + Platform Stack
280
+ *
281
+ * Usage:
282
+ * pulumi up
283
+ */
284
+
285
+ import {
286
+ createNetwork,
287
+ createCluster,
288
+ createDns,
289
+ createSecrets,
290
+ createPlatformStack,
291
+ } from "@reyemtech/nimbus";
292
+ import type { INetwork, ICluster, IDns, ISecrets } from "@reyemtech/nimbus";
293
+
294
+ // 1. Network — VPC with fck-nat (~$3/mo vs $32/mo managed NAT)
295
+ const network = createNetwork("${name}", {
296
+ cloud: "aws",
297
+ cidr: "10.0.0.0/16",
298
+ natStrategy: "fck-nat",
299
+ tags: { environment: "production", client: "acme" },
300
+ providerOptions: {
301
+ aws: { fckNatInstanceType: "t4g.nano", availabilityZoneCount: 2 },
302
+ },
303
+ }) as INetwork;
304
+
305
+ // 2. Cluster — EKS with Auto Mode
306
+ const cluster = createCluster(
307
+ "${name}",
308
+ {
309
+ cloud: "aws",
310
+ version: "1.32",
311
+ nodePools: [
312
+ { name: "system", instanceType: "t4g.small", minNodes: 2, maxNodes: 3 },
313
+ {
314
+ name: "workers",
315
+ instanceType: "c6a.large",
316
+ minNodes: 1,
317
+ maxNodes: 10,
318
+ spot: true,
319
+ },
320
+ ],
321
+ tags: { environment: "production", client: "acme" },
322
+ providerOptions: { aws: { autoMode: true } },
323
+ },
324
+ network,
325
+ ) as ICluster;
326
+
327
+ // 3. DNS — Route 53 hosted zone
328
+ const dns = createDns("${name}", {
329
+ cloud: "aws",
330
+ zoneName: "example.com",
331
+ records: [
332
+ { name: "app", type: "A", values: ["1.2.3.4"], ttl: 300 },
333
+ { name: "www", type: "CNAME", values: ["app.example.com"], ttl: 300 },
334
+ ],
335
+ }) as IDns;
336
+
337
+ // 4. Secrets — AWS Secrets Manager
338
+ const secrets = createSecrets("${name}", {
339
+ cloud: "aws",
340
+ backend: "aws-secrets-manager",
341
+ tags: { environment: "production" },
342
+ }) as ISecrets;
343
+
344
+ secrets.putSecret("database", {
345
+ host: "db.internal.example.com",
346
+ password: "change-me-in-pulumi-config",
347
+ });
348
+
349
+ // 5. Platform — Helm components on the cluster
350
+ const platform = createPlatformStack("${name}", {
351
+ cluster,
352
+ domain: "example.com",
353
+ externalDns: {
354
+ dnsProvider: "route53",
355
+ domainFilters: ["example.com"],
356
+ },
357
+ vault: { enabled: true, ingressHost: "vault.example.com" },
358
+ });
359
+
360
+ // Exports
361
+ export const vpcId = network.vpcId;
362
+ export const clusterEndpoint = cluster.endpoint;
363
+ export const zoneId = dns.zoneId;
364
+ export const nameServers = dns.nameServers;
365
+ export const platformName = Array.isArray(platform) ? platform[0]?.name : platform.name;
366
+ `;
367
+ const readmeMd = `# ${name}
368
+
369
+ Full AWS infrastructure stack using the nimbus factory API.
370
+
371
+ ## Components
372
+
373
+ - **Network** — VPC with public/private subnets and fck-nat (~$3/mo)
374
+ - **Cluster** — EKS with Auto Mode, system + spot worker pools
375
+ - **DNS** — Route 53 hosted zone with A and CNAME records
376
+ - **Secrets** — AWS Secrets Manager for database credentials
377
+ - **Platform** — Traefik, cert-manager, External DNS, Vault via Helm
378
+
379
+ ## Architecture
380
+
381
+ \`\`\`mermaid
382
+ graph LR
383
+ Internet((Internet))
384
+
385
+ subgraph AWS["AWS"]
386
+ R53[Route 53]
387
+ SM[Secrets Manager]
388
+
389
+ subgraph VPC["VPC 10.0.0.0/16"]
390
+ NAT[fck-nat]
391
+
392
+ subgraph EKS["EKS v1.32"]
393
+ SYS[System Pool]
394
+ WORK[Worker Pool spot]
395
+
396
+ subgraph Platform["Platform Stack"]
397
+ TRF[Traefik]
398
+ CM[cert-manager]
399
+ EDNS[External DNS]
400
+ VLT[Vault]
401
+ end
402
+ end
403
+ end
404
+ end
405
+
406
+ Internet --> TRF --> WORK
407
+ EDNS --> R53
408
+ VLT --> SM
409
+ VPC --> NAT --> Internet
410
+ \`\`\`
411
+
412
+ ${OPERATIONS_SECTION}
413
+ `;
414
+ return { indexTs, readmeMd };
415
+ }
416
+ /**
417
+ * Full Azure stack — VNet + AKS + Azure DNS + Key Vault + Platform.
418
+ *
419
+ * @param name - Project name substituted into resource names
420
+ * @returns Template files
421
+ */
422
+ function azureTemplate(name) {
423
+ const indexTs = `/**
424
+ * ${name} — Full Azure infrastructure stack.
425
+ *
426
+ * Deploys: VNet + AKS + Azure DNS + Key Vault + Platform Stack
427
+ *
428
+ * Usage:
429
+ * pulumi up
430
+ */
431
+
432
+ import {
433
+ createNetwork,
434
+ createCluster,
435
+ createDns,
436
+ createSecrets,
437
+ createPlatformStack,
438
+ } from "@reyemtech/nimbus";
439
+ import type { INetwork, ICluster, IDns, ISecrets } from "@reyemtech/nimbus";
440
+
441
+ const resourceGroupName = "rg-${name}-canadacentral";
442
+
443
+ const azureOptions = {
444
+ azure: {
445
+ resourceGroupName,
446
+ tenantId: "your-tenant-id",
447
+ },
448
+ };
449
+
450
+ // 1. Network — VNet with NAT Gateway
451
+ const network = createNetwork("${name}", {
452
+ cloud: "azure",
453
+ cidr: "10.1.0.0/16",
454
+ natStrategy: "managed",
455
+ tags: { environment: "production", client: "acme" },
456
+ providerOptions: azureOptions,
457
+ }) as INetwork;
458
+
459
+ // 2. Cluster — AKS with system + user node pools
460
+ const cluster = createCluster(
461
+ "${name}",
462
+ {
463
+ cloud: "azure",
464
+ version: "1.32",
465
+ nodePools: [
466
+ {
467
+ name: "system",
468
+ instanceType: "Standard_D2s_v5",
469
+ minNodes: 2,
470
+ maxNodes: 3,
471
+ mode: "system",
472
+ },
473
+ {
474
+ name: "workers",
475
+ instanceType: "Standard_D4s_v5",
476
+ minNodes: 1,
477
+ maxNodes: 10,
478
+ spot: true,
479
+ mode: "user",
480
+ },
481
+ ],
482
+ virtualNodes: true,
483
+ tags: { environment: "production", client: "acme" },
484
+ providerOptions: azureOptions,
485
+ },
486
+ network,
487
+ ) as ICluster;
488
+
489
+ // 3. DNS — Azure DNS Zone
490
+ const dns = createDns("${name}", {
491
+ cloud: "azure",
492
+ zoneName: "example.com",
493
+ records: [
494
+ { name: "app", type: "A", values: ["1.2.3.4"], ttl: 300 },
495
+ { name: "www", type: "CNAME", values: ["app.example.com"], ttl: 300 },
496
+ ],
497
+ providerOptions: azureOptions,
498
+ }) as IDns;
499
+
500
+ // 4. Secrets — Azure Key Vault
501
+ const secrets = createSecrets("${name}", {
502
+ cloud: "azure",
503
+ backend: "azure-key-vault",
504
+ tags: { environment: "production" },
505
+ providerOptions: azureOptions,
506
+ }) as ISecrets;
507
+
508
+ secrets.putSecret("database", {
509
+ host: "db.internal.example.com",
510
+ password: "change-me-in-pulumi-config",
511
+ });
512
+
513
+ // 5. Platform — Helm components on the cluster
514
+ const platform = createPlatformStack("${name}", {
515
+ cluster,
516
+ domain: "example.com",
517
+ externalDns: {
518
+ dnsProvider: "azure-dns",
519
+ domainFilters: ["example.com"],
520
+ },
521
+ vault: { enabled: true, ingressHost: "vault.example.com" },
522
+ });
523
+
524
+ // Exports
525
+ export const vnetId = network.vpcId;
526
+ export const clusterEndpoint = cluster.endpoint;
527
+ export const zoneId = dns.zoneId;
528
+ export const nameServers = dns.nameServers;
529
+ export const platformName = Array.isArray(platform) ? platform[0]?.name : platform.name;
530
+ `;
531
+ const readmeMd = `# ${name}
532
+
533
+ Full Azure infrastructure stack using the nimbus factory API.
534
+
535
+ ## Components
536
+
537
+ - **Network** — VNet with NAT Gateway
538
+ - **Cluster** — AKS with system + spot user node pools and virtual nodes
539
+ - **DNS** — Azure DNS zone with A and CNAME records
540
+ - **Secrets** — Azure Key Vault for database credentials
541
+ - **Platform** — Traefik, cert-manager, External DNS, Vault via Helm
542
+
543
+ ## Architecture
544
+
545
+ \`\`\`mermaid
546
+ graph LR
547
+ Internet((Internet))
548
+
549
+ subgraph Azure["Azure"]
550
+ ADNS[Azure DNS]
551
+ KV[Key Vault]
552
+
553
+ subgraph VNet["VNet 10.1.0.0/16"]
554
+ NAT[NAT Gateway]
555
+
556
+ subgraph AKS["AKS v1.32"]
557
+ SYS[System Pool]
558
+ WORK[Worker Pool spot]
559
+
560
+ subgraph Platform["Platform Stack"]
561
+ TRF[Traefik]
562
+ CM[cert-manager]
563
+ EDNS[External DNS]
564
+ VLT[Vault]
565
+ end
566
+ end
567
+ end
568
+ end
569
+
570
+ Internet --> TRF --> WORK
571
+ EDNS --> ADNS
572
+ VLT --> KV
573
+ VNet --> NAT --> Internet
574
+ \`\`\`
575
+
576
+ ${OPERATIONS_SECTION}
577
+ `;
578
+ return { indexTs, readmeMd };
579
+ }
580
+ /**
581
+ * Multi-cloud template — AWS + Azure active-active with GLB.
582
+ *
583
+ * @param name - Project name substituted into resource names
584
+ * @returns Template files
585
+ */
586
+ function multiCloudTemplate(name) {
587
+ const indexTs = `/**
588
+ * ${name} — Multi-cloud AWS + Azure active-active deployment.
589
+ *
590
+ * Deploys: Dual VPC/VNet + EKS/AKS + DNS + Platform + Global Load Balancer
591
+ *
592
+ * Usage:
593
+ * pulumi up
594
+ */
595
+
596
+ import {
597
+ createNetwork,
598
+ createCluster,
599
+ createDns,
600
+ createPlatformStack,
601
+ createGlobalLoadBalancer,
602
+ } from "@reyemtech/nimbus";
603
+ import type { INetwork, ICluster, IDns } from "@reyemtech/nimbus";
604
+
605
+ const resourceGroupName = "rg-${name}-canadacentral";
606
+
607
+ // Shared provider options
608
+ const providerOptions = {
609
+ aws: { autoMode: true },
610
+ azure: { resourceGroupName },
611
+ };
612
+
613
+ // 1. Networks — Auto-offset CIDRs: AWS gets 10.0.0.0/16, Azure gets 10.1.0.0/16
614
+ const networks = createNetwork("${name}", {
615
+ cloud: [
616
+ { provider: "aws", region: "us-east-1" },
617
+ { provider: "azure", region: "canadacentral" },
618
+ ],
619
+ cidr: "10.0.0.0/16",
620
+ natStrategy: "fck-nat",
621
+ providerOptions,
622
+ }) as INetwork[];
623
+
624
+ // 2. Clusters — EKS + AKS, auto-matched to networks by provider
625
+ const clusters = createCluster(
626
+ "${name}",
627
+ {
628
+ cloud: [
629
+ { provider: "aws", region: "us-east-1" },
630
+ { provider: "azure", region: "canadacentral" },
631
+ ],
632
+ version: "1.32",
633
+ nodePools: [
634
+ { name: "system", instanceType: "t4g.small", minNodes: 2, maxNodes: 3 },
635
+ {
636
+ name: "workers",
637
+ instanceType: "c6a.large",
638
+ minNodes: 2,
639
+ maxNodes: 8,
640
+ spot: true,
641
+ },
642
+ ],
643
+ providerOptions,
644
+ },
645
+ networks,
646
+ ) as ICluster[];
647
+
648
+ // 3. DNS — Route 53 hosted zone
649
+ const dns = createDns("${name}", {
650
+ cloud: "aws",
651
+ zoneName: "example.com",
652
+ }) as IDns;
653
+
654
+ // 4. Platform — Deploy to both clusters
655
+ createPlatformStack("${name}", {
656
+ cluster: clusters,
657
+ domain: "example.com",
658
+ externalDns: {
659
+ dnsProvider: "route53",
660
+ domainFilters: ["example.com"],
661
+ },
662
+ });
663
+
664
+ // 5. Global Load Balancer — Active-active across both clouds
665
+ const glb = createGlobalLoadBalancer("${name}", {
666
+ strategy: "active-active",
667
+ clusters,
668
+ domain: "app.example.com",
669
+ healthCheck: {
670
+ path: "/health",
671
+ port: 443,
672
+ protocol: "HTTPS",
673
+ intervalSeconds: 30,
674
+ unhealthyThreshold: 3,
675
+ },
676
+ dnsProvider: "route53",
677
+ });
678
+
679
+ // Exports
680
+ export const awsVpcId = networks[0]?.vpcId;
681
+ export const azureVnetId = networks[1]?.vpcId;
682
+ export const awsEndpoint = clusters[0]?.endpoint;
683
+ export const azureEndpoint = clusters[1]?.endpoint;
684
+ export const glbEndpoint = glb.endpoint;
685
+ export const glbStrategy = glb.strategy;
686
+ export const dnsZoneId = dns.zoneId;
687
+ `;
688
+ const readmeMd = `# ${name}
689
+
690
+ Multi-cloud AWS + Azure active-active deployment with Global Load Balancer.
691
+
692
+ ## Components
693
+
694
+ - **Networks** — Auto-offset CIDRs (AWS: 10.0.0.0/16, Azure: 10.1.0.0/16)
695
+ - **Clusters** — EKS + AKS, same config, auto-matched to networks by provider
696
+ - **DNS** — Route 53 hosted zone
697
+ - **Platform** — Identical Helm stack deployed to both clusters
698
+ - **GLB** — Route 53 weighted routing with health checks across both clusters
699
+
700
+ ## Architecture
701
+
702
+ \`\`\`mermaid
703
+ graph LR
704
+ Internet((Internet))
705
+
706
+ subgraph GLB["Global Load Balancer"]
707
+ R53GLB[Route 53 GLB]
708
+ HC1[Health Check AWS]
709
+ HC2[Health Check Azure]
710
+ end
711
+
712
+ subgraph AWS["AWS (us-east-1)"]
713
+ subgraph AWSVPC["VPC 10.0.0.0/16"]
714
+ subgraph AWSEKS["EKS v1.32"]
715
+ AWSTRF[Traefik]
716
+ AWSWORK[Workers spot]
717
+ AWSEDNS[External DNS]
718
+ end
719
+ end
720
+ end
721
+
722
+ subgraph AZ["Azure (canadacentral)"]
723
+ subgraph AZVN["VNet 10.1.0.0/16"]
724
+ subgraph AZAKS["AKS v1.32"]
725
+ AZTRF[Traefik]
726
+ AZWORK[Workers spot]
727
+ AZEDNS[External DNS]
728
+ end
729
+ end
730
+ end
731
+
732
+ DNS[Route 53 DNS]
733
+
734
+ Internet --> R53GLB
735
+ R53GLB --> HC1 --> AWSTRF --> AWSWORK
736
+ R53GLB --> HC2 --> AZTRF --> AZWORK
737
+ AWSEDNS --> DNS
738
+ AZEDNS --> DNS
739
+ \`\`\`
740
+
741
+ ## How It Works
742
+
743
+ 1. **Factory dispatch** — \`createNetwork("${name}", { cloud: ["aws", "azure"] })\` creates both VPC and VNet
744
+ 2. **CIDR auto-offset** — Second cloud auto-increments to \`10.1.0.0/16\` to avoid overlaps
745
+ 3. **Provider matching** — \`createCluster(...)\` matches each cluster to its network by provider
746
+ 4. **GLB** — Route 53 weighted records distribute traffic 50/50, health checks failover automatically
747
+
748
+ ${OPERATIONS_SECTION}
749
+ `;
750
+ return { indexTs, readmeMd };
751
+ }
752
+ //# sourceMappingURL=templates.js.map