@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
@@ -0,0 +1,157 @@
1
+ import type { TerraformConfig, BackendConfig, RequiredProvider, HclValue } from '../types/config';
2
+ import type { HclOptions } from '../hcl/generator';
3
+ /**
4
+ * Builder for creating Terraform configurations
5
+ */
6
+ export declare class TerraformConfigBuilder {
7
+ private config;
8
+ /**
9
+ * Set required Terraform version
10
+ */
11
+ requiredVersion(version: string): this;
12
+ /**
13
+ * Add a required provider
14
+ */
15
+ requiredProvider(name: string, provider: RequiredProvider): this;
16
+ /**
17
+ * Set backend configuration
18
+ */
19
+ backend(backend: BackendConfig): this;
20
+ /**
21
+ * Add a provider configuration
22
+ */
23
+ provider(provider: string, config?: Record<string, HclValue>, alias?: string): this;
24
+ /**
25
+ * Add a variable
26
+ */
27
+ variable(name: string, type: string, options?: {
28
+ description?: string;
29
+ default?: HclValue;
30
+ sensitive?: boolean;
31
+ }): this;
32
+ /**
33
+ * Add locals
34
+ */
35
+ locals(values: Record<string, HclValue>): this;
36
+ /**
37
+ * Add a resource
38
+ */
39
+ resource(type: string, name: string, config: Record<string, HclValue>): this;
40
+ /**
41
+ * Add a data source
42
+ */
43
+ data(type: string, name: string, config: Record<string, HclValue>): this;
44
+ /**
45
+ * Add a module
46
+ */
47
+ module(name: string, source: string, config?: Record<string, HclValue>, version?: string): this;
48
+ /**
49
+ * Add an output
50
+ */
51
+ output(name: string, value: HclValue, options?: {
52
+ description?: string;
53
+ sensitive?: boolean;
54
+ }): this;
55
+ /**
56
+ * Get the built configuration
57
+ */
58
+ build(): TerraformConfig;
59
+ /**
60
+ * Generate HCL string
61
+ */
62
+ toHcl(options?: HclOptions): string;
63
+ }
64
+ /**
65
+ * Create a new Terraform configuration builder
66
+ */
67
+ export declare function terraform(): TerraformConfigBuilder;
68
+ /**
69
+ * Common backend configurations
70
+ */
71
+ export declare const backends: {
72
+ /**
73
+ * S3 backend configuration
74
+ */
75
+ s3: (config: {
76
+ bucket: string;
77
+ key: string;
78
+ region: string;
79
+ encrypt?: boolean;
80
+ dynamodb_table?: string;
81
+ }) => BackendConfig;
82
+ /**
83
+ * GCS backend configuration
84
+ */
85
+ gcs: (config: {
86
+ bucket: string;
87
+ prefix: string;
88
+ }) => BackendConfig;
89
+ /**
90
+ * Azure backend configuration
91
+ */
92
+ azurerm: (config: {
93
+ resource_group_name: string;
94
+ storage_account_name: string;
95
+ container_name: string;
96
+ key: string;
97
+ }) => BackendConfig;
98
+ /**
99
+ * Local backend configuration
100
+ */
101
+ local: (path?: string) => BackendConfig;
102
+ /**
103
+ * Terraform Cloud backend configuration
104
+ */
105
+ cloud: (config: {
106
+ organization: string;
107
+ workspaces: {
108
+ name: string;
109
+ };
110
+ }) => BackendConfig;
111
+ };
112
+ /**
113
+ * Common provider configurations
114
+ */
115
+ export declare const providers: {
116
+ /**
117
+ * AWS provider
118
+ */
119
+ aws: (region: string, profile?: string) => {
120
+ provider: string;
121
+ config: {
122
+ profile?: string | undefined;
123
+ region: string;
124
+ };
125
+ };
126
+ /**
127
+ * Cloudflare provider
128
+ */
129
+ cloudflare: (apiToken?: string) => {
130
+ provider: string;
131
+ config: {
132
+ api_token: string;
133
+ } | {
134
+ api_token?: undefined;
135
+ };
136
+ };
137
+ /**
138
+ * Google provider
139
+ */
140
+ google: (project: string, region: string) => {
141
+ provider: string;
142
+ config: {
143
+ project: string;
144
+ region: string;
145
+ };
146
+ };
147
+ /**
148
+ * Azure provider
149
+ */
150
+ azurerm: (features?: Record<string, HclValue>) => {
151
+ provider: string;
152
+ config: {
153
+ features: Record<string, HclValue>;
154
+ };
155
+ };
156
+ };
157
+ //# sourceMappingURL=terraform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../src/config/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ import { generateTerraformConfig } from '../hcl/generator';
2
+ /**
3
+ * Builder for creating Terraform configurations
4
+ */
5
+ export class TerraformConfigBuilder {
6
+ constructor() {
7
+ this.config = {};
8
+ }
9
+ /**
10
+ * Set required Terraform version
11
+ */
12
+ requiredVersion(version) {
13
+ if (!this.config.terraform)
14
+ this.config.terraform = {};
15
+ this.config.terraform.required_version = version;
16
+ return this;
17
+ }
18
+ /**
19
+ * Add a required provider
20
+ */
21
+ requiredProvider(name, provider) {
22
+ if (!this.config.terraform)
23
+ this.config.terraform = {};
24
+ if (!this.config.terraform.required_providers)
25
+ this.config.terraform.required_providers = {};
26
+ this.config.terraform.required_providers[name] = provider;
27
+ return this;
28
+ }
29
+ /**
30
+ * Set backend configuration
31
+ */
32
+ backend(backend) {
33
+ if (!this.config.terraform)
34
+ this.config.terraform = {};
35
+ this.config.terraform.backend = backend;
36
+ return this;
37
+ }
38
+ /**
39
+ * Add a provider configuration
40
+ */
41
+ provider(provider, config = {}, alias) {
42
+ if (!this.config.providers)
43
+ this.config.providers = [];
44
+ this.config.providers.push({ provider, config, alias });
45
+ return this;
46
+ }
47
+ /**
48
+ * Add a variable
49
+ */
50
+ variable(name, type, options = {}) {
51
+ if (!this.config.variables)
52
+ this.config.variables = {};
53
+ this.config.variables[name] = {
54
+ type,
55
+ ...options,
56
+ };
57
+ return this;
58
+ }
59
+ /**
60
+ * Add locals
61
+ */
62
+ locals(values) {
63
+ if (!this.config.locals)
64
+ this.config.locals = {};
65
+ Object.assign(this.config.locals, values);
66
+ return this;
67
+ }
68
+ /**
69
+ * Add a resource
70
+ */
71
+ resource(type, name, config) {
72
+ if (!this.config.resources)
73
+ this.config.resources = [];
74
+ this.config.resources.push({ type, name, config });
75
+ return this;
76
+ }
77
+ /**
78
+ * Add a data source
79
+ */
80
+ data(type, name, config) {
81
+ if (!this.config.dataSources)
82
+ this.config.dataSources = [];
83
+ this.config.dataSources.push({ type, name, config });
84
+ return this;
85
+ }
86
+ /**
87
+ * Add a module
88
+ */
89
+ module(name, source, config = {}, version) {
90
+ if (!this.config.modules)
91
+ this.config.modules = [];
92
+ this.config.modules.push({ name, source, config, version });
93
+ return this;
94
+ }
95
+ /**
96
+ * Add an output
97
+ */
98
+ output(name, value, options = {}) {
99
+ if (!this.config.outputs)
100
+ this.config.outputs = {};
101
+ this.config.outputs[name] = { value, ...options };
102
+ return this;
103
+ }
104
+ /**
105
+ * Get the built configuration
106
+ */
107
+ build() {
108
+ return this.config;
109
+ }
110
+ /**
111
+ * Generate HCL string
112
+ */
113
+ toHcl(options) {
114
+ return generateTerraformConfig(this.config, options);
115
+ }
116
+ }
117
+ /**
118
+ * Create a new Terraform configuration builder
119
+ */
120
+ export function terraform() {
121
+ return new TerraformConfigBuilder();
122
+ }
123
+ /**
124
+ * Common backend configurations
125
+ */
126
+ export const backends = {
127
+ /**
128
+ * S3 backend configuration
129
+ */
130
+ s3: (config) => ({
131
+ type: 's3',
132
+ config: {
133
+ bucket: config.bucket,
134
+ key: config.key,
135
+ region: config.region,
136
+ encrypt: config.encrypt ?? true,
137
+ ...(config.dynamodb_table ? { dynamodb_table: config.dynamodb_table } : {}),
138
+ },
139
+ }),
140
+ /**
141
+ * GCS backend configuration
142
+ */
143
+ gcs: (config) => ({
144
+ type: 'gcs',
145
+ config: {
146
+ bucket: config.bucket,
147
+ prefix: config.prefix,
148
+ },
149
+ }),
150
+ /**
151
+ * Azure backend configuration
152
+ */
153
+ azurerm: (config) => ({
154
+ type: 'azurerm',
155
+ config,
156
+ }),
157
+ /**
158
+ * Local backend configuration
159
+ */
160
+ local: (path) => ({
161
+ type: 'local',
162
+ config: path ? { path } : {},
163
+ }),
164
+ /**
165
+ * Terraform Cloud backend configuration
166
+ */
167
+ cloud: (config) => ({
168
+ type: 'cloud',
169
+ config: {
170
+ organization: config.organization,
171
+ workspaces: { name: config.workspaces.name },
172
+ },
173
+ }),
174
+ };
175
+ /**
176
+ * Common provider configurations
177
+ */
178
+ export const providers = {
179
+ /**
180
+ * AWS provider
181
+ */
182
+ aws: (region, profile) => ({
183
+ provider: 'aws',
184
+ config: {
185
+ region,
186
+ ...(profile ? { profile } : {}),
187
+ },
188
+ }),
189
+ /**
190
+ * Cloudflare provider
191
+ */
192
+ cloudflare: (apiToken) => ({
193
+ provider: 'cloudflare',
194
+ config: apiToken ? { api_token: apiToken } : {},
195
+ }),
196
+ /**
197
+ * Google provider
198
+ */
199
+ google: (project, region) => ({
200
+ provider: 'google',
201
+ config: { project, region },
202
+ }),
203
+ /**
204
+ * Azure provider
205
+ */
206
+ azurerm: (features = {}) => ({
207
+ provider: 'azurerm',
208
+ config: { features },
209
+ }),
210
+ };
211
+ //# sourceMappingURL=terraform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/config/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terraform.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.test.d.ts","sourceRoot":"","sources":["../../src/config/terraform.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,240 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { terraform, backends, providers, TerraformConfigBuilder } from './terraform';
3
+ import { expr } from '../types/config';
4
+ describe('TerraformConfigBuilder', () => {
5
+ it('creates an empty config by default', () => {
6
+ const builder = new TerraformConfigBuilder();
7
+ expect(builder.build()).toEqual({});
8
+ });
9
+ it('sets required version', () => {
10
+ const config = terraform()
11
+ .requiredVersion('>= 1.0')
12
+ .build();
13
+ expect(config.terraform?.required_version).toBe('>= 1.0');
14
+ });
15
+ it('adds required providers', () => {
16
+ const config = terraform()
17
+ .requiredProvider('aws', { source: 'hashicorp/aws', version: '~> 4.0' })
18
+ .requiredProvider('cloudflare', { source: 'cloudflare/cloudflare' })
19
+ .build();
20
+ expect(config.terraform?.required_providers?.aws).toEqual({
21
+ source: 'hashicorp/aws',
22
+ version: '~> 4.0',
23
+ });
24
+ expect(config.terraform?.required_providers?.cloudflare).toEqual({
25
+ source: 'cloudflare/cloudflare',
26
+ });
27
+ });
28
+ it('sets backend configuration', () => {
29
+ const config = terraform()
30
+ .backend({
31
+ type: 's3',
32
+ config: { bucket: 'my-state' },
33
+ })
34
+ .build();
35
+ expect(config.terraform?.backend?.type).toBe('s3');
36
+ expect(config.terraform?.backend?.config.bucket).toBe('my-state');
37
+ });
38
+ it('adds provider configurations', () => {
39
+ const config = terraform()
40
+ .provider('aws', { region: 'us-east-1' })
41
+ .provider('aws', { region: 'us-west-2' }, 'west')
42
+ .build();
43
+ expect(config.providers).toHaveLength(2);
44
+ expect(config.providers?.[0]).toEqual({
45
+ provider: 'aws',
46
+ config: { region: 'us-east-1' },
47
+ alias: undefined,
48
+ });
49
+ expect(config.providers?.[1]).toEqual({
50
+ provider: 'aws',
51
+ config: { region: 'us-west-2' },
52
+ alias: 'west',
53
+ });
54
+ });
55
+ it('adds variables', () => {
56
+ const config = terraform()
57
+ .variable('region', 'string', { description: 'AWS region', default: 'us-east-1' })
58
+ .variable('api_key', 'string', { sensitive: true })
59
+ .build();
60
+ expect(config.variables?.region).toEqual({
61
+ type: 'string',
62
+ description: 'AWS region',
63
+ default: 'us-east-1',
64
+ });
65
+ expect(config.variables?.api_key).toEqual({
66
+ type: 'string',
67
+ sensitive: true,
68
+ });
69
+ });
70
+ it('adds locals', () => {
71
+ const config = terraform()
72
+ .locals({ env: 'production' })
73
+ .locals({ app_name: 'myapp' })
74
+ .build();
75
+ expect(config.locals).toEqual({
76
+ env: 'production',
77
+ app_name: 'myapp',
78
+ });
79
+ });
80
+ it('adds resources', () => {
81
+ const config = terraform()
82
+ .resource('aws_instance', 'web', { ami: 'ami-12345' })
83
+ .build();
84
+ expect(config.resources).toHaveLength(1);
85
+ expect(config.resources?.[0]).toEqual({
86
+ type: 'aws_instance',
87
+ name: 'web',
88
+ config: { ami: 'ami-12345' },
89
+ });
90
+ });
91
+ it('adds data sources', () => {
92
+ const config = terraform()
93
+ .data('aws_ami', 'ubuntu', { most_recent: true })
94
+ .build();
95
+ expect(config.dataSources).toHaveLength(1);
96
+ expect(config.dataSources?.[0]).toEqual({
97
+ type: 'aws_ami',
98
+ name: 'ubuntu',
99
+ config: { most_recent: true },
100
+ });
101
+ });
102
+ it('adds modules', () => {
103
+ const config = terraform()
104
+ .module('vpc', 'terraform-aws-modules/vpc/aws', { name: 'my-vpc' }, '3.0.0')
105
+ .build();
106
+ expect(config.modules).toHaveLength(1);
107
+ expect(config.modules?.[0]).toEqual({
108
+ name: 'vpc',
109
+ source: 'terraform-aws-modules/vpc/aws',
110
+ config: { name: 'my-vpc' },
111
+ version: '3.0.0',
112
+ });
113
+ });
114
+ it('adds outputs', () => {
115
+ const config = terraform()
116
+ .output('instance_id', expr('aws_instance.web.id'), { description: 'Instance ID' })
117
+ .build();
118
+ expect(config.outputs?.instance_id).toEqual({
119
+ value: expr('aws_instance.web.id'),
120
+ description: 'Instance ID',
121
+ });
122
+ });
123
+ it('generates HCL output', () => {
124
+ const hcl = terraform()
125
+ .requiredVersion('>= 1.0')
126
+ .variable('name', 'string')
127
+ .toHcl();
128
+ expect(hcl).toContain('terraform {');
129
+ expect(hcl).toContain('required_version = ">= 1.0"');
130
+ expect(hcl).toContain('variable "name"');
131
+ });
132
+ it('chains methods fluently', () => {
133
+ const config = terraform()
134
+ .requiredVersion('>= 1.0')
135
+ .requiredProvider('aws', { source: 'hashicorp/aws' })
136
+ .provider('aws', { region: 'us-east-1' })
137
+ .variable('env', 'string')
138
+ .resource('aws_s3_bucket', 'main', { bucket: 'my-bucket' })
139
+ .output('bucket_id', expr('aws_s3_bucket.main.id'))
140
+ .build();
141
+ expect(config.terraform?.required_version).toBe('>= 1.0');
142
+ expect(config.terraform?.required_providers?.aws).toBeDefined();
143
+ expect(config.providers).toHaveLength(1);
144
+ expect(config.variables?.env).toBeDefined();
145
+ expect(config.resources).toHaveLength(1);
146
+ expect(config.outputs?.bucket_id).toBeDefined();
147
+ });
148
+ });
149
+ describe('backends', () => {
150
+ describe('s3', () => {
151
+ it('creates an S3 backend config', () => {
152
+ const backend = backends.s3({
153
+ bucket: 'my-state',
154
+ key: 'terraform.tfstate',
155
+ region: 'us-east-1',
156
+ });
157
+ expect(backend.type).toBe('s3');
158
+ expect(backend.config.bucket).toBe('my-state');
159
+ expect(backend.config.key).toBe('terraform.tfstate');
160
+ expect(backend.config.region).toBe('us-east-1');
161
+ expect(backend.config.encrypt).toBe(true);
162
+ });
163
+ it('includes dynamodb_table when provided', () => {
164
+ const backend = backends.s3({
165
+ bucket: 'my-state',
166
+ key: 'terraform.tfstate',
167
+ region: 'us-east-1',
168
+ dynamodb_table: 'terraform-locks',
169
+ });
170
+ expect(backend.config.dynamodb_table).toBe('terraform-locks');
171
+ });
172
+ });
173
+ describe('gcs', () => {
174
+ it('creates a GCS backend config', () => {
175
+ const backend = backends.gcs({
176
+ bucket: 'my-state',
177
+ prefix: 'terraform/state',
178
+ });
179
+ expect(backend.type).toBe('gcs');
180
+ expect(backend.config.bucket).toBe('my-state');
181
+ expect(backend.config.prefix).toBe('terraform/state');
182
+ });
183
+ });
184
+ describe('local', () => {
185
+ it('creates a local backend config', () => {
186
+ const backend = backends.local('/path/to/state');
187
+ expect(backend.type).toBe('local');
188
+ expect(backend.config.path).toBe('/path/to/state');
189
+ });
190
+ it('creates empty config when no path provided', () => {
191
+ const backend = backends.local();
192
+ expect(backend.type).toBe('local');
193
+ expect(backend.config).toEqual({});
194
+ });
195
+ });
196
+ describe('cloud', () => {
197
+ it('creates a Terraform Cloud backend config', () => {
198
+ const backend = backends.cloud({
199
+ organization: 'my-org',
200
+ workspaces: { name: 'my-workspace' },
201
+ });
202
+ expect(backend.type).toBe('cloud');
203
+ expect(backend.config.organization).toBe('my-org');
204
+ expect(backend.config.workspaces).toEqual({ name: 'my-workspace' });
205
+ });
206
+ });
207
+ });
208
+ describe('providers', () => {
209
+ describe('aws', () => {
210
+ it('creates AWS provider config', () => {
211
+ const provider = providers.aws('us-east-1');
212
+ expect(provider.provider).toBe('aws');
213
+ expect(provider.config.region).toBe('us-east-1');
214
+ });
215
+ it('includes profile when provided', () => {
216
+ const provider = providers.aws('us-east-1', 'my-profile');
217
+ expect(provider.config.profile).toBe('my-profile');
218
+ });
219
+ });
220
+ describe('cloudflare', () => {
221
+ it('creates Cloudflare provider config', () => {
222
+ const provider = providers.cloudflare();
223
+ expect(provider.provider).toBe('cloudflare');
224
+ expect(provider.config).toEqual({});
225
+ });
226
+ it('includes api_token when provided', () => {
227
+ const provider = providers.cloudflare('my-token');
228
+ expect(provider.config.api_token).toBe('my-token');
229
+ });
230
+ });
231
+ describe('google', () => {
232
+ it('creates Google provider config', () => {
233
+ const provider = providers.google('my-project', 'us-central1');
234
+ expect(provider.provider).toBe('google');
235
+ expect(provider.config.project).toBe('my-project');
236
+ expect(provider.config.region).toBe('us-central1');
237
+ });
238
+ });
239
+ });
240
+ //# sourceMappingURL=terraform.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.test.js","sourceRoot":"","sources":["../../src/config/terraform.test.ts"],"names":[],"mappings":"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"}