@zapier/zapier-sdk 0.46.1 → 0.47.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @zapier/zapier-sdk
2
2
 
3
+ ## 0.47.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 4ab820a: Skip the approval `poll_url` and `approval_url` origin checks when `baseUrl` (or `ZAPIER_BASE_URL`) points at `localhost` / `127.0.0.1`. Local dev runs sdkapi, approvalsapi, and the approval frontend on different ports, so the origin pin can never match. The check is intended to stop a compromised sdkapi from redirecting bearer-token traffic to an attacker host — a threat that doesn't apply when the developer owns every service on the machine.
8
+
9
+ ## 0.47.0
10
+
11
+ ### Minor Changes
12
+
13
+ - e45ce2f: Add `composePlugins(...subPlugins)` for bundling N plugins into a single `Plugin<TSdk, TProvides>` so a consumer can call `addPlugin(combined)` once. Bag-mode composition: throws on duplicate root keys or duplicate `context.meta` keys, intersects each sub-plugin's TSdk requirements, and flows through the existing single-plugin `addPlugin` without the type-widening an array overload would impose.
14
+
15
+ ## 0.46.2
16
+
17
+ ### Patch Changes
18
+
19
+ - fcb47ea: Set npm package homepage links to public SDK documentation.
20
+
3
21
  ## 0.46.1
4
22
 
5
23
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAqiCjB,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,SAW3D,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAgjCjB,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,SAW3D,CAAC"}
@@ -8,7 +8,7 @@ import { getAuthorizationHeader } from "./auth";
8
8
  import { createDebugLogger, createDebugFetch } from "./debug";
9
9
  import { pollUntilComplete } from "./polling";
10
10
  import { resolveAuthToken, invalidateCredentialsToken, isCliLoginAvailable, } from "../auth";
11
- import { getZapierBaseUrl } from "../utils/url-utils";
11
+ import { getZapierBaseUrl, isLocalhostBaseUrl } from "../utils/url-utils";
12
12
  import { sleep, calculateExponentialBackoffMs } from "../utils/retry-utils";
13
13
  import { isPlainObject } from "../utils/type-guard-utils";
14
14
  import { ZapierApiError, ZapierApprovalError, ZapierAuthenticationError, ZapierTimeoutError, ZapierValidationError, ZapierResourceNotFoundError, ZapierRateLimitError, } from "../types/errors";
@@ -711,8 +711,15 @@ class ZapierApiClient {
711
711
  throw new ZapierApiError(`Approval ${label} origin ${parsed.origin} does not match expected ${expectedOrigin}`, { statusCode: approvalResponse.status, response: body });
712
712
  }
713
713
  };
714
- assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
715
- assertApprovalOrigin(approval.approval_url, browserOrigin, "approval_url");
714
+ // In local dev the SDK API, approvalsapi, and approval frontend run on
715
+ // different localhost ports, so neither origin can match. The check
716
+ // exists to stop a compromised sdkapi from redirecting bearer-token
717
+ // traffic to an attacker host — that threat model doesn't apply when
718
+ // the dev owns every service on the machine.
719
+ if (!isLocalhostBaseUrl(this.options.baseUrl)) {
720
+ assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
721
+ assertApprovalOrigin(approval.approval_url, browserOrigin, "approval_url");
722
+ }
716
723
  this.emitEvent("approval:required", {
717
724
  approvalId: approval.approval_id,
718
725
  approvalUrl: approval.approval_url,
package/dist/index.cjs CHANGED
@@ -970,6 +970,63 @@ function createPaginatedPluginMethod(sdk, config) {
970
970
  }
971
971
  };
972
972
  }
