@terraforge/terraform 0.0.20 → 0.0.22

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/dist/index.d.mts CHANGED
@@ -191,6 +191,17 @@ type GetDataProps<T = State> = {
191
191
  type: string;
192
192
  state: T;
193
193
  };
194
+ type RefreshResourceProps<T = State> = {
195
+ type: string;
196
+ priorInputState: T;
197
+ priorOutputState: T;
198
+ };
199
+ type RefreshResourceResult<T = State> = {
200
+ kind: 'unchanged' | 'updated';
201
+ state: T;
202
+ } | {
203
+ kind: 'deleted';
204
+ };
194
205
  interface Provider {
195
206
  ownResource(id: string): boolean;
196
207
  getResource(props: GetProps): Promise<{
@@ -214,6 +225,7 @@ interface Provider {
214
225
  getData?(props: GetDataProps): Promise<{
215
226
  state: State;
216
227
  }>;
228
+ refreshResource?(props: RefreshResourceProps): Promise<RefreshResourceResult | undefined>;
217
229
  destroy?(): Promise<void>;
218
230
  }
219
231
  //#endregion
@@ -284,6 +296,20 @@ declare class TerraformProvider implements Provider {
284
296
  }: GetDataProps): Promise<{
285
297
  state: State$1;
286
298
  }>;
299
+ refreshResource({
300
+ type,
301
+ priorInputState,
302
+ priorOutputState
303
+ }: RefreshResourceProps): Promise<{
304
+ kind: "deleted";
305
+ state?: undefined;
306
+ } | {
307
+ kind: "unchanged";
308
+ state: State$1;
309
+ } | {
310
+ kind: "updated";
311
+ state: State$1;
312
+ }>;
287
313
  }
288
314
  //#endregion
289
315
  //#region src/plugin/registry.d.ts
package/dist/index.mjs CHANGED
@@ -217,6 +217,16 @@ const generateValue = (prop, ctx) => {
217
217
 
218
218
  //#endregion
219
219
  //#region src/provider.ts
220
+ const areStatesEqual = (left, right) => {
221
+ const replacer = (_, value) => {
222
+ if (value !== null && value instanceof Object && !Array.isArray(value)) return Object.keys(value).sort().reduce((sorted, key) => {
223
+ sorted[key] = value[key];
224
+ return sorted;
225
+ }, {});
226
+ return value;
227
+ };
228
+ return JSON.stringify(left, replacer) === JSON.stringify(right, replacer);
229
+ };
220
230
  var TerraformProvider = class {
221
231
  configured;
222
232
  plugin;
@@ -305,6 +315,24 @@ var TerraformProvider = class {
305
315
  if (!data) throw new Error(`Data source not found ${type}`);
306
316
  return { state: data };
307
317
  }
318
+ async refreshResource({ type, priorInputState, priorOutputState }) {
319
+ const plugin = await this.configure();
320
+ const refreshedState = await plugin.readResource(type, priorOutputState);
321
+ if (!refreshedState) return { kind: "deleted" };
322
+ const mergedState = {
323
+ ...refreshedState,
324
+ ...priorInputState
325
+ };
326
+ const { requiresReplace, plannedState } = await plugin.planResourceChange(type, refreshedState, mergedState, priorInputState);
327
+ if (requiresReplace.length === 0 && areStatesEqual(plannedState, refreshedState)) return {
328
+ kind: "unchanged",
329
+ state: refreshedState
330
+ };
331
+ return {
332
+ kind: "updated",
333
+ state: refreshedState
334
+ };
335
+ }
308
336
  };
309
337
 
310
338
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terraforge/terraform",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",