@terraforge/terraform 0.0.9 → 0.0.11
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.
- package/README.md +54 -1
- package/cli/build-package.ts +31 -9
- package/dist/index.d.mts +310 -0
- package/dist/index.mjs +2367 -0
- package/package.json +8 -8
- package/dist/index.d.ts +0 -92
- package/dist/index.js +0 -1986
package/README.md
CHANGED
|
@@ -3,6 +3,59 @@
|
|
|
3
3
|
|
|
4
4
|
This package is used to build Terraform bridge packages that can be used with @terraforge/core.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
It works in 3 steps:
|
|
7
|
+
|
|
8
|
+
1. It provides a build script that generates the typescript typings for your Terraform bridge package.
|
|
9
|
+
|
|
10
|
+
2. It provides a proxy api that can we used to interact with Terraform resources.
|
|
11
|
+
|
|
12
|
+
3. It will install the Terraform provider that you specify in your bridge package.
|
|
13
|
+
|
|
14
|
+
### Terraform Plugin installation location
|
|
7
15
|
|
|
8
16
|
The default installation location is `~/.terraforge/plugins`.
|
|
17
|
+
|
|
18
|
+
## Usage Guide
|
|
19
|
+
|
|
20
|
+
### Step 1. Create a package.json
|
|
21
|
+
Create a package.json for the bridge package you want to create.
|
|
22
|
+
In the `package.json` file, you will need to specify the provider details that your package is for.
|
|
23
|
+
Example:
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"name": "@terraforge/aws",
|
|
27
|
+
"version": "1.0.0",
|
|
28
|
+
"provider": { // These are the terraform provider details that your package is for.
|
|
29
|
+
"org": "hashicorp",
|
|
30
|
+
"type": "aws",
|
|
31
|
+
"version": "1.0.0"
|
|
32
|
+
},
|
|
33
|
+
"type": "module",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
],
|
|
37
|
+
"module": "./dist/index.js",
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"types": "./dist/index.d.ts"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "bun ../terraform/cli/build-package",
|
|
47
|
+
"prepublishOnly": "bun run build"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"@terraforge/terraform": "workspace:*",
|
|
51
|
+
"@terraforge/core": "workspace:*"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Step 2. Publish your package
|
|
57
|
+
You can now publish your package to npm or any other package registry.
|
|
58
|
+
The prepublish script will build the package files inside the `dist` directory before publishing.
|
|
59
|
+
|
|
60
|
+
### Step 3. There is no step 3
|
|
61
|
+
Sit back and relax, your package is now published and ready to be used.
|
package/cli/build-package.ts
CHANGED
|
@@ -65,18 +65,39 @@ console.log('')
|
|
|
65
65
|
console.log('Loading provider plugin...')
|
|
66
66
|
|
|
67
67
|
const plugin = await load()
|
|
68
|
+
|
|
69
|
+
console.log('Provider plugin loaded.')
|
|
70
|
+
|
|
68
71
|
const schema = plugin.schema()
|
|
69
|
-
const types = generateTypes(
|
|
70
|
-
{
|
|
71
|
-
[type]: schema.provider,
|
|
72
|
-
},
|
|
73
|
-
schema.resources,
|
|
74
|
-
schema.dataSources
|
|
75
|
-
)
|
|
76
72
|
|
|
77
73
|
await plugin.stop()
|
|
78
74
|
|
|
79
|
-
|
|
75
|
+
// const installTypes = generateInstallHelperFunctions(type)
|
|
76
|
+
// await Bun.write(`./dist/install.d.ts`, installTypes)
|
|
77
|
+
|
|
78
|
+
// const providerTypes = generateProviderFactoryTypes(type, schema.provider)
|
|
79
|
+
// await Bun.write(`./dist/provider.d.ts`, providerTypes)
|
|
80
|
+
|
|
81
|
+
// const resourceTypes = generateResourceTypes(schema.resources)
|
|
82
|
+
// await Bun.write(`./dist/resources.d.ts`, resourceTypes)
|
|
83
|
+
|
|
84
|
+
// const dataSourceTypes = generateResourceTypes(schema.dataSources)
|
|
85
|
+
// await Bun.write(`./dist/data-sources.d.ts`, dataSourceTypes)
|
|
86
|
+
|
|
87
|
+
// await Bun.write(
|
|
88
|
+
// `./dist/index.d.ts`,
|
|
89
|
+
// `
|
|
90
|
+
// /// <reference path="./install.d.ts" />
|
|
91
|
+
// /// <reference path="./provider.d.ts" />
|
|
92
|
+
// /// <reference path="./resources.d.ts" />
|
|
93
|
+
// /// <reference path="./data-sources.d.ts" />
|
|
94
|
+
|
|
95
|
+
// export { aws }
|
|
96
|
+
// `
|
|
97
|
+
// )
|
|
98
|
+
|
|
99
|
+
await Bun.write(`./dist/index.d.ts`, generateTypes(type, schema.provider, schema.resources, schema.dataSources))
|
|
100
|
+
|
|
80
101
|
await Bun.write(
|
|
81
102
|
`./dist/index.js`,
|
|
82
103
|
`
|
|
@@ -89,5 +110,6 @@ export const ${type} = createTerraformProxy({
|
|
|
89
110
|
`
|
|
90
111
|
)
|
|
91
112
|
|
|
92
|
-
console.log('
|
|
113
|
+
console.log('')
|
|
114
|
+
console.log('Package done building.')
|
|
93
115
|
process.exit(0)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
//#region src/plugin/schema.d.ts
|
|
2
|
+
|
|
3
|
+
type Property = {
|
|
4
|
+
description?: string;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
optional?: boolean;
|
|
7
|
+
/** The computed field means that it could be computed by the server. */
|
|
8
|
+
computed?: boolean;
|
|
9
|
+
deprecated?: boolean;
|
|
10
|
+
sensitive?: boolean;
|
|
11
|
+
} & ({
|
|
12
|
+
type: 'string' | 'number' | 'boolean';
|
|
13
|
+
} | {
|
|
14
|
+
type: 'array' | 'record';
|
|
15
|
+
item: Property;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'object' | 'array-object';
|
|
18
|
+
properties: Record<string, Property>;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'unknown';
|
|
21
|
+
});
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/type-gen.d.ts
|
|
24
|
+
declare const generateTypes: (namespace: string, provider: Property, resources: Record<string, Property>, dataSources: Record<string, Property>) => string;
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/plugin/version/type.d.ts
|
|
27
|
+
type State$1 = Record<string, unknown>;
|
|
28
|
+
type Plugin = Readonly<{
|
|
29
|
+
schema: () => {
|
|
30
|
+
provider: Property;
|
|
31
|
+
resources: Record<string, Property>;
|
|
32
|
+
dataSources: Record<string, Property>;
|
|
33
|
+
};
|
|
34
|
+
stop: () => Promise<void>;
|
|
35
|
+
configure: (config: State$1) => Promise<void>;
|
|
36
|
+
readResource: (type: string, state: State$1) => Promise<State$1>;
|
|
37
|
+
readDataSource: (type: string, state: State$1) => Promise<State$1>;
|
|
38
|
+
validateResource: (type: string, state: State$1) => Promise<void>;
|
|
39
|
+
planResourceChange: (type: string, priorState: State$1 | null, proposedNewState: State$1 | null) => Promise<{
|
|
40
|
+
requiresReplace: Array<string | number>[];
|
|
41
|
+
plannedState: State$1;
|
|
42
|
+
}>;
|
|
43
|
+
applyResourceChange: (type: string, priorState: State$1 | null, proposedNewState: State$1 | null) => Promise<State$1>;
|
|
44
|
+
}>;
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region ../core/src/future.d.ts
|
|
47
|
+
declare class Future<T = unknown> {
|
|
48
|
+
protected callback: (resolve: (data: T) => void, reject: (error: unknown) => void) => void;
|
|
49
|
+
protected listeners: Set<{
|
|
50
|
+
resolve: (data: T) => void;
|
|
51
|
+
reject?: (error: unknown) => void;
|
|
52
|
+
}>;
|
|
53
|
+
protected status: 0 | 1 | 2 | 3;
|
|
54
|
+
protected data?: T;
|
|
55
|
+
protected error?: unknown;
|
|
56
|
+
constructor(callback: (resolve: (data: T) => void, reject: (error: unknown) => void) => void);
|
|
57
|
+
get [Symbol.toStringTag](): string;
|
|
58
|
+
pipe<N>(cb: (value: T) => N): Future<Awaited<N>>;
|
|
59
|
+
then(resolve: (data: T) => void, reject?: (error: unknown) => void): void;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region ../core/src/input.d.ts
|
|
63
|
+
type Input<T = unknown> = T | Output<T> | Future<T> | Promise<T>;
|
|
64
|
+
type UnwrapInputArray<T extends Input[]> = { [K in keyof T]: UnwrapInput<T[K]> };
|
|
65
|
+
type UnwrapInput<T> = T extends Input<infer V> ? V : T;
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region ../core/src/output.d.ts
|
|
68
|
+
declare class Output<T = unknown> extends Future<T> {
|
|
69
|
+
readonly dependencies: Set<Meta>;
|
|
70
|
+
constructor(dependencies: Set<Meta>, callback: (resolve: (data: T) => void, reject: (error: unknown) => void) => void);
|
|
71
|
+
pipe<N>(cb: (value: T) => N): Output<Awaited<N>>;
|
|
72
|
+
}
|
|
73
|
+
declare const combine: <T extends Input[], R = UnwrapInputArray<T>>(...inputs: T) => Output<R>;
|
|
74
|
+
declare const resolve: <T extends [Input, ...Input[]], R>(inputs: T, transformer: (...inputs: UnwrapInputArray<T>) => R) => Output<Awaited<R>>;
|
|
75
|
+
declare const interpolate: (literals: TemplateStringsArray, ...placeholders: Input<any>[]) => Output<string>;
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region ../core/src/urn.d.ts
|
|
78
|
+
type URN = `urn:${string}`;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region ../core/src/node.d.ts
|
|
81
|
+
declare const nodeMetaSymbol: unique symbol;
|
|
82
|
+
type Node<T extends Tag = Tag, O extends State = State> = {
|
|
83
|
+
readonly [nodeMetaSymbol]: Meta<T>;
|
|
84
|
+
readonly urn: URN;
|
|
85
|
+
} & O;
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region ../core/src/resource.d.ts
|
|
88
|
+
type ResourceConfig = Config & {
|
|
89
|
+
/** Import an existing resource instead of creating a new resource. */
|
|
90
|
+
import?: string;
|
|
91
|
+
/** If true the resource will be retained in the backing cloud provider during a delete operation. */
|
|
92
|
+
retainOnDelete?: boolean;
|
|
93
|
+
/** If set, the provider’s Delete method will not be called for this resource if the specified resource is being deleted as well. */
|
|
94
|
+
/** Declare that changes to certain properties should be treated as forcing a replacement. */
|
|
95
|
+
replaceOnChanges?: string[];
|
|
96
|
+
/** If true, create the replacement before deleting the existing resource. */
|
|
97
|
+
createBeforeReplace?: boolean;
|
|
98
|
+
};
|
|
99
|
+
type ResourceMeta = Meta<'resource', ResourceConfig>;
|
|
100
|
+
type Resource<O extends State = State> = O & {
|
|
101
|
+
readonly [nodeMetaSymbol]: ResourceMeta;
|
|
102
|
+
readonly urn: URN;
|
|
103
|
+
};
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region ../core/src/stack.d.ts
|
|
106
|
+
declare class Stack extends Group {
|
|
107
|
+
readonly app: App;
|
|
108
|
+
readonly dependencies: Set<Stack>;
|
|
109
|
+
constructor(app: App, name: string);
|
|
110
|
+
dependsOn(...stacks: Stack[]): this;
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region ../core/src/meta.d.ts
|
|
114
|
+
type Tag = 'resource' | 'data';
|
|
115
|
+
type State = Record<string, any>;
|
|
116
|
+
type Config = {
|
|
117
|
+
/** Specify additional explicit dependencies in addition to the ones in the dependency graph. */
|
|
118
|
+
dependsOn?: Resource[];
|
|
119
|
+
/** Pass an ID of an explicitly configured provider, instead of using the default provider. */
|
|
120
|
+
provider?: string;
|
|
121
|
+
};
|
|
122
|
+
type Meta<T extends Tag = Tag, C extends Config = Config> = {
|
|
123
|
+
readonly tag: T;
|
|
124
|
+
readonly urn: URN;
|
|
125
|
+
readonly logicalId: string;
|
|
126
|
+
readonly type: string;
|
|
127
|
+
readonly stack: Stack;
|
|
128
|
+
readonly provider: string;
|
|
129
|
+
readonly input: State;
|
|
130
|
+
readonly config?: C;
|
|
131
|
+
readonly dependencies: Set<URN>;
|
|
132
|
+
readonly resolve: (data: State) => void;
|
|
133
|
+
readonly output: <V>(cb: (data: State) => V) => Output<V>;
|
|
134
|
+
};
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region ../core/src/data-source.d.ts
|
|
137
|
+
type DataSourceMeta = Meta<'data'>;
|
|
138
|
+
type DataSource<O extends State = State> = {
|
|
139
|
+
readonly [nodeMetaSymbol]: DataSourceMeta;
|
|
140
|
+
readonly urn: URN;
|
|
141
|
+
} & O;
|
|
142
|
+
//#endregion
|
|
143
|
+
//#region ../core/src/group.d.ts
|
|
144
|
+
declare class Group {
|
|
145
|
+
readonly parent: Group | undefined;
|
|
146
|
+
readonly type: string;
|
|
147
|
+
readonly name: string;
|
|
148
|
+
protected children: Array<Group | Node>;
|
|
149
|
+
constructor(parent: Group | undefined, type: string, name: string);
|
|
150
|
+
get urn(): URN;
|
|
151
|
+
protected addChild(child: Group | Node): void;
|
|
152
|
+
add(...children: Array<Group | Node>): void;
|
|
153
|
+
get nodes(): Node[];
|
|
154
|
+
get resources(): Resource[];
|
|
155
|
+
get dataSources(): DataSource[];
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region ../core/src/app.d.ts
|
|
159
|
+
declare class App extends Group {
|
|
160
|
+
readonly name: string;
|
|
161
|
+
constructor(name: string);
|
|
162
|
+
get stacks(): Stack[];
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region ../core/src/provider.d.ts
|
|
166
|
+
type CreateProps<T = State> = {
|
|
167
|
+
type: string;
|
|
168
|
+
state: T;
|
|
169
|
+
idempotantToken?: string;
|
|
170
|
+
};
|
|
171
|
+
type UpdateProps<T = State> = {
|
|
172
|
+
type: string;
|
|
173
|
+
priorState: T;
|
|
174
|
+
proposedState: T;
|
|
175
|
+
idempotantToken?: string;
|
|
176
|
+
};
|
|
177
|
+
type DeleteProps<T = State> = {
|
|
178
|
+
type: string;
|
|
179
|
+
state: T;
|
|
180
|
+
idempotantToken?: string;
|
|
181
|
+
};
|
|
182
|
+
type PlanProps<T = State> = {
|
|
183
|
+
type: string;
|
|
184
|
+
priorState: T;
|
|
185
|
+
proposedState: T;
|
|
186
|
+
};
|
|
187
|
+
type GetProps<T = State> = {
|
|
188
|
+
type: string;
|
|
189
|
+
state: T;
|
|
190
|
+
};
|
|
191
|
+
type GetDataProps<T = State> = {
|
|
192
|
+
type: string;
|
|
193
|
+
state: T;
|
|
194
|
+
};
|
|
195
|
+
interface Provider {
|
|
196
|
+
ownResource(id: string): boolean;
|
|
197
|
+
getResource(props: GetProps): Promise<{
|
|
198
|
+
version: number;
|
|
199
|
+
state: State;
|
|
200
|
+
}>;
|
|
201
|
+
createResource(props: CreateProps): Promise<{
|
|
202
|
+
version: number;
|
|
203
|
+
state: State;
|
|
204
|
+
}>;
|
|
205
|
+
updateResource(props: UpdateProps): Promise<{
|
|
206
|
+
version: number;
|
|
207
|
+
state: State;
|
|
208
|
+
}>;
|
|
209
|
+
deleteResource(props: DeleteProps): Promise<void>;
|
|
210
|
+
planResourceChange?(props: PlanProps): Promise<{
|
|
211
|
+
version: number;
|
|
212
|
+
state: State;
|
|
213
|
+
requiresReplacement: boolean;
|
|
214
|
+
}>;
|
|
215
|
+
getData?(props: GetDataProps): Promise<{
|
|
216
|
+
state: State;
|
|
217
|
+
}>;
|
|
218
|
+
destroy?(): Promise<void>;
|
|
219
|
+
}
|
|
220
|
+
//#endregion
|
|
221
|
+
//#region ../core/src/helpers.d.ts
|
|
222
|
+
declare const file: (path: string, encoding?: BufferEncoding) => Future<string>;
|
|
223
|
+
declare const hash: (path: string, algo?: string) => Future<string>;
|
|
224
|
+
//#endregion
|
|
225
|
+
//#region ../core/src/globals.d.ts
|
|
226
|
+
declare global {
|
|
227
|
+
var $resolve: typeof resolve;
|
|
228
|
+
var $combine: typeof combine;
|
|
229
|
+
var $interpolate: typeof interpolate;
|
|
230
|
+
var $hash: typeof hash;
|
|
231
|
+
var $file: typeof file;
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
//#region src/provider.d.ts
|
|
235
|
+
declare class TerraformProvider implements Provider {
|
|
236
|
+
private type;
|
|
237
|
+
private id;
|
|
238
|
+
private createPlugin;
|
|
239
|
+
private config;
|
|
240
|
+
private configured?;
|
|
241
|
+
private plugin?;
|
|
242
|
+
constructor(type: string, id: string, createPlugin: () => Promise<Plugin>, config: State);
|
|
243
|
+
private configure;
|
|
244
|
+
private prepare;
|
|
245
|
+
destroy(): Promise<void>;
|
|
246
|
+
ownResource(id: string): boolean;
|
|
247
|
+
getResource({
|
|
248
|
+
type,
|
|
249
|
+
state
|
|
250
|
+
}: GetProps): Promise<{
|
|
251
|
+
version: number;
|
|
252
|
+
state: State$1;
|
|
253
|
+
}>;
|
|
254
|
+
createResource({
|
|
255
|
+
type,
|
|
256
|
+
state
|
|
257
|
+
}: CreateProps): Promise<{
|
|
258
|
+
version: number;
|
|
259
|
+
state: State$1;
|
|
260
|
+
}>;
|
|
261
|
+
updateResource({
|
|
262
|
+
type,
|
|
263
|
+
priorState,
|
|
264
|
+
proposedState
|
|
265
|
+
}: UpdateProps): Promise<{
|
|
266
|
+
version: number;
|
|
267
|
+
state: State$1;
|
|
268
|
+
}>;
|
|
269
|
+
deleteResource({
|
|
270
|
+
type,
|
|
271
|
+
state
|
|
272
|
+
}: DeleteProps): Promise<void>;
|
|
273
|
+
planResourceChange({
|
|
274
|
+
type,
|
|
275
|
+
priorState,
|
|
276
|
+
proposedState
|
|
277
|
+
}: PlanProps): Promise<{
|
|
278
|
+
version: number;
|
|
279
|
+
requiresReplacement: boolean;
|
|
280
|
+
state: State$1;
|
|
281
|
+
}>;
|
|
282
|
+
getData({
|
|
283
|
+
type,
|
|
284
|
+
state
|
|
285
|
+
}: GetDataProps): Promise<{
|
|
286
|
+
state: State$1;
|
|
287
|
+
}>;
|
|
288
|
+
}
|
|
289
|
+
//#endregion
|
|
290
|
+
//#region src/plugin/registry.d.ts
|
|
291
|
+
type Version = `${number}.${number}.${number}` | 'latest';
|
|
292
|
+
//#endregion
|
|
293
|
+
//#region src/proxy.d.ts
|
|
294
|
+
type TerraformProviderConfig = {
|
|
295
|
+
id?: string;
|
|
296
|
+
location?: string;
|
|
297
|
+
};
|
|
298
|
+
type InstallProps = {
|
|
299
|
+
location?: string;
|
|
300
|
+
};
|
|
301
|
+
declare const createTerraformProxy: (props: {
|
|
302
|
+
namespace: string;
|
|
303
|
+
provider: {
|
|
304
|
+
org: string;
|
|
305
|
+
type: string;
|
|
306
|
+
version: Version;
|
|
307
|
+
};
|
|
308
|
+
}) => () => void;
|
|
309
|
+
//#endregion
|
|
310
|
+
export { type InstallProps, TerraformProvider, type TerraformProviderConfig, createTerraformProxy, generateTypes };
|