@unstablestudios/terraform 0.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 (92) hide show
  1. package/README.md +312 -0
  2. package/dist/config/backend.d.ts +118 -0
  3. package/dist/config/backend.d.ts.map +1 -0
  4. package/dist/config/backend.js +153 -0
  5. package/dist/config/backend.js.map +1 -0
  6. package/dist/config/index.d.ts +6 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +4 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/config/terraform.d.ts +157 -0
  11. package/dist/config/terraform.d.ts.map +1 -0
  12. package/dist/config/terraform.js +211 -0
  13. package/dist/config/terraform.js.map +1 -0
  14. package/dist/config/terraform.test.d.ts +2 -0
  15. package/dist/config/terraform.test.d.ts.map +1 -0
  16. package/dist/config/terraform.test.js +240 -0
  17. package/dist/config/terraform.test.js.map +1 -0
  18. package/dist/config/tfvars.d.ts +90 -0
  19. package/dist/config/tfvars.d.ts.map +1 -0
  20. package/dist/config/tfvars.js +133 -0
  21. package/dist/config/tfvars.js.map +1 -0
  22. package/dist/config/tfvars.test.d.ts +2 -0
  23. package/dist/config/tfvars.test.d.ts.map +1 -0
  24. package/dist/config/tfvars.test.js +187 -0
  25. package/dist/config/tfvars.test.js.map +1 -0
  26. package/dist/hcl/generator.d.ts +59 -0
  27. package/dist/hcl/generator.d.ts.map +1 -0
  28. package/dist/hcl/generator.js +401 -0
  29. package/dist/hcl/generator.js.map +1 -0
  30. package/dist/hcl/generator.test.d.ts +2 -0
  31. package/dist/hcl/generator.test.d.ts.map +1 -0
  32. package/dist/hcl/generator.test.js +280 -0
  33. package/dist/hcl/generator.test.js.map +1 -0
  34. package/dist/hcl/index.d.ts +5 -0
  35. package/dist/hcl/index.d.ts.map +1 -0
  36. package/dist/hcl/index.js +3 -0
  37. package/dist/hcl/index.js.map +1 -0
  38. package/dist/hcl/writer.d.ts +35 -0
  39. package/dist/hcl/writer.d.ts.map +1 -0
  40. package/dist/hcl/writer.js +154 -0
  41. package/dist/hcl/writer.js.map +1 -0
  42. package/dist/index.d.mts +970 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +9 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/index.mjs +1283 -0
  48. package/dist/modules/cloudflare/d1.d.ts +39 -0
  49. package/dist/modules/cloudflare/d1.d.ts.map +1 -0
  50. package/dist/modules/cloudflare/d1.js +55 -0
  51. package/dist/modules/cloudflare/d1.js.map +1 -0
  52. package/dist/modules/cloudflare/index.d.ts +43 -0
  53. package/dist/modules/cloudflare/index.d.ts.map +1 -0
  54. package/dist/modules/cloudflare/index.js +44 -0
  55. package/dist/modules/cloudflare/index.js.map +1 -0
  56. package/dist/modules/cloudflare/kv.d.ts +57 -0
  57. package/dist/modules/cloudflare/kv.d.ts.map +1 -0
  58. package/dist/modules/cloudflare/kv.js +75 -0
  59. package/dist/modules/cloudflare/kv.js.map +1 -0
  60. package/dist/modules/cloudflare/r2.d.ts +49 -0
  61. package/dist/modules/cloudflare/r2.d.ts.map +1 -0
  62. package/dist/modules/cloudflare/r2.js +70 -0
  63. package/dist/modules/cloudflare/r2.js.map +1 -0
  64. package/dist/modules/cloudflare/worker.d.ts +104 -0
  65. package/dist/modules/cloudflare/worker.d.ts.map +1 -0
  66. package/dist/modules/cloudflare/worker.js +128 -0
  67. package/dist/modules/cloudflare/worker.js.map +1 -0
  68. package/dist/modules/index.d.ts +4 -0
  69. package/dist/modules/index.d.ts.map +1 -0
  70. package/dist/modules/index.js +4 -0
  71. package/dist/modules/index.js.map +1 -0
  72. package/dist/modules/types.d.ts +97 -0
  73. package/dist/modules/types.d.ts.map +1 -0
  74. package/dist/modules/types.js +106 -0
  75. package/dist/modules/types.js.map +1 -0
  76. package/dist/modules/types.test.d.ts +2 -0
  77. package/dist/modules/types.test.d.ts.map +1 -0
  78. package/dist/modules/types.test.js +167 -0
  79. package/dist/modules/types.test.js.map +1 -0
  80. package/dist/types/config.d.ts +140 -0
  81. package/dist/types/config.d.ts.map +1 -0
  82. package/dist/types/config.js +16 -0
  83. package/dist/types/config.js.map +1 -0
  84. package/dist/types/config.test.d.ts +2 -0
  85. package/dist/types/config.test.d.ts.map +1 -0
  86. package/dist/types/config.test.js +36 -0
  87. package/dist/types/config.test.js.map +1 -0
  88. package/dist/types/index.d.ts +2 -0
  89. package/dist/types/index.d.ts.map +1 -0
  90. package/dist/types/index.js +2 -0
  91. package/dist/types/index.js.map +1 -0
  92. package/package.json +27 -0