973
+ function mergeRootKeysWithCollisionCheck(target, source, seen) {
974
+ for (const key of Object.keys(source)) {
975
+ if (seen.has(key)) {
976
+ throw new Error(
977
+ `composePlugins: duplicate root key "${key}". Plugins composed in the same call must register distinct method names.`
978
+ );
979
+ }
980
+ seen.add(key);
981
+ target[key] = source[key];
982
+ }
983
+ }
984
+ function mergeMetaKeysWithCollisionCheck(target, source, seen) {
985
+ for (const key of Object.keys(source)) {
986
+ if (seen.has(key)) {
987
+ throw new Error(
988
+ `composePlugins: duplicate context.meta key "${key}". Two sub-plugins registered metadata for the same name.`
989
+ );
990
+ }
991
+ seen.add(key);
992
+ target[key] = source[key];
993
+ }
994
+ }
995
+ function mergeContextKeysWithCollisionCheck(target, source, seen) {
996
+ for (const key of Object.keys(source)) {
997
+ if (seen.has(key)) {
998
+ throw new Error(
999
+ `composePlugins: duplicate context key "${key}". Two sub-plugins contributed the same context.${key} field.`
1000
+ );
1001
+ }
1002
+ seen.add(key);
1003
+ target[key] = source[key];
1004
+ }
1005
+ }
1006
+ function composePlugins(...plugins) {
1007
+ return (sdk) => {
1008
+ const merged = { context: { meta: {} } };
1009
+ const seenRoot = /* @__PURE__ */ new Set();
1010
+ const seenMeta = /* @__PURE__ */ new Set();
1011
+ const seenContext = /* @__PURE__ */ new Set();
1012
+ for (const plugin of plugins) {
1013
+ const { context, ...rootKeys } = plugin(sdk);
1014
+ mergeRootKeysWithCollisionCheck(merged, rootKeys, seenRoot);
1015
+ if (context) {
1016
+ const { meta, ...nonMetaContext } = context;
1017
+ if (meta) {
1018
+ mergeMetaKeysWithCollisionCheck(merged.context.meta, meta, seenMeta);
1019
+ }
1020
+ mergeContextKeysWithCollisionCheck(
1021
+ merged.context,
1022
+ nonMetaContext,
1023
+ seenContext
1024
+ );
1025
+ }
1026
+ }
1027
+ return merged;
1028
+ };
1029
+ }
973
1030
  function getStringProperty(obj, key) {
974
1031
  if (typeof obj === "object" && obj !== null && key in obj) {
975
1032
  const value = obj[key];
@@ -5150,6 +5207,17 @@ function getZapierBaseUrl(baseUrl) {
5150
5207
  return void 0;
5151
5208
  }
5152
5209
  }
5210
+ function isLocalhostBaseUrl(baseUrl) {
5211
+ if (!baseUrl) {
5212
+ return false;
5213
+ }
5214
+ try {
5215
+ const { hostname } = new URL(baseUrl);
5216
+ return hostname === "localhost" || hostname === "127.0.0.1";
5217
+ } catch {
5218
+ return false;
5219
+ }
5220
+ }
5153
5221
  function getTrackingBaseUrl({
5154
5222
  trackingBaseUrl,
5155
5223
  baseUrl
@@ -5563,7 +5631,7 @@ async function invalidateCredentialsToken(options) {
5563
5631
  }
5564
5632
 
5565
5633
  // src/sdk-version.ts
5566
- var SDK_VERSION = (typeof process !== "undefined" && process.env ? "0.46.1" : void 0) || "unknown";
5634
+ var SDK_VERSION = (typeof process !== "undefined" && process.env ? "0.47.1" : void 0) || "unknown";
5567
5635
 
5568
5636
  // src/utils/open-url.ts
5569
5637
  var nodePrefix = "node:";
@@ -6229,8 +6297,14 @@ var ZapierApiClient = class {
6229
6297
  );
6230
6298
  }
6231
6299
  };
6232
- assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
6233
- assertApprovalOrigin(approval.approval_url, browserOrigin, "approval_url");
6300
+ if (!isLocalhostBaseUrl(this.options.baseUrl)) {
6301
+ assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
6302
+ assertApprovalOrigin(
6303
+ approval.approval_url,
6304
+ browserOrigin,
6305
+ "approval_url"
6306
+ );
6307
+ }
6234
6308
  this.emitEvent("approval:required", {
6235
6309
  approvalId: approval.approval_id,
6236
6310
  approvalUrl: approval.approval_url
@@ -8574,6 +8648,7 @@ exports.buildMethodCalledEvent = buildMethodCalledEvent;
8574
8648
  exports.clearTokenCache = clearTokenCache;
8575
8649
  exports.clientCredentialsNameResolver = clientCredentialsNameResolver;
8576
8650
  exports.clientIdResolver = clientIdResolver;
8651
+ exports.composePlugins = composePlugins;
8577
8652
  exports.connectionIdGenericResolver = connectionIdGenericResolver;
8578
8653
  exports.connectionIdResolver = connectionIdResolver;
8579
8654
  exports.connectionsPlugin = connectionsPlugin;
package/dist/index.d.mts CHANGED
@@ -8467,6 +8467,81 @@ declare function createPaginatedPluginMethod<const TName extends string, TSdk ex
8467
8467
  }, TInput, TResponse extends {
8468
8468
  data: unknown[];
8469
8469
  }>(sdk: TSdk, config: PaginatedPluginMethodConfig<TSdk, TInput, TResponse, TName>): PaginatedPluginMethodReturn<TName, TInput, ItemOf<TResponse>>;
8470
+ /**
8471
+ * Maps a tuple of plugins to a tuple of their TSdk requirement types.
8472
+ *
8473
+ * SdkRequirementsOf<[Plugin<{ api }, _>, Plugin<{ options }, _>]>
8474
+ * = [{ api }, { options }]
8475
+ */
8476
+ type SdkRequirementsOf<T extends readonly Plugin<any, any>[]> = {
8477
+ [K in keyof T]: T[K] extends Plugin<infer Sdk, any> ? Sdk : never;
8478
+ };
8479
+ /**
8480
+ * Maps a tuple of plugins to a tuple of their TProvides output types.
8481
+ *
8482
+ * ProvidesOf<[Plugin<_, { hello }>, Plugin<_, { goodbye }>]>
8483
+ * = [{ hello }, { goodbye }]
8484
+ */
8485
+ type ProvidesOf<T extends readonly Plugin<any, any>[]> = {
8486
+ [K in keyof T]: T[K] extends Plugin<any, infer Provides> ? Provides : never;
8487
+ };
8488
+ /**
8489
+ * Intersects every member of a tuple into a single combined type. The
8490
+ * result is an object that has every property of every member at once.
8491
+ *
8492
+ * IntersectAll<[{ api }, { options }]> = { api } & { options }
8493
+ * IntersectAll<[]> = {}
8494
+ *
8495
+ * Walks recursively: head & IntersectAll<tail>, base case is the empty
8496
+ * tuple. Why intersection (`&`) and not union (`|`): the composed plugin
8497
+ * must require ALL of the sub-plugins' needs at once — an SDK that has
8498
+ * both `api` AND `options` — not "either api or options."
8499
+ */
8500
+ type IntersectAll<T extends readonly unknown[]> = T extends readonly [
8501
+ infer Head,
8502
+ ...infer Tail
8503
+ ] ? Head & IntersectAll<Tail> : {};
8504
+ /**
8505
+ * The TSdk a composed plugin requires: every sub-plugin's TSdk requirement,
8506
+ * all at once. Composing a plugin that needs `{ api }` with one that needs
8507
+ * `{ options }` yields a composed plugin that needs `{ api } & { options }`.
8508
+ */
8509
+ type ComposeSdk<T extends readonly Plugin<any, any>[]> = IntersectAll<SdkRequirementsOf<T>>;
8510
+ /**
8511
+ * What a composed plugin provides: every sub-plugin's TProvides combined.
8512
+ * Composing a plugin that provides `{ hello }` with one that provides
8513
+ * `{ goodbye }` yields `{ hello } & { goodbye }`.
8514
+ */
8515
+ type ComposeProvides<T extends readonly Plugin<any, any>[]> = IntersectAll<ProvidesOf<T>>;
8516
+ /**
8517
+ * Bundle N plugins into a single plugin so a consumer can call
8518
+ * `addPlugin(combined)` once. Use this when an extension package wants to
8519
+ * expose granular sub-plugins for tree-shaking *and* a one-call convenience
8520
+ * entry point.
8521
+ *
8522
+ * Three commitments (per the boilerplate-reduction design):
8523
+ * 1. **Bag mode.** Sub-plugins must not depend on each other; order is
8524
+ * irrelevant. If you need pipeline composition (later sub-plugins
8525
+ * reading earlier sub-plugins' outputs), use a regular `definePlugin`
8526
+ * callback that calls each `createPluginMethod` in turn.
8527
+ * 2. **Over-approximation of TSdk.** The composed plugin requires the
8528
+ * intersection of every sub-plugin's requirements (all of them, all at
8529
+ * once). Works fine for homogeneous-deps groups; widens slightly for
8530
+ * heterogeneous ones, which keeps the variadic types tractable.
8531
+ * 3. **Collision detection.** Throws on duplicate root keys, duplicate
8532
+ * `context.meta` keys, and duplicate non-meta `context.*` keys. Note
8533
+ * this only applies *inside* a single `composePlugins(...)` call —
8534
+ * cross-`addPlugin` overrides (e.g. a CLI plugin overriding meta from
8535
+ * a core SDK plugin) still go through `addPlugin`'s last-write-wins
8536
+ * merge unchanged.
8537
+ *
8538
+ * Why prefer this over an `addPlugin([...])` array overload: TypeScript's
8539
+ * overload resolution interacts badly with arrays carrying a mix of
8540
+ * `TProvides` shapes — chained inference downstream of `addPlugin([...])`
8541
+ * tends to widen and lose individual method types. A single composed
8542
+ * plugin flows through the existing single-plugin `addPlugin` cleanly.
8543
+ */
8544
+ declare function composePlugins<const Ts extends readonly Plugin<any, any>[]>(...plugins: Ts): Plugin<ComposeSdk<Ts>, ComposeProvides<Ts>>;
8470
8545
 
8471
8546
  /**
8472
8547
  * @deprecated `getRegistry` is now built into every sdk produced by
@@ -8479,4 +8554,4 @@ declare const registryPlugin: (sdk: {
8479
8554
  };
8480
8555
  }) => {};
8481
8556
 
8482
- export { type Action, type ActionEntry, type ActionExecutionOptions, type ActionExecutionResult, type ActionField, type ActionFieldChoice, type ActionItem$1 as ActionItem, type ActionKeyProperty, ActionKeyPropertySchema, type ActionProperty, ActionPropertySchema, type ActionItem as ActionResolverItem, type ActionTimeoutMsProperty, ActionTimeoutMsPropertySchema, type ActionTypeItem, type ActionTypeProperty, ActionTypePropertySchema, type AddActionEntryOptions, type AddActionEntryResult, type ApiError, type ApiEvent, type ApiPluginOptions, type ApiPluginProvides, type App, type AppFactoryInput, type AppItem, type AppKeyProperty, AppKeyPropertySchema, type AppProperty, AppPropertySchema, type ApplicationLifecycleEventData, type ApprovalStatus, type AppsPluginProvides, type AppsProperty, AppsPropertySchema, type ArrayResolver, type AuthEvent, type AuthenticationIdProperty, AuthenticationIdPropertySchema, type BaseEvent, BaseSdkOptionsSchema, type BatchOptions, CONTEXT_CACHE_MAX_SIZE, CONTEXT_CACHE_TTL_MS, type Choice, type ClientCredentialsObject, ClientCredentialsObjectSchema, type Connection, type ConnectionEntry, ConnectionEntrySchema, type ConnectionIdProperty, ConnectionIdPropertySchema, type ConnectionItem, type ConnectionProperty, ConnectionPropertySchema, type ConnectionsMap, ConnectionsMapSchema, type ConnectionsPluginProvides, type ConnectionsProperty, ConnectionsPropertySchema, type ConnectionsResponse, type CreateClientCredentialsPluginProvides, type CreateTableFieldsPluginProvides, type CreateTablePluginProvides, type CreateTableRecordsPluginProvides, type Credentials, type CredentialsFunction, CredentialsFunctionSchema, type CredentialsObject, CredentialsObjectSchema, CredentialsSchema, DEFAULT_ACTION_TIMEOUT_MS, DEFAULT_APPROVAL_TIMEOUT_MS, DEFAULT_CONFIG_PATH, DEFAULT_MAX_APPROVAL_RETRIES, DEFAULT_PAGE_SIZE, type DebugProperty, DebugPropertySchema, type DeleteClientCredentialsPluginProvides, type DeleteTableFieldsPluginProvides, type DeleteTablePluginProvides, type DeleteTableRecordsPluginProvides, type DynamicResolver, type EnhancedErrorEventData, type ErrorOptions, type EventCallback, type EventContext, type EventEmissionContext, type EventEmissionProvides, type FetchPluginProvides, type Field, type FieldsProperty, FieldsPropertySchema, type FieldsResolver, type FieldsetItem, type FindFirstAuthenticationPluginProvides, type FindFirstConnectionPluginProvides, type FindUniqueAuthenticationPluginProvides, type FindUniqueConnectionPluginProvides, type FormatMetadata, type FormattedItem, type FunctionDeprecation, type FunctionOptions, type FunctionRegistryEntry, type GetActionPluginProvides, type GetAppPluginProvides, type GetAuthenticationPluginProvides, type GetConnectionPluginProvides, type GetProfilePluginProvides, type GetTablePluginProvides, type GetTableRecordPluginProvides, type InfoFieldItem, type InputFieldItem, type InputFieldProperty, InputFieldPropertySchema, type InputsProperty, InputsPropertySchema, type LimitProperty, LimitPropertySchema, type ListActionsPluginProvides, type ListAppsPluginProvides, type ListAuthenticationsPluginProvides, type ListClientCredentialsPluginProvides, type ListConnectionsPluginProvides, type ListInputFieldsPluginProvides, type ListTableFieldsPluginProvides, type ListTableRecordsPluginProvides, type ListTablesPluginProvides, type LoadingEvent, MAX_PAGE_LIMIT, type Manifest, type ManifestEntry, type ManifestPluginOptions, type ManifestPluginProvides, type MethodCalledEvent, type MethodCalledEventData, type Need, type NeedsRequest, type NeedsResponse, type OffsetProperty, OffsetPropertySchema, type OutputFormatter, type OutputProperty, OutputPropertySchema, type PaginatedSdkFunction, type PaginatedSdkResult, type ParamsProperty, ParamsPropertySchema, type PkceCredentialsObject, PkceCredentialsObjectSchema, type Plugin, type PluginMeta, type PluginProvides, type PositionalMetadata, type RateLimitInfo, type RecordProperty, RecordPropertySchema, type RecordsProperty, RecordsPropertySchema, RelayFetchSchema, RelayRequestSchema, type RequestPluginProvides, type ResolveAuthTokenOptions, type ResolveCredentialsOptions, type ResolvedAppLocator, type ResolvedCredentials, ResolvedCredentialsSchema, type Resolver, type ResolverMetadata, type RootFieldItem, type RunActionPluginProvides, type SdkEvent, type SdkPage, type StaticResolver, type TableProperty, TablePropertySchema, type TablesProperty, TablesPropertySchema, type UpdateManifestEntryOptions, type UpdateManifestEntryResult, type UpdateTableRecordsPluginProvides, type UserProfile, type UserProfileItem, type WithAddPlugin, ZAPIER_BASE_URL, ZAPIER_MAX_NETWORK_RETRIES, ZAPIER_MAX_NETWORK_RETRY_DELAY_MS, ZapierActionError, ZapierApiError, ZapierAppNotFoundError, ZapierApprovalError, ZapierAuthenticationError, ZapierBundleError, type ZapierCache, type ZapierCacheEntry, type ZapierCacheSetOptions, ZapierConfigurationError, ZapierError, type ZapierFetchInitOptions, ZapierNotFoundError, ZapierRateLimitError, ZapierRelayError, ZapierResourceNotFoundError, type ZapierSdk, type ZapierSdkApps, type ZapierSdkOptions, ZapierTimeoutError, ZapierUnknownError, ZapierValidationError, actionKeyResolver, actionTypeResolver, apiPlugin, appKeyResolver, appsPlugin, connectionIdGenericResolver as authenticationIdGenericResolver, connectionIdResolver as authenticationIdResolver, batch, buildApplicationLifecycleEvent, buildCapabilityMessage, buildErrorEvent, buildErrorEventWithContext, buildMethodCalledEvent, clearTokenCache, clientCredentialsNameResolver, clientIdResolver, connectionIdGenericResolver, connectionIdResolver, connectionsPlugin, createBaseEvent, createClientCredentialsPlugin, createFunction, createMemoryCache, createOptionsPlugin, createPaginatedPluginMethod, createPluginMethod, createSdk, createTableFieldsPlugin, createTablePlugin, createTableRecordsPlugin, createZapierSdk, createZapierSdkWithoutRegistry, definePlugin, deleteClientCredentialsPlugin, deleteTableFieldsPlugin, deleteTablePlugin, deleteTableRecordsPlugin, fetchPlugin, findFirstConnectionPlugin, findManifestEntry, findUniqueConnectionPlugin, formatErrorMessage, generateEventId, getActionPlugin, getAppPlugin, getBaseUrlFromCredentials, getCiPlatform, getClientIdFromCredentials, getConnectionPlugin, getCpuTime, getCurrentTimestamp, getMemoryUsage, getOsInfo, getPlatformVersions, getPreferredManifestEntryKey, getProfilePlugin, getReleaseId, getTablePlugin, getTableRecordPlugin, getTokenFromCliLogin, getZapierApprovalMode, getZapierIsInteractive, getZapierSdkService, injectCliLogin, inputFieldKeyResolver, inputsAllOptionalResolver, inputsResolver, invalidateCachedToken, invalidateCredentialsToken, isCi, isCliLoginAvailable, isClientCredentials, isCredentialsFunction, isCredentialsObject, isPkceCredentials, isPositional, listActionsPlugin, listAppsPlugin, listClientCredentialsPlugin, listConnectionsPlugin, listInputFieldsPlugin, listTableFieldsPlugin, listTableRecordsPlugin, listTablesPlugin, logDeprecation, manifestPlugin, readManifestFromFile, registryPlugin, requestPlugin, resetDeprecationWarnings, resolveAuthToken, resolveCredentials, resolveCredentialsFromEnv, runActionPlugin, runWithTelemetryContext, tableFieldIdsResolver, tableFieldsResolver, tableFiltersResolver, tableIdResolver, tableNameResolver, tableRecordIdResolver, tableRecordIdsResolver, tableRecordsResolver, tableSortResolver, tableUpdateRecordsResolver, toSnakeCase, toTitleCase, updateTableRecordsPlugin };
8557
+ export { type Action, type ActionEntry, type ActionExecutionOptions, type ActionExecutionResult, type ActionField, type ActionFieldChoice, type ActionItem$1 as ActionItem, type ActionKeyProperty, ActionKeyPropertySchema, type ActionProperty, ActionPropertySchema, type ActionItem as ActionResolverItem, type ActionTimeoutMsProperty, ActionTimeoutMsPropertySchema, type ActionTypeItem, type ActionTypeProperty, ActionTypePropertySchema, type AddActionEntryOptions, type AddActionEntryResult, type ApiError, type ApiEvent, type ApiPluginOptions, type ApiPluginProvides, type App, type AppFactoryInput, type AppItem, type AppKeyProperty, AppKeyPropertySchema, type AppProperty, AppPropertySchema, type ApplicationLifecycleEventData, type ApprovalStatus, type AppsPluginProvides, type AppsProperty, AppsPropertySchema, type ArrayResolver, type AuthEvent, type AuthenticationIdProperty, AuthenticationIdPropertySchema, type BaseEvent, BaseSdkOptionsSchema, type BatchOptions, CONTEXT_CACHE_MAX_SIZE, CONTEXT_CACHE_TTL_MS, type Choice, type ClientCredentialsObject, ClientCredentialsObjectSchema, type Connection, type ConnectionEntry, ConnectionEntrySchema, type ConnectionIdProperty, ConnectionIdPropertySchema, type ConnectionItem, type ConnectionProperty, ConnectionPropertySchema, type ConnectionsMap, ConnectionsMapSchema, type ConnectionsPluginProvides, type ConnectionsProperty, ConnectionsPropertySchema, type ConnectionsResponse, type CreateClientCredentialsPluginProvides, type CreateTableFieldsPluginProvides, type CreateTablePluginProvides, type CreateTableRecordsPluginProvides, type Credentials, type CredentialsFunction, CredentialsFunctionSchema, type CredentialsObject, CredentialsObjectSchema, CredentialsSchema, DEFAULT_ACTION_TIMEOUT_MS, DEFAULT_APPROVAL_TIMEOUT_MS, DEFAULT_CONFIG_PATH, DEFAULT_MAX_APPROVAL_RETRIES, DEFAULT_PAGE_SIZE, type DebugProperty, DebugPropertySchema, type DeleteClientCredentialsPluginProvides, type DeleteTableFieldsPluginProvides, type DeleteTablePluginProvides, type DeleteTableRecordsPluginProvides, type DynamicResolver, type EnhancedErrorEventData, type ErrorOptions, type EventCallback, type EventContext, type EventEmissionContext, type EventEmissionProvides, type FetchPluginProvides, type Field, type FieldsProperty, FieldsPropertySchema, type FieldsResolver, type FieldsetItem, type FindFirstAuthenticationPluginProvides, type FindFirstConnectionPluginProvides, type FindUniqueAuthenticationPluginProvides, type FindUniqueConnectionPluginProvides, type FormatMetadata, type FormattedItem, type FunctionDeprecation, type FunctionOptions, type FunctionRegistryEntry, type GetActionPluginProvides, type GetAppPluginProvides, type GetAuthenticationPluginProvides, type GetConnectionPluginProvides, type GetProfilePluginProvides, type GetTablePluginProvides, type GetTableRecordPluginProvides, type InfoFieldItem, type InputFieldItem, type InputFieldProperty, InputFieldPropertySchema, type InputsProperty, InputsPropertySchema, type LimitProperty, LimitPropertySchema, type ListActionsPluginProvides, type ListAppsPluginProvides, type ListAuthenticationsPluginProvides, type ListClientCredentialsPluginProvides, type ListConnectionsPluginProvides, type ListInputFieldsPluginProvides, type ListTableFieldsPluginProvides, type ListTableRecordsPluginProvides, type ListTablesPluginProvides, type LoadingEvent, MAX_PAGE_LIMIT, type Manifest, type ManifestEntry, type ManifestPluginOptions, type ManifestPluginProvides, type MethodCalledEvent, type MethodCalledEventData, type Need, type NeedsRequest, type NeedsResponse, type OffsetProperty, OffsetPropertySchema, type OutputFormatter, type OutputProperty, OutputPropertySchema, type PaginatedSdkFunction, type PaginatedSdkResult, type ParamsProperty, ParamsPropertySchema, type PkceCredentialsObject, PkceCredentialsObjectSchema, type Plugin, type PluginMeta, type PluginProvides, type PositionalMetadata, type RateLimitInfo, type RecordProperty, RecordPropertySchema, type RecordsProperty, RecordsPropertySchema, RelayFetchSchema, RelayRequestSchema, type RequestPluginProvides, type ResolveAuthTokenOptions, type ResolveCredentialsOptions, type ResolvedAppLocator, type ResolvedCredentials, ResolvedCredentialsSchema, type Resolver, type ResolverMetadata, type RootFieldItem, type RunActionPluginProvides, type SdkEvent, type SdkPage, type StaticResolver, type TableProperty, TablePropertySchema, type TablesProperty, TablesPropertySchema, type UpdateManifestEntryOptions, type UpdateManifestEntryResult, type UpdateTableRecordsPluginProvides, type UserProfile, type UserProfileItem, type WithAddPlugin, ZAPIER_BASE_URL, ZAPIER_MAX_NETWORK_RETRIES, ZAPIER_MAX_NETWORK_RETRY_DELAY_MS, ZapierActionError, ZapierApiError, ZapierAppNotFoundError, ZapierApprovalError, ZapierAuthenticationError, ZapierBundleError, type ZapierCache, type ZapierCacheEntry, type ZapierCacheSetOptions, ZapierConfigurationError, ZapierError, type ZapierFetchInitOptions, ZapierNotFoundError, ZapierRateLimitError, ZapierRelayError, ZapierResourceNotFoundError, type ZapierSdk, type ZapierSdkApps, type ZapierSdkOptions, ZapierTimeoutError, ZapierUnknownError, ZapierValidationError, actionKeyResolver, actionTypeResolver, apiPlugin, appKeyResolver, appsPlugin, connectionIdGenericResolver as authenticationIdGenericResolver, connectionIdResolver as authenticationIdResolver, batch, buildApplicationLifecycleEvent, buildCapabilityMessage, buildErrorEvent, buildErrorEventWithContext, buildMethodCalledEvent, clearTokenCache, clientCredentialsNameResolver, clientIdResolver, composePlugins, connectionIdGenericResolver, connectionIdResolver, connectionsPlugin, createBaseEvent, createClientCredentialsPlugin, createFunction, createMemoryCache, createOptionsPlugin, createPaginatedPluginMethod, createPluginMethod, createSdk, createTableFieldsPlugin, createTablePlugin, createTableRecordsPlugin, createZapierSdk, createZapierSdkWithoutRegistry, definePlugin, deleteClientCredentialsPlugin, deleteTableFieldsPlugin, deleteTablePlugin, deleteTableRecordsPlugin, fetchPlugin, findFirstConnectionPlugin, findManifestEntry, findUniqueConnectionPlugin, formatErrorMessage, generateEventId, getActionPlugin, getAppPlugin, getBaseUrlFromCredentials, getCiPlatform, getClientIdFromCredentials, getConnectionPlugin, getCpuTime, getCurrentTimestamp, getMemoryUsage, getOsInfo, getPlatformVersions, getPreferredManifestEntryKey, getProfilePlugin, getReleaseId, getTablePlugin, getTableRecordPlugin, getTokenFromCliLogin, getZapierApprovalMode, getZapierIsInteractive, getZapierSdkService, injectCliLogin, inputFieldKeyResolver, inputsAllOptionalResolver, inputsResolver, invalidateCachedToken, invalidateCredentialsToken, isCi, isCliLoginAvailable, isClientCredentials, isCredentialsFunction, isCredentialsObject, isPkceCredentials, isPositional, listActionsPlugin, listAppsPlugin, listClientCredentialsPlugin, listConnectionsPlugin, listInputFieldsPlugin, listTableFieldsPlugin, listTableRecordsPlugin, listTablesPlugin, logDeprecation, manifestPlugin, readManifestFromFile, registryPlugin, requestPlugin, resetDeprecationWarnings, resolveAuthToken, resolveCredentials, resolveCredentialsFromEnv, runActionPlugin, runWithTelemetryContext, tableFieldIdsResolver, tableFieldsResolver, tableFiltersResolver, tableIdResolver, tableNameResolver, tableRecordIdResolver, tableRecordIdsResolver, tableRecordsResolver, tableSortResolver, tableUpdateRecordsResolver, toSnakeCase, toTitleCase, updateTableRecordsPlugin };
package/dist/index.d.ts CHANGED
@@ -56,7 +56,7 @@ export { createZapierSdk, createZapierSdkWithoutRegistry, createSdk, createOptio
56
56
  export type { FunctionRegistryEntry, FunctionDeprecation, } from "./types/registry";
57
57
  export { BaseSdkOptionsSchema } from "./types/sdk";
58
58
  export type { Plugin, PluginMeta, PluginProvides, WithAddPlugin, } from "./types/plugin";
59
- export { definePlugin, createPluginMethod, createPaginatedPluginMethod, } from "./utils/plugin-utils";
59
+ export { definePlugin, createPluginMethod, createPaginatedPluginMethod, composePlugins, } from "./utils/plugin-utils";
60
60
  export type { ActionItem as ActionResolverItem } from "./resolvers/actionKey";
61
61
  export type { ActionTypeItem } from "./resolvers/actionType";
62
62
  export type { ResolvedAppLocator } from "./utils/domain-utils";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -66,7 +66,7 @@ export * from "./plugins/tables/updateTableRecords";
66
66
  // Export the main combined SDK and new flexible SDK creator
67
67
  export { createZapierSdk, createZapierSdkWithoutRegistry, createSdk, createOptionsPlugin, } from "./sdk";
68
68
  export { BaseSdkOptionsSchema } from "./types/sdk";
69
- export { definePlugin, createPluginMethod, createPaginatedPluginMethod, } from "./utils/plugin-utils";
69
+ export { definePlugin, createPluginMethod, createPaginatedPluginMethod, composePlugins, } from "./utils/plugin-utils";
70
70
  // Export registry plugin for manual use
71
71
  export { registryPlugin } from "./plugins/registry";
72
72
  export { generateEventId, getCurrentTimestamp, getReleaseId, getOsInfo, getPlatformVersions, isCi, getCiPlatform, getMemoryUsage, getCpuTime, buildApplicationLifecycleEvent, buildErrorEventWithContext, buildErrorEvent, createBaseEvent, buildMethodCalledEvent, } from "./plugins/eventEmission";
package/dist/index.mjs CHANGED
@@ -968,6 +968,63 @@ function createPaginatedPluginMethod(sdk, config) {
968
968
  }
969
969
  };
970
970
  }
971
+ function mergeRootKeysWithCollisionCheck(target, source, seen) {
972
+ for (const key of Object.keys(source)) {
973
+ if (seen.has(key)) {
974
+ throw new Error(
975
+ `composePlugins: duplicate root key "${key}". Plugins composed in the same call must register distinct method names.`
976
+ );
977
+ }
978
+ seen.add(key);
979
+ target[key] = source[key];
980
+ }
981
+ }
982
+ function mergeMetaKeysWithCollisionCheck(target, source, seen) {
983
+ for (const key of Object.keys(source)) {
984
+ if (seen.has(key)) {
985
+ throw new Error(
986
+ `composePlugins: duplicate context.meta key "${key}". Two sub-plugins registered metadata for the same name.`
987
+ );
988
+ }
989
+ seen.add(key);
990
+ target[key] = source[key];
991
+ }
992
+ }
993
+ function mergeContextKeysWithCollisionCheck(target, source, seen) {
994
+ for (const key of Object.keys(source)) {
995
+ if (seen.has(key)) {
996
+ throw new Error(
997
+ `composePlugins: duplicate context key "${key}". Two sub-plugins contributed the same context.${key} field.`
998
+ );
999
+ }
1000
+ seen.add(key);
1001
+ target[key] = source[key];
1002
+ }
1003
+ }
1004
+ function composePlugins(...plugins) {
1005
+ return (sdk) => {
1006
+ const merged = { context: { meta: {} } };
1007
+ const seenRoot = /* @__PURE__ */ new Set();
1008
+ const seenMeta = /* @__PURE__ */ new Set();
1009
+ const seenContext = /* @__PURE__ */ new Set();
1010
+ for (const plugin of plugins) {
1011
+ const { context, ...rootKeys } = plugin(sdk);
1012
+ mergeRootKeysWithCollisionCheck(merged, rootKeys, seenRoot);
1013
+ if (context) {
1014
+ const { meta, ...nonMetaContext } = context;
1015
+ if (meta) {
1016
+ mergeMetaKeysWithCollisionCheck(merged.context.meta, meta, seenMeta);
1017
+ }
1018
+ mergeContextKeysWithCollisionCheck(
1019
+ merged.context,
1020
+ nonMetaContext,
1021
+ seenContext
1022
+ );
1023
+ }
1024
+ }
1025
+ return merged;
1026
+ };
1027
+ }
971
1028
  function getStringProperty(obj, key) {
972
1029
  if (typeof obj === "object" && obj !== null && key in obj) {
973
1030
  const value = obj[key];
@@ -5148,6 +5205,17 @@ function getZapierBaseUrl(baseUrl) {
5148
5205
  return void 0;
5149
5206
  }
5150
5207
  }
5208
+ function isLocalhostBaseUrl(baseUrl) {
5209
+ if (!baseUrl) {
5210
+ return false;
5211
+ }
5212
+ try {
5213
+ const { hostname } = new URL(baseUrl);
5214
+ return hostname === "localhost" || hostname === "127.0.0.1";
5215
+ } catch {
5216
+ return false;
5217
+ }
5218
+ }
5151
5219
  function getTrackingBaseUrl({
5152
5220
  trackingBaseUrl,
5153
5221
  baseUrl
@@ -5561,7 +5629,7 @@ async function invalidateCredentialsToken(options) {
5561
5629
  }
5562
5630
 
5563
5631
  // src/sdk-version.ts
5564
- var SDK_VERSION = (typeof process !== "undefined" && process.env ? "0.46.1" : void 0) || "unknown";
5632
+ var SDK_VERSION = (typeof process !== "undefined" && process.env ? "0.47.1" : void 0) || "unknown";
5565
5633
 
5566
5634
  // src/utils/open-url.ts
5567
5635
  var nodePrefix = "node:";
@@ -6227,8 +6295,14 @@ var ZapierApiClient = class {
6227
6295
  );
6228
6296
  }
6229
6297
  };
6230
- assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
6231
- assertApprovalOrigin(approval.approval_url, browserOrigin, "approval_url");
6298
+ if (!isLocalhostBaseUrl(this.options.baseUrl)) {
6299
+ assertApprovalOrigin(approval.poll_url, sdkapiOrigin, "poll_url");
6300
+ assertApprovalOrigin(
6301
+ approval.approval_url,
6302
+ browserOrigin,
6303
+ "approval_url"
6304
+ );
6305
+ }
6232
6306
  this.emitEvent("approval:required", {
6233
6307
  approvalId: approval.approval_id,
6234
6308
  approvalUrl: approval.approval_url
@@ -8496,4 +8570,4 @@ var registryPlugin = definePlugin((_sdk) => {
8496
8570
  return {};
8497
8571
  });
8498
8572
 
8499
- export { ActionKeyPropertySchema, ActionPropertySchema, ActionTimeoutMsPropertySchema, ActionTypePropertySchema, AppKeyPropertySchema, AppPropertySchema, AppsPropertySchema, AuthenticationIdPropertySchema, BaseSdkOptionsSchema, CONTEXT_CACHE_MAX_SIZE, CONTEXT_CACHE_TTL_MS, ClientCredentialsObjectSchema, ConnectionEntrySchema, ConnectionIdPropertySchema, ConnectionPropertySchema, ConnectionsMapSchema, ConnectionsPropertySchema, CredentialsFunctionSchema, CredentialsObjectSchema, CredentialsSchema, DEFAULT_ACTION_TIMEOUT_MS, DEFAULT_APPROVAL_TIMEOUT_MS, DEFAULT_CONFIG_PATH, DEFAULT_MAX_APPROVAL_RETRIES, DEFAULT_PAGE_SIZE, DebugPropertySchema, FieldsPropertySchema, InputFieldPropertySchema, InputsPropertySchema, LimitPropertySchema, MAX_PAGE_LIMIT, OffsetPropertySchema, OutputPropertySchema, ParamsPropertySchema, PkceCredentialsObjectSchema, RecordPropertySchema, RecordsPropertySchema, RelayFetchSchema, RelayRequestSchema, ResolvedCredentialsSchema, TablePropertySchema, TablesPropertySchema, ZAPIER_BASE_URL, ZAPIER_MAX_NETWORK_RETRIES, ZAPIER_MAX_NETWORK_RETRY_DELAY_MS, ZapierActionError, ZapierApiError, ZapierAppNotFoundError, ZapierApprovalError, ZapierAuthenticationError, ZapierBundleError, ZapierConfigurationError, ZapierError, ZapierNotFoundError, ZapierRateLimitError, ZapierRelayError, ZapierResourceNotFoundError, ZapierTimeoutError, ZapierUnknownError, ZapierValidationError, actionKeyResolver, actionTypeResolver, apiPlugin, appKeyResolver, appsPlugin, connectionIdGenericResolver as authenticationIdGenericResolver, connectionIdResolver as authenticationIdResolver, batch, buildApplicationLifecycleEvent, buildCapabilityMessage, buildErrorEvent, buildErrorEventWithContext, buildMethodCalledEvent, clearTokenCache, clientCredentialsNameResolver, clientIdResolver, connectionIdGenericResolver, connectionIdResolver, connectionsPlugin, createBaseEvent, createClientCredentialsPlugin, createFunction, createMemoryCache, createOptionsPlugin, createPaginatedPluginMethod, createPluginMethod, createSdk, createTableFieldsPlugin, createTablePlugin, createTableRecordsPlugin, createZapierSdk, createZapierSdkWithoutRegistry, definePlugin, deleteClientCredentialsPlugin, deleteTableFieldsPlugin, deleteTablePlugin, deleteTableRecordsPlugin, fetchPlugin, findFirstConnectionPlugin, findManifestEntry, findUniqueConnectionPlugin, formatErrorMessage, generateEventId, getActionPlugin, getAppPlugin, getBaseUrlFromCredentials, getCiPlatform, getClientIdFromCredentials, getConnectionPlugin, getCpuTime, getCurrentTimestamp, getMemoryUsage, getOsInfo, getPlatformVersions, getPreferredManifestEntryKey, getProfilePlugin, getReleaseId, getTablePlugin, getTableRecordPlugin, getTokenFromCliLogin, getZapierApprovalMode, getZapierIsInteractive, getZapierSdkService, injectCliLogin, inputFieldKeyResolver, inputsAllOptionalResolver, inputsResolver, invalidateCachedToken, invalidateCredentialsToken, isCi, isCliLoginAvailable, isClientCredentials, isCredentialsFunction, isCredentialsObject, isPkceCredentials, isPositional, listActionsPlugin, listAppsPlugin, listClientCredentialsPlugin, listConnectionsPlugin, listInputFieldsPlugin, listTableFieldsPlugin, listTableRecordsPlugin, listTablesPlugin, logDeprecation, manifestPlugin, readManifestFromFile, registryPlugin, requestPlugin, resetDeprecationWarnings, resolveAuthToken, resolveCredentials, resolveCredentialsFromEnv, runActionPlugin, runWithTelemetryContext, tableFieldIdsResolver, tableFieldsResolver, tableFiltersResolver, tableIdResolver, tableNameResolver, tableRecordIdResolver, tableRecordIdsResolver, tableRecordsResolver, tableSortResolver, tableUpdateRecordsResolver, toSnakeCase, toTitleCase, updateTableRecordsPlugin };
8573
+ export { ActionKeyPropertySchema, ActionPropertySchema, ActionTimeoutMsPropertySchema, ActionTypePropertySchema, AppKeyPropertySchema, AppPropertySchema, AppsPropertySchema, AuthenticationIdPropertySchema, BaseSdkOptionsSchema, CONTEXT_CACHE_MAX_SIZE, CONTEXT_CACHE_TTL_MS, ClientCredentialsObjectSchema, ConnectionEntrySchema, ConnectionIdPropertySchema, ConnectionPropertySchema, ConnectionsMapSchema, ConnectionsPropertySchema, CredentialsFunctionSchema, CredentialsObjectSchema, CredentialsSchema, DEFAULT_ACTION_TIMEOUT_MS, DEFAULT_APPROVAL_TIMEOUT_MS, DEFAULT_CONFIG_PATH, DEFAULT_MAX_APPROVAL_RETRIES, DEFAULT_PAGE_SIZE, DebugPropertySchema, FieldsPropertySchema, InputFieldPropertySchema, InputsPropertySchema, LimitPropertySchema, MAX_PAGE_LIMIT, OffsetPropertySchema, OutputPropertySchema, ParamsPropertySchema, PkceCredentialsObjectSchema, RecordPropertySchema, RecordsPropertySchema, RelayFetchSchema, RelayRequestSchema, ResolvedCredentialsSchema, TablePropertySchema, TablesPropertySchema, ZAPIER_BASE_URL, ZAPIER_MAX_NETWORK_RETRIES, ZAPIER_MAX_NETWORK_RETRY_DELAY_MS, ZapierActionError, ZapierApiError, ZapierAppNotFoundError, ZapierApprovalError, ZapierAuthenticationError, ZapierBundleError, ZapierConfigurationError, ZapierError, ZapierNotFoundError, ZapierRateLimitError, ZapierRelayError, ZapierResourceNotFoundError, ZapierTimeoutError, ZapierUnknownError, ZapierValidationError, actionKeyResolver, actionTypeResolver, apiPlugin, appKeyResolver, appsPlugin, connectionIdGenericResolver as authenticationIdGenericResolver, connectionIdResolver as authenticationIdResolver, batch, buildApplicationLifecycleEvent, buildCapabilityMessage, buildErrorEvent, buildErrorEventWithContext, buildMethodCalledEvent, clearTokenCache, clientCredentialsNameResolver, clientIdResolver, composePlugins, connectionIdGenericResolver, connectionIdResolver, connectionsPlugin, createBaseEvent, createClientCredentialsPlugin, createFunction, createMemoryCache, createOptionsPlugin, createPaginatedPluginMethod, createPluginMethod, createSdk, createTableFieldsPlugin, createTablePlugin, createTableRecordsPlugin, createZapierSdk, createZapierSdkWithoutRegistry, definePlugin, deleteClientCredentialsPlugin, deleteTableFieldsPlugin, deleteTablePlugin, deleteTableRecordsPlugin, fetchPlugin, findFirstConnectionPlugin, findManifestEntry, findUniqueConnectionPlugin, formatErrorMessage, generateEventId, getActionPlugin, getAppPlugin, getBaseUrlFromCredentials, getCiPlatform, getClientIdFromCredentials, getConnectionPlugin, getCpuTime, getCurrentTimestamp, getMemoryUsage, getOsInfo, getPlatformVersions, getPreferredManifestEntryKey, getProfilePlugin, getReleaseId, getTablePlugin, getTableRecordPlugin, getTokenFromCliLogin, getZapierApprovalMode, getZapierIsInteractive, getZapierSdkService, injectCliLogin, inputFieldKeyResolver, inputsAllOptionalResolver, inputsResolver, invalidateCachedToken, invalidateCredentialsToken, isCi, isCliLoginAvailable, isClientCredentials, isCredentialsFunction, isCredentialsObject, isPkceCredentials, isPositional, listActionsPlugin, listAppsPlugin, listClientCredentialsPlugin, listConnectionsPlugin, listInputFieldsPlugin, listTableFieldsPlugin, listTableRecordsPlugin, listTablesPlugin, logDeprecation, manifestPlugin, readManifestFromFile, registryPlugin, requestPlugin, resetDeprecationWarnings, resolveAuthToken, resolveCredentials, resolveCredentialsFromEnv, runActionPlugin, runWithTelemetryContext, tableFieldIdsResolver, tableFieldsResolver, tableFiltersResolver, tableIdResolver, tableNameResolver, tableRecordIdResolver, tableRecordIdsResolver, tableRecordsResolver, tableSortResolver, tableUpdateRecordsResolver, toSnakeCase, toTitleCase, updateTableRecordsPlugin };
@@ -22,7 +22,7 @@
22
22
  */
23
23
  import type { z } from "zod";
24
24
  import type { PaginatedSdkResult } from "../types/functions";
25
- import type { PluginMeta, PluginProvides } from "../types/plugin";
25
+ import type { Plugin, PluginMeta, PluginProvides } from "../types/plugin";
26
26
  /**
27
27
  * Identity helper that preserves the narrow inferred return type of a plugin.
28
28
  *
@@ -164,5 +164,80 @@ export declare function createPaginatedPluginMethod<const TName extends string,
164
164
  }, TInput, TResponse extends {
165
165
  data: unknown[];
166
166
  }>(sdk: TSdk, config: PaginatedPluginMethodConfig<TSdk, TInput, TResponse, TName>): PaginatedPluginMethodReturn<TName, TInput, ItemOf<TResponse>>;
167
+ /**
168
+ * Maps a tuple of plugins to a tuple of their TSdk requirement types.
169
+ *
170
+ * SdkRequirementsOf<[Plugin<{ api }, _>, Plugin<{ options }, _>]>
171
+ * = [{ api }, { options }]
172
+ */
173
+ type SdkRequirementsOf<T extends readonly Plugin<any, any>[]> = {
174
+ [K in keyof T]: T[K] extends Plugin<infer Sdk, any> ? Sdk : never;
175
+ };
176
+ /**
177
+ * Maps a tuple of plugins to a tuple of their TProvides output types.
178
+ *
179
+ * ProvidesOf<[Plugin<_, { hello }>, Plugin<_, { goodbye }>]>
180
+ * = [{ hello }, { goodbye }]
181
+ */
182
+ type ProvidesOf<T extends readonly Plugin<any, any>[]> = {
183
+ [K in keyof T]: T[K] extends Plugin<any, infer Provides> ? Provides : never;
184
+ };
185
+ /**
186
+ * Intersects every member of a tuple into a single combined type. The
187
+ * result is an object that has every property of every member at once.
188
+ *
189
+ * IntersectAll<[{ api }, { options }]> = { api } & { options }
190
+ * IntersectAll<[]> = {}
191
+ *
192
+ * Walks recursively: head & IntersectAll<tail>, base case is the empty
193
+ * tuple. Why intersection (`&`) and not union (`|`): the composed plugin
194
+ * must require ALL of the sub-plugins' needs at once — an SDK that has
195
+ * both `api` AND `options` — not "either api or options."
196
+ */
197
+ type IntersectAll<T extends readonly unknown[]> = T extends readonly [
198
+ infer Head,
199
+ ...infer Tail
200
+ ] ? Head & IntersectAll<Tail> : {};
201
+ /**
202
+ * The TSdk a composed plugin requires: every sub-plugin's TSdk requirement,
203
+ * all at once. Composing a plugin that needs `{ api }` with one that needs
204
+ * `{ options }` yields a composed plugin that needs `{ api } & { options }`.
205
+ */
206
+ type ComposeSdk<T extends readonly Plugin<any, any>[]> = IntersectAll<SdkRequirementsOf<T>>;
207
+ /**
208
+ * What a composed plugin provides: every sub-plugin's TProvides combined.
209
+ * Composing a plugin that provides `{ hello }` with one that provides
210
+ * `{ goodbye }` yields `{ hello } & { goodbye }`.
211
+ */
212
+ type ComposeProvides<T extends readonly Plugin<any, any>[]> = IntersectAll<ProvidesOf<T>>;
213
+ /**
214
+ * Bundle N plugins into a single plugin so a consumer can call
215
+ * `addPlugin(combined)` once. Use this when an extension package wants to
216
+ * expose granular sub-plugins for tree-shaking *and* a one-call convenience
217
+ * entry point.
218
+ *
219
+ * Three commitments (per the boilerplate-reduction design):
220
+ * 1. **Bag mode.** Sub-plugins must not depend on each other; order is
221
+ * irrelevant. If you need pipeline composition (later sub-plugins
222
+ * reading earlier sub-plugins' outputs), use a regular `definePlugin`
223
+ * callback that calls each `createPluginMethod` in turn.
224
+ * 2. **Over-approximation of TSdk.** The composed plugin requires the
225
+ * intersection of every sub-plugin's requirements (all of them, all at
226
+ * once). Works fine for homogeneous-deps groups; widens slightly for
227
+ * heterogeneous ones, which keeps the variadic types tractable.
228
+ * 3. **Collision detection.** Throws on duplicate root keys, duplicate
229
+ * `context.meta` keys, and duplicate non-meta `context.*` keys. Note
230
+ * this only applies *inside* a single `composePlugins(...)` call —
231
+ * cross-`addPlugin` overrides (e.g. a CLI plugin overriding meta from
232
+ * a core SDK plugin) still go through `addPlugin`'s last-write-wins
233
+ * merge unchanged.
234
+ *
235
+ * Why prefer this over an `addPlugin([...])` array overload: TypeScript's
236
+ * overload resolution interacts badly with arrays carrying a mix of
237
+ * `TProvides` shapes — chained inference downstream of `addPlugin([...])`
238
+ * tends to widen and lose individual method types. A single composed
239
+ * plugin flows through the existing single-plugin `addPlugin` cleanly.
240
+ */
241
+ export declare function composePlugins<const Ts extends readonly Plugin<any, any>[]>(...plugins: Ts): Plugin<ComposeSdk<Ts>, ComposeProvides<Ts>>;
167
242
  export {};
168
243
  //# sourceMappingURL=plugin-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-utils.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-utils.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-utils.ts"],"names":[],"mappings":"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"}
@@ -130,3 +130,103 @@ export function createPaginatedPluginMethod(sdk, config) {
130
130
  },
131
131
  };
132
132
  }
133
+ // ----------------------------------------------------------------------------
134
+ // composePlugins — runtime merge helpers
135
+ // ----------------------------------------------------------------------------
136
+ // Three merge rules, one per shape of key the function deals with. Each is
137
+ // a small, single-purpose helper so the main loop reads top-to-bottom.
138
+ /**
139
+ * Merge root-level keys (the SDK methods a plugin contributes) into the
140
+ * accumulator. Throws on collision: composePlugins is bag-mode, so two
141
+ * sub-plugins registering the same method name is a programmer error.
142
+ */
143
+ function mergeRootKeysWithCollisionCheck(target, source, seen) {
144
+ for (const key of Object.keys(source)) {
145
+ if (seen.has(key)) {
146
+ throw new Error(`composePlugins: duplicate root key "${key}". Plugins composed in the same call must register distinct method names.`);
147
+ }
148
+ seen.add(key);
149
+ target[key] = source[key];
150
+ }
151
+ }
152
+ /**
153
+ * Merge per-method metadata (the registry view of input/output schemas,
154
+ * categories, etc.) with the same collision rule as root keys. Even when
155
+ * two sub-plugins' root method keys differ, registry-level shadowing
156
+ * is dangerous, so silent overwrites aren't allowed.
157
+ */
158
+ function mergeMetaKeysWithCollisionCheck(target, source, seen) {
159
+ for (const key of Object.keys(source)) {
160
+ if (seen.has(key)) {
161
+ throw new Error(`composePlugins: duplicate context.meta key "${key}". Two sub-plugins registered metadata for the same name.`);
162
+ }
163
+ seen.add(key);
164
+ target[key] = source[key];
165
+ }
166
+ }
167
+ /**
168
+ * Merge non-meta context keys (everything under `context.*` that isn't
169
+ * `meta`) into the accumulator. Throws on collision — bag mode says
170
+ * sub-plugins shouldn't be re-providing shared infrastructure like
171
+ * `context.api`, so two of them claiming the same context slot is a
172
+ * programmer error. Note that this only applies *inside* a single
173
+ * `composePlugins(...)` call; cross-`addPlugin` overrides go through
174
+ * `addPlugin`'s last-write-wins merge, which is unaffected by this check.
175
+ */
176
+ function mergeContextKeysWithCollisionCheck(target, source, seen) {
177
+ for (const key of Object.keys(source)) {
178
+ if (seen.has(key)) {
179
+ throw new Error(`composePlugins: duplicate context key "${key}". Two sub-plugins contributed the same context.${key} field.`);
180
+ }
181
+ seen.add(key);
182
+ target[key] = source[key];
183
+ }
184
+ }
185
+ /**
186
+ * Bundle N plugins into a single plugin so a consumer can call
187
+ * `addPlugin(combined)` once. Use this when an extension package wants to
188
+ * expose granular sub-plugins for tree-shaking *and* a one-call convenience
189
+ * entry point.
190
+ *
191
+ * Three commitments (per the boilerplate-reduction design):
192
+ * 1. **Bag mode.** Sub-plugins must not depend on each other; order is
193
+ * irrelevant. If you need pipeline composition (later sub-plugins
194
+ * reading earlier sub-plugins' outputs), use a regular `definePlugin`
195
+ * callback that calls each `createPluginMethod` in turn.
196
+ * 2. **Over-approximation of TSdk.** The composed plugin requires the
197
+ * intersection of every sub-plugin's requirements (all of them, all at
198
+ * once). Works fine for homogeneous-deps groups; widens slightly for
199
+ * heterogeneous ones, which keeps the variadic types tractable.
200
+ * 3. **Collision detection.** Throws on duplicate root keys, duplicate
201
+ * `context.meta` keys, and duplicate non-meta `context.*` keys. Note
202
+ * this only applies *inside* a single `composePlugins(...)` call —
203
+ * cross-`addPlugin` overrides (e.g. a CLI plugin overriding meta from
204
+ * a core SDK plugin) still go through `addPlugin`'s last-write-wins
205
+ * merge unchanged.
206
+ *
207
+ * Why prefer this over an `addPlugin([...])` array overload: TypeScript's
208
+ * overload resolution interacts badly with arrays carrying a mix of
209
+ * `TProvides` shapes — chained inference downstream of `addPlugin([...])`
210
+ * tends to widen and lose individual method types. A single composed
211
+ * plugin flows through the existing single-plugin `addPlugin` cleanly.
212
+ */
213
+ export function composePlugins(...plugins) {
214
+ return ((sdk) => {
215
+ const merged = { context: { meta: {} } };
216
+ const seenRoot = new Set();
217
+ const seenMeta = new Set();
218
+ const seenContext = new Set();
219
+ for (const plugin of plugins) {
220
+ const { context, ...rootKeys } = plugin(sdk);
221
+ mergeRootKeysWithCollisionCheck(merged, rootKeys, seenRoot);
222
+ if (context) {
223
+ const { meta, ...nonMetaContext } = context;
224
+ if (meta) {
225
+ mergeMetaKeysWithCollisionCheck(merged.context.meta, meta, seenMeta);
226
+ }
227
+ mergeContextKeysWithCollisionCheck(merged.context, nonMetaContext, seenContext);
228
+ }
229
+ }
230
+ return merged;
231
+ });
232
+ }
@@ -4,6 +4,12 @@
4
4
  * This combines domain checking and URL extraction logic.
5
5
  */
6
6
  export declare function getZapierBaseUrl(baseUrl?: string): string | undefined;
7
+ /**
8
+ * Returns true if the baseUrl points at a developer's local machine
9
+ * (`localhost` or `127.0.0.1`). Used to relax checks that don't make sense
10
+ * when the SDK API and other services run on different localhost ports.
11
+ */
12
+ export declare function isLocalhostBaseUrl(baseUrl?: string): boolean;
7
13
  /**
8
14
  * Gets tracking base URL with the following precedence:
9
15
  * 1. Explicit trackingBaseUrl parameter
@@ -1 +1 @@
1
- {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/utils/url-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+BrE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,eAAe,EACf,OAAO,GACR,EAAE;IACD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CA0BT"}
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/utils/url-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+BrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAU5D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,eAAe,EACf,OAAO,GACR,EAAE;IACD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CA0BT"}
@@ -29,6 +29,23 @@ export function getZapierBaseUrl(baseUrl) {
29
29
  return undefined;
30
30
  }
31
31
  }
32
+ /**
33
+ * Returns true if the baseUrl points at a developer's local machine
34
+ * (`localhost` or `127.0.0.1`). Used to relax checks that don't make sense
35
+ * when the SDK API and other services run on different localhost ports.
36
+ */
37
+ export function isLocalhostBaseUrl(baseUrl) {
38
+ if (!baseUrl) {
39
+ return false;
40
+ }
41
+ try {
42
+ const { hostname } = new URL(baseUrl);
43
+ return hostname === "localhost" || hostname === "127.0.0.1";
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
32
49
  /**
33
50
  * Gets tracking base URL with the following precedence:
34
51
  * 1. Explicit trackingBaseUrl parameter
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zapier/zapier-sdk",
3
- "version": "0.46.1",
3
+ "version": "0.47.1",
4
4
  "description": "Complete Zapier SDK - combines all Zapier SDK packages",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -68,6 +68,7 @@
68
68
  "url": "https://gitlab.com/zapier/zapier-sdk/zapier-sdk.git",
69
69
  "directory": "packages/zapier-sdk"
70
70
  },
71
+ "homepage": "https://docs.zapier.com/sdk",
71
72
  "publishConfig": {
72
73
  "access": "public"
73
74
  },