@heroku/sdk 0.8.0 → 0.9.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.
@@ -0,0 +1,10 @@
1
+ import type { AddOn } from '@heroku/types/3.sdk';
2
+ import { ResourceCtx } from '../../../core/extend-resource.js';
3
+ /**
4
+ * Returns an arbitrary legacy database add-on based on the provided app name.
5
+ */
6
+ export declare function getArbitraryLegacyDB(ctx: Pick<ResourceCtx, 'platform'>, appIdentity: string): Promise<AddOn>;
7
+ export declare const getAddonService: () => string;
8
+ export declare const isPostgresAddon: (addon: AddOn) => boolean;
9
+ export declare const isAdvancedDatabase: (addon: AddOn) => boolean;
10
+ export declare const isLegacyDatabase: (addon: AddOn) => boolean;
@@ -0,0 +1,17 @@
1
+ import createDebug from 'debug';
2
+ const debug = createDebug('postgres-utils');
3
+ /**
4
+ * Returns an arbitrary legacy database add-on based on the provided app name.
5
+ */
6
+ export async function getArbitraryLegacyDB(ctx, appIdentity) {
7
+ debug(`fetching arbitrary legacy database on ${appIdentity}`);
8
+ const addons = await ctx.platform.addOn.listByApp(appIdentity);
9
+ const addon = addons.find(a => a.app.name === appIdentity && isLegacyDatabase(a));
10
+ if (!addon)
11
+ throw new Error(`No Heroku Postgres legacy database on ${appIdentity}`);
12
+ return addon;
13
+ }
14
+ export const getAddonService = () => process.env.HEROKU_POSTGRESQL_ADDON_NAME || process.env.HEROKU_DATA_SERVICE || 'heroku-postgresql';
15
+ export const isPostgresAddon = (addon) => addon.plan?.name?.split(':', 2)[0] === getAddonService();
16
+ export const isAdvancedDatabase = (addon) => isPostgresAddon(addon) && /^(advanced|performance)/.test(addon.plan?.name?.split(':', 2)[1] ?? '');
17
+ export const isLegacyDatabase = (addon) => isPostgresAddon(addon) && !isAdvancedDatabase(addon);
@@ -1,8 +1,13 @@
1
1
  import type { ResourceCtx } from '../../../core/extend-resource.js';
2
2
  import type { ResolveAddonAttachmentOptions, ResolvedAddOnAttachment } from '../../platform/add-on-attachment/resolve.js';
3
3
  export type ResolvedPgDatabase = ResolvedAddOnAttachment['addon'];
4
+ export type ResolvedPgDatabaseWithAttachment = {
5
+ addon: ResolvedPgDatabase;
6
+ attachment: ResolvedAddOnAttachment;
7
+ };
4
8
  export type ResolvePgDatabaseOptions = ResolveAddonAttachmentOptions & {
5
9
  appIdentity?: string;
10
+ includeAttachment?: boolean;
6
11
  input?: string;
7
12
  };
8
13
  /**
@@ -36,4 +41,7 @@ export type ResolvePgDatabaseOptions = ResolveAddonAttachmentOptions & {
36
41
  * from the underlying resolver. Throws if no input is given and no `appIdentity`
37
42
  * is available to default the attachment lookup to.
38
43
  */
44
+ export declare function resolvePgDatabase(ctx: Pick<ResourceCtx, 'platform'>, options: ResolvePgDatabaseOptions & {
45
+ includeAttachment: true;
46
+ }): Promise<ResolvedPgDatabaseWithAttachment>;
39
47
  export declare function resolvePgDatabase(ctx: Pick<ResourceCtx, 'platform'>, options?: ResolvePgDatabaseOptions): Promise<ResolvedPgDatabase>;
@@ -1,41 +1,11 @@
1
1
  import createDebug from 'debug';
2
2
  import { AddonAttachmentAmbiguousError, resolveAddonAttachment } from '../../platform/add-on-attachment/resolve.js';
3
+ import { getAddonService } from './postgres-utils.js';
3
4
  const debug = createDebug('heroku:sdk:resources:database');
4
5
  const DEFAULT_PG_ATTACHMENT = 'DATABASE_URL';
