@terraforge/terraform 0.0.8 → 0.0.9

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.
@@ -13,25 +13,30 @@ const packageData = (await Bun.file('./package.json').json()) as {
13
13
  }
14
14
  }
15
15
 
16
- if (!packageData || !packageData.provider) {
16
+ if (!packageData) {
17
17
  console.error('Failed to read package.json')
18
18
  process.exit(1)
19
19
  }
20
20
 
21
21
  const providerData = packageData.provider
22
22
 
23
+ if (!providerData) {
24
+ console.error('Missing required property: provider')
25
+ process.exit(1)
26
+ }
27
+
23
28
  if (!providerData.version) {
24
- console.error('Missing required arguments: version')
29
+ console.error('Missing required property: provider.version')
25
30
  process.exit(1)
26
31
  }
27
32
 
28
33
  if (!providerData.org) {
29
- console.error('Missing required arguments: org')
34
+ console.error('Missing required property: provider.org')
30
35
  process.exit(1)
31
36
  }
32
37
 
33
38
  if (!providerData.type) {
34
- console.error('Missing required arguments: type')
39
+ console.error('Missing required property: provider.type')
35
40
  process.exit(1)
36
41
  }
37
42
 
@@ -75,9 +80,9 @@ await Bun.write(`./dist/index.d.ts`, types)
75
80
  await Bun.write(
76
81
  `./dist/index.js`,
77
82
  `
78
- import { createTerraformAPI } from '@terraforge/terraform'
83
+ import { createTerraformProxy } from '@terraforge/terraform'
79
84
 
80
- export const ${type} = createTerraformAPI({
85
+ export const ${type} = createTerraformProxy({
81
86
  namespace: '${type}',
82
87
  provider: { org: '${org}', type: '${type}', version: '${version}' },
83
88
  })
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ var generateTypes = (providers, resources, dataSources) => {
8
8
  generateImport("c", "@terraforge/core"),
9
9
  generateImport("t", "@terraforge/terraform"),
10
10
  "type _Record<T> = Record<string, T>",
11
- generateInstallFunction(providers),
11
+ generateInstallHelperFunctions(providers),
12
12
  generateNamespace(providers, (name, prop, indent) => {
13
13
  const typeName = name.toLowerCase();
14
14
  return `${tab(indent)}export declare function ${typeName}(props: ${generatePropertyInputConst(prop, indent)}, config?: t.TerraformProviderConfig): t.TerraformProvider`;
@@ -41,10 +41,16 @@ var generateTypes = (providers, resources, dataSources) => {
41
41
  var generateImport = (name, from) => {
42
42
  return `import * as ${name} from '${from}'`;
43
43
  };
44
- var generateInstallFunction = (resources) => {
44
+ var generateInstallHelperFunctions = (resources) => {
45
45
  return generateNamespace(resources, (name, _prop, indent) => {
46
46
  const typeName = name.toLowerCase();
47
- return `${tab(indent)}export declare namespace ${typeName} { export function install(props?: t.InstallProps): Promise<void> }`;
47
+ return [
48
+ `${tab(indent)}export declare namespace ${typeName} {`,
49
+ `${tab(indent + 1)}export function install(props?: t.InstallProps): Promise<void>`,
50
+ `${tab(indent + 1)}export function uninstall(props?: t.InstallProps): Promise<void>`,
51
+ `${tab(indent + 1)}export function isInstalled(props?: t.InstallProps): Promise<boolean>`,
52
+ `${tab(indent)}}`
53
+ ].join("\n");
48
54
  });
49
55
  };
50
56
  var generatePropertyInputConst = (prop, indent) => {
@@ -71,8 +77,8 @@ var generatePropertyInputType = (prop, indent) => {
71
77
  };
72
78
  var generatePropertyOutputType = (prop, indent) => {
73
79
  return generateValue(prop, {
74
- indent: indent + 1,
75
80
  depth: 0,
81
+ indent: indent + 1,
76
82
  wrap: (v, p, ctx) => ctx.depth === 1 ? p.optional && !p.computed ? `c.OptionalOutput<${v}>` : `c.Output<${v}>` : v,
77
83
  filter: () => true,
78
84
  readonly: true,
@@ -1047,9 +1053,9 @@ var createPluginClient = async (props) => {
1047
1053
  // src/plugin/download.ts
1048
1054
  import { createDebugger as createDebugger2 } from "@terraforge/core";
1049
1055
  import jszip from "jszip";
1050
- import { mkdir, stat, writeFile } from "fs/promises";
1056
+ import { mkdir, rm, stat, writeFile } from "fs/promises";
1051
1057
  import { homedir } from "os";
1052
- import { join } from "path";
1058
+ import { dirname, join } from "path";
1053
1059
 
1054
1060
  // src/plugin/registry.ts
1055
1061
  import { arch, platform } from "os";
@@ -1136,15 +1142,33 @@ var exists = async (file) => {
1136
1142
  };
1137
1143
  var debug2 = createDebugger2("Downloader");
1138
1144
  var installPath = join(homedir(), ".terraforge", "plugins");
1145
+ var getInstallPath = (props) => {
1146
+ const dir = props.location ?? installPath;
1147
+ const file = join(dir, `${props.org}-${props.type}-${props.version}`);
1148
+ return file;
1149
+ };
1150
+ var isPluginInstalled = (props) => {
1151
+ return exists(getInstallPath(props));
1152
+ };
1153
+ var deletePlugin = async (props) => {
1154
+ const file = getInstallPath(props);
1155
+ const isAlreadyInstalled = await isPluginInstalled(props);
1156
+ if (isAlreadyInstalled) {
1157
+ debug2(props.type, "deleting...");
1158
+ await rm(file);
1159
+ debug2(props.type, "deleted");
1160
+ } else {
1161
+ debug2(props.type, "not installed");
1162
+ }
1163
+ };
1139
1164
  var downloadPlugin = async (props) => {
1140
1165
  if (props.version === "latest") {
1141
1166
  const { latest } = await getProviderVersions(props.org, props.type);
1142
1167
  props.version = latest;
1143
1168
  }
1144
- const dir = props.location ?? installPath;
1145
- const file = join(dir, `${props.org}-${props.type}-${props.version}`);
1146
- const exist = await exists(file);
1147
- if (!exist) {
1169
+ const file = getInstallPath(props);
1170
+ const isAlreadyInstalled = await isPluginInstalled(props);
1171
+ if (!isAlreadyInstalled) {
1148
1172
  debug2(props.type, "downloading...");
1149
1173
  const info = await getProviderDownloadUrl(props.org, props.type, props.version);
1150
1174
  const res = await fetch(info.url);
@@ -1156,7 +1180,7 @@ var downloadPlugin = async (props) => {
1156
1180
  }
1157
1181
  const binary = await zipped.async("nodebuffer");
1158
1182
  debug2(props.type, "done");
1159
- await mkdir(dir, { recursive: true });
1183
+ await mkdir(dirname(file), { recursive: true });
1160
1184
  await writeFile(file, binary, {
1161
1185
  mode: 509
1162
1186
  });
@@ -1863,6 +1887,8 @@ var createClassProxy = (construct, get) => {
1863
1887
  var createRecursiveProxy = ({
1864
1888
  provider,
1865
1889
  install,
1890
+ uninstall,
1891
+ isInstalled,
1866
1892
  resource,
1867
1893
  dataSource
1868
1894
  }) => {
@@ -1890,6 +1916,12 @@ var createRecursiveProxy = ({
1890
1916
  if (key === "install") {
1891
1917
  return install;
1892
1918
  }
1919
+ if (key === "uninstall") {
1920
+ return uninstall;
1921
+ }
1922
+ if (key === "isInstalled") {
1923
+ return isInstalled;
1924
+ }
1893
1925
  return findNextProxy([], key);
1894
1926
  });
1895
1927
  };
@@ -1909,6 +1941,12 @@ var createTerraformProxy = (props) => {
1909
1941
  async install(installProps) {
1910
1942
  await downloadPlugin({ ...props.provider, ...installProps });
1911
1943
  },
1944
+ async uninstall(installProps) {
1945
+ await deletePlugin({ ...props.provider, ...installProps });
1946
+ },
1947
+ async isInstalled(installProps) {
1948
+ return await isPluginInstalled({ ...props.provider, ...installProps });
1949
+ },
1912
1950
  resource: (ns, parent, id, input, config) => {
1913
1951
  const type = snakeCase2([props.namespace, ...ns].join("_"));
1914
1952
  const provider = `terraform:${props.namespace}:${config?.provider ?? "default"}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terraforge/terraform",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",