package/README.md ADDED
@@ -0,0 +1,312 @@
1
+ <p align="center">
2
+ <strong>Part of the <a href="https://www.npmjs.com/org/unstablestudios">Unstable Studios</a> open source libraries</strong>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/unstable-studios/echo-libs/actions/workflows/ci.yml"><img src="https://github.com/unstable-studios/echo-libs/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
7
+ <a href="https://www.npmjs.com/package/@unstablestudios/terraform"><img src="https://img.shields.io/npm/v/@unstablestudios/terraform.svg" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@unstablestudios/terraform"><img src="https://img.shields.io/npm/dm/@unstablestudios/terraform.svg" alt="npm downloads"></a>
9
+ <a href="https://github.com/unstable-studios/echo-libs/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@unstablestudios/terraform.svg" alt="license"></a>
10
+ </p>
11
+
12
+ ---
13
+
14
+ # @unstablestudios/terraform
15
+
16
+ TypeScript utilities for generating Terraform HCL configurations.
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ pnpm add @unstablestudios/terraform
22
+ ```
23
+
24
+ ## Features
25
+
26
+ - **HCL Generation** - Convert TypeScript objects to valid HCL syntax
27
+ - **Config Builders** - Fluent API for building Terraform configurations
28
+ - **tfvars Generation** - Create variable files programmatically
29
+ - **Backend Helpers** - Type-safe backend configuration builders
30
+ - **Cloudflare Modules** - Pre-built types for Cloudflare Workers, KV, D1, R2
31
+
32
+ ## Usage
33
+
34
+ ### Basic HCL Generation
35
+
36
+ ```typescript
37
+ import { generateTerraformConfig, expr } from '@unstablestudios/terraform';
38
+
39
+ const config = {
40
+ terraform: {
41
+ required_version: '>= 1.0',
42
+ required_providers: {
43
+ cloudflare: {
44
+ source: 'cloudflare/cloudflare',
45
+ version: '~> 4.0',
46
+ },
47
+ },
48
+ },
49
+ providers: [
50
+ { provider: 'cloudflare', config: {} },
51
+ ],
52
+ resources: [
53
+ {
54
+ type: 'cloudflare_workers_kv_namespace',
55
+ name: 'my_kv',
56
+ config: {
57
+ account_id: expr('var.cloudflare_account_id'),
58
+ title: 'my-kv-namespace',
59
+ },
60
+ },
61
+ ],
62
+ };
63
+
64
+ const hcl = generateTerraformConfig(config);
65
+ console.log(hcl);
66
+ ```
67
+
68
+ ### Using the Builder API
69
+
70
+ ```typescript
71
+ import { terraform, backends, providers } from '@unstablestudios/terraform';
72
+
73
+ const config = terraform()
74
+ .requiredVersion('>= 1.0')
75
+ .requiredProvider('cloudflare', {
76
+ source: 'cloudflare/cloudflare',
77
+ version: '~> 4.0',
78
+ })
79
+ .backend(backends.s3({
80
+ bucket: 'my-terraform-state',
81
+ key: 'state.tfstate',
82
+ region: 'us-east-1',
83
+ }))
84
+ .provider('cloudflare')
85
+ .variable('cloudflare_account_id', 'string', {
86
+ description: 'Cloudflare Account ID',
87
+ sensitive: true,
88
+ })
89
+ .resource('cloudflare_workers_kv_namespace', 'my_kv', {
90
+ account_id: expr('var.cloudflare_account_id'),
91
+ title: 'my-kv-namespace',
92
+ })
93
+ .output('kv_id', expr('cloudflare_workers_kv_namespace.my_kv.id'), {
94
+ description: 'KV Namespace ID',
95
+ })
96
+ .toHcl();
97
+ ```
98
+
99
+ ### Generate Multiple Files
100
+
101
+ ```typescript
102
+ import { generateTerraformFiles } from '@unstablestudios/terraform';
103
+
104
+ const files = generateTerraformFiles(config);
105
+ // Returns: [
106
+ // { path: 'main.tf', content: '...' },
107
+ // { path: 'variables.tf', content: '...' },
108
+ // { path: 'outputs.tf', content: '...' }
109
+ // ]
110
+ ```
111
+
112
+ ### tfvars Generation
113
+
114
+ ```typescript
115
+ import { tfvars, generateEnvTfvars } from '@unstablestudios/terraform';
116
+
117
+ // Using builder
118
+ const vars = tfvars()
119
+ .string('cloudflare_account_id', 'abc123')
120
+ .string('environment', 'production')
121
+ .list('allowed_origins', ['https://example.com'])
122
+ .build();
123
+
124
+ // Generate environment-specific tfvars
125
+ const { filename, content } = generateEnvTfvars('production', {
126
+ cloudflare_account_id: 'abc123',
127
+ environment: 'production',
128
+ });
129
+ // filename: 'production.tfvars'
130
+ ```
131
+
132
+ ### Backend Configurations
133
+
134
+ ```typescript
135
+ import { s3Backend, azureBackend, terraformCloudBackend } from '@unstablestudios/terraform';
136
+
137
+ // S3 backend with DynamoDB locking
138
+ const s3 = s3Backend({
139
+ bucket: 'my-terraform-state',
140
+ key: 'state.tfstate',
141
+ region: 'us-east-1',
142
+ encrypt: true,
143
+ dynamodb_table: 'terraform-locks',
144
+ });
145
+
146
+ // Azure backend
147
+ const azure = azureBackend({
148
+ resource_group_name: 'my-rg',
149
+ storage_account_name: 'mystorageaccount',
150
+ container_name: 'tfstate',
151
+ key: 'state.tfstate',
152
+ });
153
+
154
+ // Terraform Cloud
155
+ const tfc = terraformCloudBackend({
156
+ organization: 'my-org',
157
+ workspaces: { name: 'my-workspace' },
158
+ });
159
+ ```
160
+
161
+ ### Cloudflare Resources
162
+
163
+ ```typescript
164
+ import {
165
+ cloudflareWorkerScript,
166
+ cloudflareKvNamespace,
167
+ cloudflareD1Database,
168
+ cloudflareR2Bucket,
169
+ kvNamespaceRef,
170
+ d1DatabaseRef,
171
+ r2BucketRef,
172
+ cfAccountId,
173
+ } from '@unstablestudios/terraform';
174
+
175
+ // KV Namespace
176
+ const kv = cloudflareKvNamespace({
177
+ title: 'my-cache',
178
+ accountId: cfAccountId,
179
+ });
180
+
181
+ // D1 Database
182
+ const d1 = cloudflareD1Database({
183
+ name: 'my-database',
184
+ accountId: cfAccountId,
185
+ });
186
+
187
+ // R2 Bucket
188
+ const r2 = cloudflareR2Bucket({
189
+ name: 'my-assets',
190
+ accountId: cfAccountId,
191
+ location: 'wnam',
192
+ });
193
+
194
+ // Worker Script with bindings
195
+ const worker = cloudflareWorkerScript({
196
+ name: 'my-worker',
197
+ accountId: cfAccountId,
198
+ content: expr('file("./dist/worker.js")'),
199
+ module: true,
200
+ compatibilityDate: '2024-01-01',
201
+ kvNamespaces: [
202
+ { name: 'CACHE', namespaceId: kvNamespaceRef('my_cache') },
203
+ ],
204
+ d1Databases: [
205
+ { name: 'DB', databaseId: d1DatabaseRef('my_database') },
206
+ ],
207
+ r2Buckets: [
208
+ { name: 'ASSETS', bucketName: r2BucketRef('my_assets') },
209
+ ],
210
+ });
211
+ ```
212
+
213
+ ### Expression Helpers
214
+
215
+ ```typescript
216
+ import { expr, varRef, localRef, resourceRef, dataRef, tf } from '@unstablestudios/terraform';
217
+
218
+ // Variable reference
219
+ varRef('my_var') // var.my_var
220
+
221
+ // Local reference
222
+ localRef('computed_value') // local.computed_value
223
+
224
+ // Resource reference
225
+ resourceRef('aws_instance', 'web', 'id') // aws_instance.web.id
226
+
227
+ // Data source reference
228
+ dataRef('aws_ami', 'ubuntu', 'id') // data.aws_ami.ubuntu.id
229
+
230
+ // Common functions
231
+ tf.file('path/to/file') // file("path/to/file")
232
+ tf.jsonencode('local.config') // jsonencode(local.config)
233
+ tf.length('var.list') // length(var.list)
234
+ tf.lookup('var.map', 'key', 'default') // lookup(var.map, "key", default)
235
+ ```
236
+
237
+ ### Module System
238
+
239
+ ```typescript
240
+ import { defineModule, useModule } from '@unstablestudios/terraform';
241
+
242
+ // Define a module interface
243
+ interface MyModuleInputs {
244
+ name: string;
245
+ environment: string;
246
+ }
247
+
248
+ interface MyModuleOutputs {
249
+ id: string;
250
+ endpoint: string;
251
+ }
252
+
253
+ const myModule = defineModule<MyModuleInputs, MyModuleOutputs>(
254
+ 'git::https://github.com/org/terraform-module.git',
255
+ 'v1.0.0'
256
+ );
257
+
258
+ // Use the module
259
+ const instance = useModule(myModule, 'my_instance', {
260
+ name: 'example',
261
+ environment: 'production',
262
+ });
263
+
264
+ // Reference outputs
265
+ const id = instance.output('id'); // module.my_instance.id
266
+ ```
267
+
268
+ ## API Reference
269
+
270
+ ### Types
271
+
272
+ - `HclValue` - Union type for all valid HCL values
273
+ - `HclExpression` - Raw HCL expression (not quoted)
274
+ - `TerraformConfig` - Complete Terraform configuration
275
+ - `ResourceConfig` - Resource block configuration
276
+ - `VariableConfig` - Variable block configuration
277
+ - `OutputConfig` - Output block configuration
278
+ - `BackendConfig` - Backend configuration
279
+
280
+ ### HCL Generation
281
+
282
+ - `toHcl(value)` - Convert value to HCL string
283
+ - `formatBlock(block)` - Format a Terraform block
284
+ - `generateTerraformConfig(config)` - Generate complete .tf content
285
+ - `generateTerraformFile(config)` - Generate with header
286
+ - `generateTerraformFiles(config)` - Generate split files
287
+
288
+ ### Config Builders
289
+
290
+ - `terraform()` - Create config builder
291
+ - `tfvars()` - Create tfvars builder
292
+ - `backend(type)` - Create backend builder
293
+
294
+ ### Backend Helpers
295
+
296
+ - `s3Backend(options)` - S3 backend
297
+ - `gcsBackend(options)` - GCS backend
298
+ - `azureBackend(options)` - Azure backend
299
+ - `terraformCloudBackend(options)` - Terraform Cloud
300
+ - `localBackend(path)` - Local backend
301
+
302
+ ### Cloudflare Helpers
303
+
304
+ - `cloudflareWorkerScript(config)` - Worker script resource
305
+ - `cloudflareKvNamespace(config)` - KV namespace resource
306
+ - `cloudflareD1Database(config)` - D1 database resource
307
+ - `cloudflareR2Bucket(config)` - R2 bucket resource
308
+ - Reference helpers: `kvNamespaceRef`, `d1DatabaseRef`, `r2BucketRef`, `workerScriptRef`
309
+
310
+ ## License
311
+
312
+ MIT
@@ -0,0 +1,118 @@
1
+ import type { BackendConfig, HclValue } from '../types/config';
2
+ /**
3
+ * Backend configuration builder
4
+ */
5
+ export declare class BackendBuilder {
6
+ private type;
7
+ private config;
8
+ constructor(type: string);
9
+ /**
10
+ * Set a configuration option
11
+ */
12
+ set(key: string, value: HclValue): this;
13
+ /**
14
+ * Set multiple configuration options
15
+ */
16
+ setAll(config: Record<string, HclValue>): this;
17
+ /**
18
+ * Build the backend configuration
19
+ */
20
+ build(): BackendConfig;
21
+ }
22
+ /**
23
+ * Create a backend builder
24
+ */
25
+ export declare function backend(type: string): BackendBuilder;
26
+ /**
27
+ * S3 backend builder with type-safe options
28
+ */
29
+ export interface S3BackendOptions {
30
+ bucket: string;
31
+ key: string;
32
+ region: string;
33
+ encrypt?: boolean;
34
+ dynamodb_table?: string;
35
+ workspace_key_prefix?: string;
36
+ acl?: string;
37
+ skip_credentials_validation?: boolean;
38
+ skip_metadata_api_check?: boolean;
39
+ skip_region_validation?: boolean;
40
+ profile?: string;
41
+ role_arn?: string;
42
+ }
43
+ /**
44
+ * Create an S3 backend configuration
45
+ */
46
+ export declare function s3Backend(options: S3BackendOptions): BackendConfig;
47
+ /**
48
+ * GCS backend options
49
+ */
50
+ export interface GcsBackendOptions {
51
+ bucket: string;
52
+ prefix?: string;
53
+ credentials?: string;
54
+ encryption_key?: string;
55
+ }
56
+ /**
57
+ * Create a GCS backend configuration
58
+ */
59
+ export declare function gcsBackend(options: GcsBackendOptions): BackendConfig;
60
+ /**
61
+ * Azure backend options
62
+ */
63
+ export interface AzureBackendOptions {
64
+ resource_group_name: string;
65
+ storage_account_name: string;
66
+ container_name: string;
67
+ key: string;
68
+ access_key?: string;
69
+ sas_token?: string;
70
+ use_oidc?: boolean;
71
+ subscription_id?: string;
72
+ tenant_id?: string;
73
+ client_id?: string;
74
+ }
75
+ /**
76
+ * Create an Azure backend configuration
77
+ */
78
+ export declare function azureBackend(options: AzureBackendOptions): BackendConfig;
79
+ /**
80
+ * Terraform Cloud backend options
81
+ */
82
+ export interface TerraformCloudOptions {
83
+ organization: string;
84
+ workspaces: {
85
+ name: string;
86
+ } | {
87
+ tags: string[];
88
+ } | {
89
+ project: string;
90
+ };
91
+ hostname?: string;
92
+ token?: string;
93
+ }
94
+ /**
95
+ * Create a Terraform Cloud backend configuration
96
+ */
97
+ export declare function terraformCloudBackend(options: TerraformCloudOptions): BackendConfig;
98
+ /**
99
+ * Create a local backend configuration
100
+ */
101
+ export declare function localBackend(path?: string): BackendConfig;
102
+ /**
103
+ * Consul backend options
104
+ */
105
+ export interface ConsulBackendOptions {
106
+ address: string;
107
+ path: string;
108
+ scheme?: 'http' | 'https';
109
+ datacenter?: string;
110
+ access_token?: string;
111
+ gzip?: boolean;
112
+ lock?: boolean;
113
+ }
114
+ /**
115
+ * Create a Consul backend configuration
116
+ */
117
+ export declare function consulBackend(options: ConsulBackendOptions): BackendConfig;
118
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/config/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE/D;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAgC;gBAElC,IAAI,EAAE,MAAM;IAIxB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAKvC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;IAK9C;;OAEG;IACH,KAAK,IAAI,aAAa;CAMvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEpD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAwBlE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAUpE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAgBxE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EACN;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAClB;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAUnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAKzD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAa1E"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Backend configuration builder
3
+ */
4
+ export class BackendBuilder {
5
+ constructor(type) {
6
+ this.config = {};
7
+ this.type = type;
8
+ }
9
+ /**
10
+ * Set a configuration option
11
+ */
12
+ set(key, value) {
13
+ this.config[key] = value;
14
+ return this;
15
+ }
16
+ /**
17
+ * Set multiple configuration options
18
+ */
19
+ setAll(config) {
20
+ Object.assign(this.config, config);
21
+ return this;
22
+ }
23
+ /**
24
+ * Build the backend configuration
25
+ */
26
+ build() {
27
+ return {
28
+ type: this.type,
29
+ config: this.config,
30
+ };
31
+ }
32
+ }
33
+ /**
34
+ * Create a backend builder
35
+ */
36
+ export function backend(type) {
37
+ return new BackendBuilder(type);
38
+ }
39
+ /**
40
+ * Create an S3 backend configuration
41
+ */
42
+ export function s3Backend(options) {
43
+ const config = {
44
+ bucket: options.bucket,
45
+ key: options.key,
46
+ region: options.region,
47
+ };
48
+ if (options.encrypt !== undefined)
49
+ config.encrypt = options.encrypt;
50
+ if (options.dynamodb_table)
51
+ config.dynamodb_table = options.dynamodb_table;
52
+ if (options.workspace_key_prefix)
53
+ config.workspace_key_prefix = options.workspace_key_prefix;
54
+ if (options.acl)
55
+ config.acl = options.acl;
56
+ if (options.skip_credentials_validation !== undefined) {
57
+ config.skip_credentials_validation = options.skip_credentials_validation;
58
+ }
59
+ if (options.skip_metadata_api_check !== undefined) {
60
+ config.skip_metadata_api_check = options.skip_metadata_api_check;
61
+ }
62
+ if (options.skip_region_validation !== undefined) {
63
+ config.skip_region_validation = options.skip_region_validation;
64
+ }
65
+ if (options.profile)
66
+ config.profile = options.profile;
67
+ if (options.role_arn)
68
+ config.role_arn = options.role_arn;
69
+ return { type: 's3', config };
70
+ }
71
+ /**
72
+ * Create a GCS backend configuration
73
+ */
74
+ export function gcsBackend(options) {
75
+ const config = {
76
+ bucket: options.bucket,
77
+ };
78
+ if (options.prefix)
79
+ config.prefix = options.prefix;
80
+ if (options.credentials)
81
+ config.credentials = options.credentials;
82
+ if (options.encryption_key)
83
+ config.encryption_key = options.encryption_key;
84
+ return { type: 'gcs', config };
85
+ }
86
+ /**
87
+ * Create an Azure backend configuration
88
+ */
89
+ export function azureBackend(options) {
90
+ const config = {
91
+ resource_group_name: options.resource_group_name,
92
+ storage_account_name: options.storage_account_name,
93
+ container_name: options.container_name,
94
+ key: options.key,
95
+ };
96
+ if (options.access_key)
97
+ config.access_key = options.access_key;
98
+ if (options.sas_token)
99
+ config.sas_token = options.sas_token;
100
+ if (options.use_oidc !== undefined)
101
+ config.use_oidc = options.use_oidc;
102
+ if (options.subscription_id)
103
+ config.subscription_id = options.subscription_id;
104
+ if (options.tenant_id)
105
+ config.tenant_id = options.tenant_id;
106
+ if (options.client_id)
107
+ config.client_id = options.client_id;
108
+ return { type: 'azurerm', config };
109
+ }
110
+ /**
111
+ * Create a Terraform Cloud backend configuration
112
+ */
113
+ export function terraformCloudBackend(options) {
114
+ const config = {
115
+ organization: options.organization,
116
+ workspaces: options.workspaces,
117
+ };
118
+ if (options.hostname)
119
+ config.hostname = options.hostname;
120
+ if (options.token)
121
+ config.token = options.token;
122
+ return { type: 'cloud', config };
123
+ }
124
+ /**
125
+ * Create a local backend configuration
126
+ */
127
+ export function localBackend(path) {
128
+ return {
129
+ type: 'local',
130
+ config: path ? { path } : {},
131
+ };
132
+ }
133
+ /**
134
+ * Create a Consul backend configuration
135
+ */
136
+ export function consulBackend(options) {
137
+ const config = {
138
+ address: options.address,
139
+ path: options.path,
140
+ };
141
+ if (options.scheme)
142
+ config.scheme = options.scheme;
143
+ if (options.datacenter)
144
+ config.datacenter = options.datacenter;
145
+ if (options.access_token)
146
+ config.access_token = options.access_token;
147
+ if (options.gzip !== undefined)
148
+ config.gzip = options.gzip;
149
+ if (options.lock !== undefined)
150
+ config.lock = options.lock;
151
+ return { type: 'consul', config };
152
+ }
153
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/config/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { TerraformConfigBuilder, terraform, backends, providers } from './terraform';
2
+ export { generateTfvars, generateEnvTfvars, TfvarsBuilder, tfvars, mergeTfvars, tfvarsFromEnv, } from './tfvars';
3
+ export type { TfvarsConfig } from './tfvars';
4
+ export { BackendBuilder, backend, s3Backend, gcsBackend, azureBackend, terraformCloudBackend, localBackend, consulBackend, } from './backend';
5
+ export type { S3BackendOptions, GcsBackendOptions, AzureBackendOptions, TerraformCloudOptions, ConsulBackendOptions, } from './backend';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,WAAW,EACX,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EACL,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { TerraformConfigBuilder, terraform, backends, providers } from './terraform';
2
+ export { generateTfvars, generateEnvTfvars, TfvarsBuilder, tfvars, mergeTfvars, tfvarsFromEnv, } from './tfvars';
3
+ export { BackendBuilder, backend, s3Backend, gcsBackend, azureBackend, terraformCloudBackend, localBackend, consulBackend, } from './backend';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,WAAW,EACX,aAAa,GACd,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,aAAa,GACd,MAAM,WAAW,CAAC"}