5
- const PG_ADDON_SERVICE = process.env.HEROKU_POSTGRESQL_ADDON_NAME ?? process.env.HEROKU_DATA_SERVICE ?? 'heroku-postgresql';
6
- /**
7
- * Resolve a Heroku Postgres database add-on from an attachment identity.
8
- *
9
- * `input` selects the attachment as follows:
10
- * - omitted → the `DATABASE_URL` attachment on `appIdentity`.
11
- * - `parent-app::attachment-or-config-var` (e.g. `my-app::DATABASE_URL`)
12
- * → an attachment or config var on `parent-app`.
13
- * - `parent-app::branch-name` (e.g. `my-app::my-branch`) → branch add-on
14
- * name on `parent-app`.
15
- * - Both `::` forms are handled the same way here: we split on the first
16
- * `::` ourselves and send `app`/`addon` as separate fields, which
17
- * works for either shape.
18
- * - any other string (attachment name, config var, UUID, or
19
- * globally-unique add-on name) → routed through `resolveAddonAttachment`.
20
- *
21
- * This function only uses the attachment resolver. To resolve a database
22
- * through the add-on resolve endpoint, call `resolveAddon` directly.
23
- *
24
- * The returned add-on is the identity nested on the attachment (`id`,
25
- * `name`, `app`, and the plan stub), not a full `ResolvedAddOn`. To get
26
- * that shape, call `resolveAddon` with the returned add-on's `id`.
27
- *
28
- * If the resolver finds multiple matches that all point at the same add-on
29
- * (same `addon.id`/attachment `app.id`) and whose own `_URL` config var
30
- * resolves to the same value on the app, they're treated as equivalent
31
- * (e.g. the same database attached under two names) rather than ambiguous.
32
- *
33
- * Throws `AddonAttachmentNotFoundError` (or `AddonAttachmentAmbiguousError`)
34
- * from the underlying resolver. Throws if no input is given and no `appIdentity`
35
- * is available to default the attachment lookup to.
36
- */
6
+ const PG_ADDON_SERVICE = getAddonService();
37
7
  export async function resolvePgDatabase(ctx, options = {}) {
38
- const { appIdentity, input, ...rest } = options;
8
+ const { appIdentity, includeAttachment, input, ...rest } = options;
39
9
  if (!input && !appIdentity) {
40
10
  throw new Error('resolvePgDatabase requires either input or appIdentity to default to DATABASE_URL.');
41
11
  }
@@ -44,22 +14,22 @@ export async function resolvePgDatabase(ctx, options = {}) {
44
14
  ? parseBranchReference(databaseReference, appIdentity)
45
15
  : { addon: databaseReference, app: appIdentity };
46
16
  debug('resolve input=%s addon=%s app=%s', input ?? '<default>', addon, app ?? '<global>');
17
+ let attachment;
47
18
  try {
48
- const attachment = await resolveAddonAttachment(ctx, app, addon, { ...rest, addonService: PG_ADDON_SERVICE });
49
- return attachment.addon;
19
+ attachment = await resolveAddonAttachment(ctx, app, addon, { ...rest, addonService: PG_ADDON_SERVICE });
50
20
  }
51
21
  catch (error) {
52
- if (error instanceof AddonAttachmentAmbiguousError) {
53
- const equivalent = collapseIfEquivalent(error.matches);
54
- if (equivalent) {
55
- const config = await ctx.platform.configVar.infoForApp(equivalent[0].app.name);
56
- if (allMatchSameUrl(equivalent, config)) {
57
- return equivalent[0].addon;
58
- }
59
- }
60
- }
61
- throw error;
22
+ if (!(error instanceof AddonAttachmentAmbiguousError))
23
+ throw error;
24
+ const equivalent = collapseIfEquivalent(error.matches);
25
+ if (!equivalent)
26
+ throw error;
27
+ const config = await ctx.platform.configVar.infoForApp(equivalent[0].app.name);
28
+ if (!allMatchSameUrl(equivalent, config))
29
+ throw error;
30
+ attachment = equivalent[0];
62
31
  }
32
+ return includeAttachment ? { addon: attachment.addon, attachment } : attachment.addon;
63
33
  }
64
34
  /**
65
35
  * Narrows ambiguous matches to a same-add-on group worth comparing by
@@ -1,8 +1,15 @@
1
- import type { BackupCreateResult, TransferInfoByAppResult } from '@heroku/types/data';
1
+ import type { TransferInfoByAppResult } from '@heroku/types/data';
2
2
  import type { ResourceCtx } from '../../../core/extend-resource.js';
3
3
  import type { ResolvedPgDatabase } from '../internal/resolve-pg-database.js';
4
- import type { WaitForTransferOptions } from '../wait-for-transfer.js';
4
+ import type { WaitForTransferOptions } from './wait-for-transfer.js';
5
5
  import { Poller } from '../../../utils/poller.js';
6
+ /**
7
+ * `data.backup.create`'s declared return type, `BackupCreateResult`, only
8
+ * lists `uuid`/`from_type`/`to_type`, but the actual response includes the
9
+ * full transfer record. Widen the type here so callers (e.g. `waitPoller`) can
10
+ * use the full transfer record.
11
+ */
12
+ export type BackupCreateInfo = TransferInfoByAppResult;
6
13
  export type CaptureAndWaitOptions = WaitForTransferOptions & {
7
14
  /**
8
15
  * Progress hooks fired once before capturing the backup `poller.onStart(addon)`
@@ -14,6 +21,6 @@ export type CaptureAndWaitOptions = WaitForTransferOptions & {
14
21
  * complete `poller.onStart(backup)` and once after the transfer
15
22
  * finishes successfully `poller.onStop(backup)`.
16
23
  */
17
- waitPoller?: Poller<BackupCreateResult>;
24
+ waitPoller?: Poller<BackupCreateInfo>;
18
25
  };
19
26
  export declare function captureAndWait(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, addonIdentity?: string, options?: CaptureAndWaitOptions): Promise<TransferInfoByAppResult>;
@@ -1,5 +1,5 @@
1
1
  import { resolvePgDatabase } from '../internal/resolve-pg-database.js';
2
- import { waitForTransfer } from '../wait-for-transfer.js';
2
+ import { waitForTransfer } from './wait-for-transfer.js';
3
3
  export async function captureAndWait(ctx, appIdentity, addonIdentity, options = {}) {
4
4
  const { capturePoller, signal, waitPoller } = options;
5
5
  signal?.throwIfAborted();
@@ -0,0 +1,11 @@
1
+ import type { CaptureAndWaitOptions } from './capture-and-wait.js';
2
+ import type { RestoreAndWaitOptions } from './restore-and-wait.js';
3
+ export { captureAndWait, type CaptureAndWaitOptions } from './capture-and-wait.js';
4
+ export { restoreAndWait, type RestoreAndWaitOptions } from './restore-and-wait.js';
5
+ export { transferExtensions, TransferFailedError, TransferTimeoutError, type WaitForTransferOptions, } from './wait-for-transfer.js';
6
+ export declare const restoreExtensions: import("../../../core/extend-resource.js").ResourceExtension<"data", "restore", {
7
+ restoreAndWait: (appIdentity: string, addonIdentity: string | undefined, backupUrl: string, options?: RestoreAndWaitOptions) => Promise<import("@heroku/types/data").TransferInfoByAppResult>;
8
+ }>;
9
+ export declare const backupExtensions: import("../../../core/extend-resource.js").ResourceExtension<"data", "backup", {
10
+ captureAndWait: (appIdentity: string, addonIdentity?: string, options?: CaptureAndWaitOptions) => Promise<import("@heroku/types/data").TransferInfoByAppResult>;
11
+ }>;
@@ -0,0 +1,12 @@
1
+ import { extendResource } from '../../../core/extend-resource.js';
2
+ import { captureAndWait } from './capture-and-wait.js';
3
+ import { restoreAndWait } from './restore-and-wait.js';
4
+ export { captureAndWait } from './capture-and-wait.js';
5
+ export { restoreAndWait } from './restore-and-wait.js';
6
+ export { transferExtensions, TransferFailedError, TransferTimeoutError, } from './wait-for-transfer.js';
7
+ export const restoreExtensions = extendResource('data', 'restore', ctx => ({
8
+ restoreAndWait: (appIdentity, addonIdentity, backupUrl, options) => restoreAndWait(ctx, appIdentity, addonIdentity, backupUrl, options),
9
+ }));
10
+ export const backupExtensions = extendResource('data', 'backup', ctx => ({
11
+ captureAndWait: (appIdentity, addonIdentity, options) => captureAndWait(ctx, appIdentity, addonIdentity, options),
12
+ }));
@@ -1,8 +1,15 @@
1
- import type { RestoreCreateResult, TransferInfoByAppResult } from '@heroku/types/data';
1
+ import type { TransferInfoByAppResult } from '@heroku/types/data';
2
2
  import type { ResourceCtx } from '../../../core/extend-resource.js';
3
3
  import type { ResolvedPgDatabase } from '../internal/resolve-pg-database.js';
4
- import type { WaitForTransferOptions } from '../wait-for-transfer.js';
4
+ import type { WaitForTransferOptions } from './wait-for-transfer.js';
5
5
  import { Poller } from '../../../utils/poller.js';
6
+ /**
7
+ * `data.restore.create`'s declared return type, `RestoreCreateResult`, only
8
+ * lists `uuid`/`from_type`/`to_type`, but the actual response includes the
9
+ * full transfer record. Widen the type here so callers (e.g. `waitPoller`) can
10
+ * use the full transfer record.
11
+ */
12
+ export type RestoreCreateInfo = TransferInfoByAppResult;
6
13
  export type RestoreAndWaitOptions = WaitForTransferOptions & {
7
14
  /**
8
15
  * Extension names to preinstall on the restore target.
@@ -19,6 +26,6 @@ export type RestoreAndWaitOptions = WaitForTransferOptions & {
19
26
  * complete `poller.onStart(restore)` and once after the restore
20
27
  * reaches a terminal state `poller.onStop(restore)`.
21
28
  */
22
- waitPoller?: Poller<RestoreCreateResult>;
29
+ waitPoller?: Poller<RestoreCreateInfo>;
23
30
  };
24
31
  export declare function restoreAndWait(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, addonIdentity: string | undefined, backupUrl: string, options?: RestoreAndWaitOptions): Promise<TransferInfoByAppResult>;
@@ -1,5 +1,5 @@
1
1
  import { resolvePgDatabase } from '../internal/resolve-pg-database.js';
2
- import { waitForTransfer } from '../wait-for-transfer.js';
2
+ import { waitForTransfer } from './wait-for-transfer.js';
3
3
  export async function restoreAndWait(ctx, appIdentity, addonIdentity, backupUrl, options = {}) {
4
4
  const { extensions, restorePoller, signal, waitPoller } = options;
5
5
  signal?.throwIfAborted();
@@ -1,5 +1,5 @@
1
1
  import type { TransferInfoByAppResult } from '@heroku/types/data';
2
- import type { ResourceCtx } from '../../core/extend-resource.js';
2
+ import type { ResourceCtx } from '../../../core/extend-resource.js';
3
3
  /**
4
4
  * Thrown by `waitForTransfer` when the transfer reaches a terminal state
5
5
  * with `succeeded: false`.
@@ -59,6 +59,6 @@ export type WaitForTransferOptions = {
59
59
  * if the transfer does not finish before timeout.
60
60
  */
61
61
  export declare function waitForTransfer(ctx: Pick<ResourceCtx, 'data'>, appIdentity: string, transferId: string, options?: WaitForTransferOptions): Promise<TransferInfoByAppResult>;
62
- export declare const transferExtensions: import("../../core/extend-resource.js").ResourceExtension<"data", "transfer", {
62
+ export declare const transferExtensions: import("../../../core/extend-resource.js").ResourceExtension<"data", "transfer", {
63
63
  waitForTransfer: (appIdentity: string, transferId: string, options?: WaitForTransferOptions) => Promise<TransferInfoByAppResult>;
64
64
  }>;
@@ -1,5 +1,5 @@
1
- import { extendResource } from '../../core/extend-resource.js';
2
- import { wait } from '../../utils/wait.js';
1
+ import { extendResource } from '../../../core/extend-resource.js';
2
+ import { wait } from '../../../utils/wait.js';
3
3
  const DEFAULT_INTERVAL_MS = 3000;
4
4
  const MAX_FAILURES = 20;
5
5
  /**
@@ -9,11 +9,11 @@ export type TransferSchedule = {
9
9
  export type TransferScheduleOptions = {
10
10
  signal?: AbortSignal;
11
11
  };
12
- export declare function list(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, addonIdentity?: string, options?: TransferScheduleOptions): Promise<TransferSchedule[]>;
12
+ export declare function list(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, options?: TransferScheduleOptions): Promise<TransferSchedule[]>;
13
13
  export declare function create(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, addonIdentity: string | undefined, body: TransferScheduleCreateOpts, options?: TransferScheduleOptions): Promise<TransferScheduleCreateResult>;
14
14
  export declare function del(ctx: Pick<ResourceCtx, 'data' | 'platform'>, appIdentity: string, addonIdentity: string | undefined, scheduleId: string, options?: TransferScheduleOptions): Promise<TransferScheduleDeleteResult>;
15
15
  export declare const transferScheduleExtensions: import("../../core/extend-resource.js").ResourceExtension<"data", "transferSchedule", {
16
16
  create: (appIdentity: string, addonIdentity: string | undefined, body: TransferScheduleCreateOpts, options?: TransferScheduleOptions) => Promise<TransferScheduleCreateResult>;
17
17
  delete: (appIdentity: string, addonIdentity: string | undefined, scheduleId: string, options?: TransferScheduleOptions) => Promise<TransferScheduleDeleteResult>;
18
- list: (appIdentity: string, addonIdentity?: string, options?: TransferScheduleOptions) => Promise<TransferSchedule[]>;
18
+ list: (appIdentity: string, options?: TransferScheduleOptions) => Promise<TransferSchedule[]>;
19
19
  }>;
@@ -1,14 +1,23 @@
1
1
  import { extendResource } from '../../core/extend-resource.js';
2
+ import { getArbitraryLegacyDB } from './internal/postgres-utils.js';
2
3
  import { resolvePgDatabase } from './internal/resolve-pg-database.js';
3
- export async function list(ctx, appIdentity, addonIdentity, options = {}) {
4
+ export async function list(ctx, appIdentity, options = {}) {
4
5
  options.signal?.throwIfAborted();
5
- const addon = await resolvePgDatabase(ctx, { appIdentity, input: addonIdentity, ...options });
6
+ // Schedules are app-scoped, so any legacy DB ID unlocks the app's list.
7
+ const addon = await getArbitraryLegacyDB(ctx, appIdentity);
6
8
  return ctx.data.transferSchedule.list(addon.id);
7
9
  }
8
10
  export async function create(ctx, appIdentity, addonIdentity, body, options = {}) {
9
11
  options.signal?.throwIfAborted();
10
- const addon = await resolvePgDatabase(ctx, { appIdentity, input: addonIdentity, ...options });
11
- return ctx.data.transferSchedule.create(addon.id, body);
12
+ const { addon, attachment } = await resolvePgDatabase(ctx, {
13
+ appIdentity, includeAttachment: true, input: addonIdentity, ...options,
14
+ });
15
+ let requestBody = body;
16
+ if (!requestBody.schedule_name) {
17
+ // eslint-disable-next-line camelcase
18
+ requestBody = { ...body, schedule_name: `${attachment.name}_URL` };
19
+ }
20
+ return ctx.data.transferSchedule.create(addon.id, requestBody);
12
21
  }
13
22
  export async function del(ctx, appIdentity, addonIdentity, scheduleId, options = {}) {
14
23
  options.signal?.throwIfAborted();
@@ -18,5 +27,5 @@ export async function del(ctx, appIdentity, addonIdentity, scheduleId, options =
18
27
  export const transferScheduleExtensions = extendResource('data', 'transferSchedule', ctx => ({
19
28
  create: (appIdentity, addonIdentity, body, options) => create(ctx, appIdentity, addonIdentity, body, options),
20
29
  delete: (appIdentity, addonIdentity, scheduleId, options) => del(ctx, appIdentity, addonIdentity, scheduleId, options),
21
- list: (appIdentity, addonIdentity, options) => list(ctx, appIdentity, addonIdentity, options),
30
+ list: (appIdentity, options) => list(ctx, appIdentity, options),
22
31
  }));
@@ -1,8 +1,6 @@
1
- export { backupExtensions } from '../data/backup/index.js';
2
1
  export { databaseExtensions } from '../data/database.js';
3
2
  export { maintenanceExtensions } from '../data/maintenance.js';
4
3
  export { postgresDatabaseExtensions } from '../data/postgres-database.js';
5
4
  export { redisExtensions } from '../data/redis/index.js';
6
- export { restoreExtensions } from '../data/restore/index.js';
7
5
  export { type TransferSchedule, transferScheduleExtensions } from '../data/transfer-schedule.js';
8
- export { transferExtensions, TransferFailedError, TransferTimeoutError, } from '../data/wait-for-transfer.js';
6
+ export { backupExtensions, type CaptureAndWaitOptions, type RestoreAndWaitOptions, restoreExtensions, transferExtensions, TransferFailedError, TransferTimeoutError, type WaitForTransferOptions, } from '../data/transfer/index.js';
@@ -1,8 +1,6 @@
1
- export { backupExtensions } from '../data/backup/index.js';
2
1
  export { databaseExtensions } from '../data/database.js';
3
2
  export { maintenanceExtensions } from '../data/maintenance.js';
4
3
  export { postgresDatabaseExtensions } from '../data/postgres-database.js';
5
4
  export { redisExtensions } from '../data/redis/index.js';
6
- export { restoreExtensions } from '../data/restore/index.js';
7
5
  export { transferScheduleExtensions } from '../data/transfer-schedule.js';
8
- export { transferExtensions, TransferFailedError, TransferTimeoutError, } from '../data/wait-for-transfer.js';
6
+ export { backupExtensions, restoreExtensions, transferExtensions, TransferFailedError, TransferTimeoutError, } from '../data/transfer/index.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heroku/sdk",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Heroku SDK",
5
5
  "author": "Heroku",
6
6
  "type": "module",
@@ -102,17 +102,13 @@
102
102
  "types": "./dist/resources/platform/vpn-connection/index.d.ts",
103
103
  "default": "./dist/resources/platform/vpn-connection/index.js"
104
104
  },
105
- "./resources/data/backup": {
106
- "types": "./dist/resources/data/backup/index.d.ts",
107
- "default": "./dist/resources/data/backup/index.js"
108
- },
109
105
  "./resources/data/redis": {
110
106
  "types": "./dist/resources/data/redis/index.d.ts",
111
107
  "default": "./dist/resources/data/redis/index.js"
112
108
  },
113
- "./resources/data/restore": {
114
- "types": "./dist/resources/data/restore/index.d.ts",
115
- "default": "./dist/resources/data/restore/index.js"
109
+ "./resources/data/transfer": {
110
+ "types": "./dist/resources/data/transfer/index.d.ts",
111
+ "default": "./dist/resources/data/transfer/index.js"
116
112
  },
117
113
  "./resources/*": {
118
114
  "types": "./dist/resources/*.d.ts",
@@ -1,5 +0,0 @@
1
- import type { CaptureAndWaitOptions } from './capture-and-wait.js';
2
- export { captureAndWait, type CaptureAndWaitOptions } from './capture-and-wait.js';
3
- export declare const backupExtensions: import("../../../core/extend-resource.js").ResourceExtension<"data", "backup", {
4
- captureAndWait: (appIdentity: string, addonIdentity?: string, options?: CaptureAndWaitOptions) => Promise<import("@heroku/types/data").TransferInfoByAppResult>;
5
- }>;
@@ -1,6 +0,0 @@
1
- import { extendResource } from '../../../core/extend-resource.js';
2
- import { captureAndWait } from './capture-and-wait.js';
3
- export { captureAndWait } from './capture-and-wait.js';
4
- export const backupExtensions = extendResource('data', 'backup', ctx => ({
5
- captureAndWait: (appIdentity, addonIdentity, options) => captureAndWait(ctx, appIdentity, addonIdentity, options),
6
- }));
@@ -1,5 +0,0 @@
1
- import type { RestoreAndWaitOptions } from './restore-and-wait.js';
2
- export { restoreAndWait, type RestoreAndWaitOptions } from './restore-and-wait.js';
3
- export declare const restoreExtensions: import("../../../core/extend-resource.js").ResourceExtension<"data", "restore", {
4
- restoreAndWait: (appIdentity: string, addonIdentity: string | undefined, backupUrl: string, options?: RestoreAndWaitOptions) => Promise<import("@heroku/types/data").TransferInfoByAppResult>;
5
- }>;
@@ -1,6 +0,0 @@
1
- import { extendResource } from '../../../core/extend-resource.js';
2
- import { restoreAndWait } from './restore-and-wait.js';
3
- export { restoreAndWait } from './restore-and-wait.js';
4
- export const restoreExtensions = extendResource('data', 'restore', ctx => ({
5
- restoreAndWait: (appIdentity, addonIdentity, backupUrl, options) => restoreAndWait(ctx, appIdentity, addonIdentity, backupUrl, options),
6
- }));