@terraforge/terraform 0.0.2 → 0.0.4

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 ADDED
@@ -0,0 +1,8 @@
1
+
2
+ # Terraform bridge for Terraforge
3
+
4
+ This package is used to build Terraform bridge packages that can be used with @terraforge/core.
5
+
6
+ ### Installation location
7
+
8
+ The default installation location is `~/.terraforge/plugins`.
package/dist/index.d.ts CHANGED
@@ -3,6 +3,9 @@ type TerraformProviderConfig = {
3
3
  id?: string;
4
4
  location?: string;
5
5
  };
6
+ type InstallProps = {
7
+ location?: string;
8
+ };
6
9
  declare const createTerraformAPI: <T>(props: {
7
10
  namespace: string;
8
11
  provider: {
@@ -68,4 +71,4 @@ declare class TerraformProvider implements Provider {
68
71
  deleteResource({ type, state }: DeleteProps);
69
72
  getData({ type, state }: GetDataProps);
70
73
  }
71
- export { generateTypes, createTerraformAPI, TerraformProviderConfig, TerraformProvider };
74
+ export { generateTypes, createTerraformAPI, TerraformProviderConfig, TerraformProvider, InstallProps };
package/dist/index.js CHANGED
@@ -1546,19 +1546,23 @@ class TerraformProvider {
1546
1546
  }
1547
1547
 
1548
1548
  // src/resource.ts
1549
- import { createMeta } from "@terraforge/core";
1549
+ import { createMeta, nodeMetaSymbol } from "@terraforge/core";
1550
1550
  import { snakeCase as snakeCase2 } from "change-case";
1551
- var createNamespaceProxy = (cb, target = {}) => {
1551
+ var createNamespaceProxy = (cb, scb) => {
1552
1552
  const cache = new Map;
1553
- return new Proxy(target, {
1553
+ return new Proxy({}, {
1554
1554
  get(_, key) {
1555
1555
  if (!cache.has(key)) {
1556
- cache.set(key, cb(key));
1556
+ const value = typeof key === "symbol" ? scb?.(key) : cb(key);
1557
+ cache.set(key, value);
1557
1558
  }
1558
1559
  return cache.get(key);
1559
1560
  },
1560
1561
  set(_, key) {
1561
- throw new Error(`Cannot assign to ${key} because it is a read-only property.`);
1562
+ if (typeof key === "string") {
1563
+ throw new Error(`Cannot set property ${key} on read-only object.`);
1564
+ }
1565
+ throw new Error(`This object is read-only.`);
1562
1566
  }
1563
1567
  });
1564
1568
  };
@@ -1607,26 +1611,30 @@ var createResourceProxy = (name) => {
1607
1611
  resource: (ns, parent, id, input, config) => {
1608
1612
  const type = snakeCase2(name + "_" + ns.join("_"));
1609
1613
  const provider = `terraform:${name}:${config?.provider ?? "default"}`;
1610
- const $ = createMeta("resource", provider, parent, type, id, input, config);
1614
+ const meta = createMeta("resource", provider, parent, type, id, input, config);
1611
1615
  const resource = createNamespaceProxy((key) => {
1612
- if (key === "$") {
1613
- return $;
1616
+ return meta.output((data) => data[key]);
1617
+ }, (key) => {
1618
+ if (key === nodeMetaSymbol) {
1619
+ return meta;
1614
1620
  }
1615
- return $.output((data) => data[key]);
1616
- }, { $ });
1621
+ return;
1622
+ });
1617
1623
  parent.add(resource);
1618
1624
  return resource;
1619
1625
  },
1620
1626
  dataSource: (ns, parent, id, input, config) => {
1621
1627
  const type = snakeCase2(name + "_" + ns.join("_"));
1622
1628
  const provider = `terraform:${name}:${config?.provider ?? "default"}`;
1623
- const $ = createMeta("data", provider, parent, type, id, input, config);
1629
+ const meta = createMeta("data", provider, parent, type, id, input, config);
1624
1630
  const dataSource = createNamespaceProxy((key) => {
1625
- if (key === "$") {
1626
- return $;
1631
+ return meta.output((data) => data[key]);
1632
+ }, (key) => {
1633
+ if (key === nodeMetaSymbol) {
1634
+ return meta;
1627
1635
  }
1628
- return $.output((data) => data[key]);
1629
- }, { $ });
1636
+ return;
1637
+ });
1630
1638
  parent.add(dataSource);
1631
1639
  return dataSource;
1632
1640
  }
@@ -1636,11 +1644,11 @@ var createResourceProxy = (name) => {
1636
1644
  // src/api.ts
1637
1645
  var createTerraformAPI = (props) => {
1638
1646
  const resource = createResourceProxy(props.namespace);
1639
- const install = async ({ location }) => {
1640
- await downloadPlugin({ ...props.provider, location });
1647
+ const install = async (installProps) => {
1648
+ await downloadPlugin({ ...props.provider, ...installProps });
1641
1649
  };
1642
- const createPlugin = ({ location }) => {
1643
- return createLazyPlugin({ ...props.provider, location });
1650
+ const createPlugin = (pluginProps) => {
1651
+ return createLazyPlugin({ ...props.provider, ...pluginProps });
1644
1652
  };
1645
1653
  return new Proxy(() => {}, {
1646
1654
  apply(_, _this, [input, config]) {
@@ -1664,6 +1672,7 @@ var generateTypes = (providers, resources, dataSources) => {
1664
1672
  generateImport("c", "@terraforge/core"),
1665
1673
  generateImport("t", "@terraforge/terraform"),
1666
1674
  "type _Record<T> = Record<string, T>",
1675
+ generateInstallFunction(providers),
1667
1676
  generateNamespace(providers, (name, prop, indent) => {
1668
1677
  const typeName = name.toLowerCase();
1669
1678
  return `${tab(indent)}export function ${typeName}(props: ${generatePropertyInputConst(prop, indent)}, config?: t.TerraformProviderConfig): t.TerraformProvider`;
@@ -1699,6 +1708,12 @@ var generateTypes = (providers, resources, dataSources) => {
1699
1708
  var generateImport = (name, from) => {
1700
1709
  return `import * as ${name} from '${from}'`;
1701
1710
  };
1711
+ var generateInstallFunction = (resources) => {
1712
+ return generateNamespace(resources, (name, _prop, indent) => {
1713
+ const typeName = name.toLowerCase();
1714
+ return `${tab(indent)}export namespace ${typeName} { export function install(props?: t.InstallProps): Promise<void> }`;
1715
+ });
1716
+ };
1702
1717
  var generatePropertyInputConst = (prop, indent) => {
1703
1718
  return generateValue(prop, {
1704
1719
  depth: 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terraforge/terraform",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "type": "module",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "scripts": {
17
17
  "build": "bunup src/index.ts --format esm --dts --clean --target node --packages external --out-dir ./dist",
18
- "prepublish": "bun run build",
18
+ "prepublishOnly": "bun run build",
19
19
  "test": "bun test"
20
20
  },
21
21
  "dependencies": {