@zapier/zapier-sdk 0.5.1 → 0.6.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.
Files changed (137) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +107 -83
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.d.ts.map +1 -1
  5. package/dist/api/schemas.d.ts +6 -6
  6. package/dist/api/types.d.ts +7 -7
  7. package/dist/api/types.d.ts.map +1 -1
  8. package/dist/index.cjs +343 -67
  9. package/dist/index.d.mts +416 -347
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +0 -1
  12. package/dist/index.mjs +343 -67
  13. package/dist/plugins/api/index.js +1 -1
  14. package/dist/plugins/apps/types.d.ts +1 -1
  15. package/dist/plugins/apps/types.d.ts.map +1 -1
  16. package/dist/plugins/findFirstAuthentication/index.d.ts.map +1 -1
  17. package/dist/plugins/findFirstAuthentication/index.js +1 -0
  18. package/dist/plugins/findUniqueAuthentication/index.d.ts.map +1 -1
  19. package/dist/plugins/findUniqueAuthentication/index.js +1 -0
  20. package/dist/plugins/getAction/index.d.ts.map +1 -1
  21. package/dist/plugins/getAction/index.js +1 -0
  22. package/dist/plugins/getAction/index.test.js +1 -1
  23. package/dist/plugins/getApp/index.d.ts +6 -3
  24. package/dist/plugins/getApp/index.d.ts.map +1 -1
  25. package/dist/plugins/getApp/index.js +8 -18
  26. package/dist/plugins/getApp/index.test.js +2 -0
  27. package/dist/plugins/getAuthentication/index.d.ts.map +1 -1
  28. package/dist/plugins/getAuthentication/index.js +1 -0
  29. package/dist/plugins/getAuthentication/index.test.js +12 -1
  30. package/dist/plugins/getProfile/index.d.ts.map +1 -1
  31. package/dist/plugins/getProfile/index.js +1 -0
  32. package/dist/plugins/listActions/index.d.ts +5 -3
  33. package/dist/plugins/listActions/index.d.ts.map +1 -1
  34. package/dist/plugins/listActions/index.js +6 -6
  35. package/dist/plugins/listActions/index.test.js +26 -74
  36. package/dist/plugins/listActions/schemas.d.ts +4 -4
  37. package/dist/plugins/listApps/index.d.ts.map +1 -1
  38. package/dist/plugins/listApps/index.js +1 -0
  39. package/dist/plugins/listApps/schemas.d.ts +2 -2
  40. package/dist/plugins/listAuthentications/index.d.ts +4 -2
  41. package/dist/plugins/listAuthentications/index.d.ts.map +1 -1
  42. package/dist/plugins/listAuthentications/index.js +9 -12
  43. package/dist/plugins/listAuthentications/index.test.js +33 -40
  44. package/dist/plugins/listAuthentications/schemas.d.ts +4 -4
  45. package/dist/plugins/listInputFields/index.d.ts +3 -1
  46. package/dist/plugins/listInputFields/index.d.ts.map +1 -1
  47. package/dist/plugins/listInputFields/index.js +5 -5
  48. package/dist/plugins/listInputFields/index.test.js +10 -8
  49. package/dist/plugins/listInputFields/schemas.d.ts +4 -4
  50. package/dist/plugins/lockVersion/index.d.ts +24 -0
  51. package/dist/plugins/lockVersion/index.d.ts.map +1 -0
  52. package/dist/plugins/lockVersion/index.js +72 -0
  53. package/dist/plugins/lockVersion/index.test.d.ts +2 -0
  54. package/dist/plugins/lockVersion/index.test.d.ts.map +1 -0
  55. package/dist/plugins/lockVersion/index.test.js +129 -0
  56. package/dist/plugins/lockVersion/schemas.d.ts +10 -0
  57. package/dist/plugins/lockVersion/schemas.d.ts.map +1 -0
  58. package/dist/plugins/lockVersion/schemas.js +6 -0
  59. package/dist/plugins/manifest/index.d.ts +24 -0
  60. package/dist/plugins/manifest/index.d.ts.map +1 -0
  61. package/dist/plugins/manifest/index.js +119 -0
  62. package/dist/plugins/manifest/index.test.d.ts +2 -0
  63. package/dist/plugins/manifest/index.test.d.ts.map +1 -0
  64. package/dist/plugins/manifest/index.test.js +331 -0
  65. package/dist/plugins/manifest/schemas.d.ts +64 -0
  66. package/dist/plugins/manifest/schemas.d.ts.map +1 -0
  67. package/dist/plugins/manifest/schemas.js +25 -0
  68. package/dist/plugins/registry/index.d.ts +9 -1
  69. package/dist/plugins/registry/index.d.ts.map +1 -1
  70. package/dist/plugins/registry/index.js +68 -3
  71. package/dist/plugins/request/index.d.ts.map +1 -1
  72. package/dist/plugins/request/index.js +1 -0
  73. package/dist/plugins/request/index.test.js +6 -1
  74. package/dist/plugins/request/schemas.d.ts +4 -4
  75. package/dist/plugins/runAction/index.d.ts +2 -0
  76. package/dist/plugins/runAction/index.d.ts.map +1 -1
  77. package/dist/plugins/runAction/index.js +5 -5
  78. package/dist/plugins/runAction/index.test.js +9 -8
  79. package/dist/plugins/runAction/schemas.d.ts +4 -4
  80. package/dist/schemas/Auth.d.ts +4 -4
  81. package/dist/schemas/Field.d.ts.map +1 -1
  82. package/dist/sdk.d.ts +3 -3
  83. package/dist/sdk.d.ts.map +1 -1
  84. package/dist/sdk.js +18 -7
  85. package/dist/sdk.test.js +1 -1
  86. package/dist/types/errors.d.ts +6 -6
  87. package/dist/types/errors.d.ts.map +1 -1
  88. package/dist/types/events.d.ts +1 -1
  89. package/dist/types/events.d.ts.map +1 -1
  90. package/dist/types/plugin.d.ts +10 -2
  91. package/dist/types/plugin.d.ts.map +1 -1
  92. package/dist/types/sdk.d.ts +13 -2
  93. package/dist/types/sdk.d.ts.map +1 -1
  94. package/dist/utils/validation.test.js +2 -1
  95. package/package.json +2 -2
  96. package/src/api/client.ts +3 -3
  97. package/src/api/index.ts +2 -0
  98. package/src/api/types.ts +15 -7
  99. package/src/index.ts +0 -2
  100. package/src/plugins/api/index.ts +1 -1
  101. package/src/plugins/apps/types.ts +1 -1
  102. package/src/plugins/findFirstAuthentication/index.ts +1 -0
  103. package/src/plugins/findUniqueAuthentication/index.ts +1 -0
  104. package/src/plugins/getAction/index.test.ts +1 -1
  105. package/src/plugins/getAction/index.ts +1 -0
  106. package/src/plugins/getApp/index.test.ts +2 -0
  107. package/src/plugins/getApp/index.ts +12 -24
  108. package/src/plugins/getAuthentication/index.test.ts +13 -3
  109. package/src/plugins/getAuthentication/index.ts +1 -0
  110. package/src/plugins/getProfile/index.ts +1 -0
  111. package/src/plugins/listActions/index.test.ts +30 -89
  112. package/src/plugins/listActions/index.ts +34 -27
  113. package/src/plugins/listApps/index.ts +1 -0
  114. package/src/plugins/listAuthentications/index.test.ts +38 -47
  115. package/src/plugins/listAuthentications/index.ts +21 -18
  116. package/src/plugins/listInputFields/index.test.ts +12 -9
  117. package/src/plugins/listInputFields/index.ts +10 -6
  118. package/src/plugins/lockVersion/index.test.ts +176 -0
  119. package/src/plugins/lockVersion/index.ts +112 -0
  120. package/src/plugins/lockVersion/schemas.ts +9 -0
  121. package/src/plugins/manifest/index.test.ts +439 -0
  122. package/src/plugins/manifest/index.ts +171 -0
  123. package/src/plugins/manifest/schemas.ts +53 -0
  124. package/src/plugins/registry/index.ts +89 -8
  125. package/src/plugins/request/index.test.ts +8 -4
  126. package/src/plugins/request/index.ts +1 -0
  127. package/src/plugins/runAction/index.test.ts +9 -8
  128. package/src/plugins/runAction/index.ts +18 -9
  129. package/src/schemas/Field.ts +5 -2
  130. package/src/sdk.test.ts +1 -1
  131. package/src/sdk.ts +22 -7
  132. package/src/types/errors.ts +9 -6
  133. package/src/types/events.ts +1 -1
  134. package/src/types/plugin.ts +14 -2
  135. package/src/types/sdk.ts +15 -1
  136. package/src/utils/validation.test.ts +2 -1
  137. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAGhC,YAAY,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAM5B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAGrE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,YAAY,EACV,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,GAAG,GACJ,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAGhC,YAAY,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAI5B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAGrE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,YAAY,EACV,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,GAAG,GACJ,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -12,7 +12,6 @@ export { hasResolver } from "./resolvers";
12
12
  export * from "./auth";
13
13
  // Export resolvers for CLI use
14
14
  export * from "./resolvers";
15
- // Note: SdkSchemas is now available via SDK.__registry
16
15
  // All functions now available through the plugin system via createZapierSdk()
17
16
  // Export plugin schemas for external use
18
17
  export { RelayRequestSchema, RelayFetchSchema, } from "./plugins/request/schemas";
package/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
1
  import { z } from 'zod';
2
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
3
+ import { resolve } from 'path';
2
4
 
3
5
  // src/types/properties.ts
4
6
  function withFormatter(schema, formatMeta) {
@@ -525,15 +527,67 @@ var RelayFetchSchema = RelayRequestSchema;
525
527
  // src/plugins/registry/index.ts
526
528
  var registryPlugin = ({ sdk, context }) => {
527
529
  const metaKeys = Object.keys(context.meta || {});
528
- const registryEntries = metaKeys.map((key) => {
530
+ const categoryDefinitions = {
531
+ app: {
532
+ title: "App",
533
+ titlePlural: "Apps"
534
+ },
535
+ authentication: {
536
+ title: "Authentication"
537
+ },
538
+ action: {
539
+ title: "Action"
540
+ },
541
+ http: {
542
+ title: "HTTP Request"
543
+ },
544
+ user: {
545
+ title: "User"
546
+ },
547
+ utility: {
548
+ title: "Utility",
549
+ titlePlural: "Utilities"
550
+ },
551
+ other: {
552
+ title: "Other"
553
+ }
554
+ };
555
+ const functions = metaKeys.filter((key) => typeof sdk[key] === "function").map((key) => {
529
556
  return {
530
557
  ...context.meta[key],
531
- name: key,
532
- implementation: sdk[key]
558
+ categories: context.meta[key].categories || [],
559
+ name: key
560
+ };
561
+ }).sort((a, b) => a.name.localeCompare(b.name));
562
+ const knownCategories = Object.keys(categoryDefinitions);
563
+ const categories = knownCategories.sort((a, b) => {
564
+ if (a === "other") return 1;
565
+ if (b === "other") return -1;
566
+ const titleA = categoryDefinitions[a].title;
567
+ const titleB = categoryDefinitions[b].title;
568
+ return titleA.localeCompare(titleB);
569
+ }).map((categoryKey) => {
570
+ const categoryFunctions = functions.filter(
571
+ (f) => f.categories.includes(categoryKey) || // If the category is "other" and the function is not in any other category, include it
572
+ categoryKey === "other" && !f.categories.some((c) => knownCategories.includes(c))
573
+ ).map((f) => f.name).sort();
574
+ const definition = categoryDefinitions[categoryKey];
575
+ const title = definition.title;
576
+ return {
577
+ key: categoryKey,
578
+ title,
579
+ titlePlural: definition.titlePlural ?? `${title}s`,
580
+ functions: categoryFunctions
533
581
  };
534
582
  });
583
+ function getRegistry() {
584
+ return {
585
+ functions,
586
+ categories
587
+ };
588
+ }
535
589
  return {
536
- __registry: registryEntries
590
+ getRegistry
537
591
  };
538
592
  };
539
593
 
@@ -622,7 +676,7 @@ async function pollUntilComplete(options) {
622
676
  } else if (response.status === pendingStatus) {
623
677
  errorCount = 0;
624
678
  if (attempt < maxAttempts - 1) {
625
- await new Promise((resolve) => setTimeout(resolve, delay));
679
+ await new Promise((resolve3) => setTimeout(resolve3, delay));
626
680
  delay = Math.min(delay * 2, maxDelay);
627
681
  continue;
628
682
  }
@@ -635,7 +689,7 @@ async function pollUntilComplete(options) {
635
689
  );
636
690
  }
637
691
  if (attempt < maxAttempts - 1) {
638
- await new Promise((resolve) => setTimeout(resolve, delay));
692
+ await new Promise((resolve3) => setTimeout(resolve3, delay));
639
693
  delay = Math.min(delay * 2, maxDelay);
640
694
  continue;
641
695
  }
@@ -959,7 +1013,7 @@ var apiPlugin = (params) => {
959
1013
  getToken,
960
1014
  onEvent,
961
1015
  debug = false
962
- } = params;
1016
+ } = params.context.options;
963
1017
  const api = createZapierApi({
964
1018
  baseUrl,
965
1019
  token,
@@ -1652,6 +1706,7 @@ var getProfilePlugin = ({ context }) => {
1652
1706
  context: {
1653
1707
  meta: {
1654
1708
  getProfile: {
1709
+ categories: ["user"],
1655
1710
  inputSchema: GetProfileSchema
1656
1711
  }
1657
1712
  }
@@ -1706,6 +1761,16 @@ function splitVersionedKey(versionedKey) {
1706
1761
  }
1707
1762
  return [versionedKey, void 0];
1708
1763
  }
1764
+ function normalizeImplementationToAppItem(implementation) {
1765
+ const [selectedApi, appVersion] = implementation.selected_api ? splitVersionedKey(implementation.selected_api) : [implementation.selected_api || "", void 0];
1766
+ return {
1767
+ title: implementation.name || selectedApi,
1768
+ key: selectedApi,
1769
+ current_implementation_id: implementation.selected_api || "",
1770
+ version: appVersion
1771
+ // Extract version separately
1772
+ };
1773
+ }
1709
1774
  function normalizeImplementationMetaToAppItem(implementationMeta) {
1710
1775
  const [selectedApi, appVersion] = splitVersionedKey(implementationMeta.id);
1711
1776
  return {
@@ -1891,6 +1956,7 @@ var listAppsPlugin = ({ context }) => {
1891
1956
  context: {
1892
1957
  meta: {
1893
1958
  listApps: {
1959
+ categories: ["app"],
1894
1960
  inputSchema: ListAppsSchema
1895
1961
  }
1896
1962
  }
@@ -1907,23 +1973,16 @@ var GetAppSchema = withOutputSchema(
1907
1973
  );
1908
1974
 
1909
1975
  // src/plugins/getApp/index.ts
1910
- var getAppPlugin = ({ sdk }) => {
1976
+ var getAppPlugin = ({ context }) => {
1911
1977
  const getApp = createFunction(async function getApp2(options) {
1912
- const { appKey } = options;
1913
- const appsIterator = sdk.listApps({
1914
- ...options,
1915
- appKeys: [appKey]
1916
- }).items();
1917
- const apps = [];
1918
- for await (const app of appsIterator) {
1919
- apps.push(app);
1920
- break;
1921
- }
1922
- if (apps.length === 0) {
1923
- throw new ZapierAppNotFoundError(appKey);
1978
+ const app = await context.getImplementation(options.appKey);
1979
+ if (!app) {
1980
+ throw new ZapierAppNotFoundError("App not found", {
1981
+ appKey: options.appKey
1982
+ });
1924
1983
  }
1925
1984
  return {
1926
- data: apps[0]
1985
+ data: app
1927
1986
  };
1928
1987
  }, GetAppSchema);
1929
1988
  return {
@@ -1931,6 +1990,7 @@ var getAppPlugin = ({ sdk }) => {
1931
1990
  context: {
1932
1991
  meta: {
1933
1992
  getApp: {
1993
+ categories: ["app"],
1934
1994
  inputSchema: GetAppSchema
1935
1995
  }
1936
1996
  }
@@ -1989,12 +2049,11 @@ var ListActionsSchema = withOutputSchema(
1989
2049
  );
1990
2050
 
1991
2051
  // src/plugins/listActions/index.ts
1992
- var listActionsPlugin = ({ sdk, context }) => {
2052
+ var listActionsPlugin = ({ context }) => {
1993
2053
  const listActions = createPaginatedFunction(async function listActionsPage(options) {
1994
- const { api } = context;
1995
- const app = await sdk.getApp({ appKey: options.appKey });
1996
- const implementationId = app.data.current_implementation_id?.split("@")[0];
1997
- if (!implementationId) {
2054
+ const { api, getVersionedImplementationId } = context;
2055
+ const selectedApi = await getVersionedImplementationId(options.appKey);
2056
+ if (!selectedApi) {
1998
2057
  throw new ZapierConfigurationError(
1999
2058
  "No current_implementation_id found for app",
2000
2059
  { configType: "current_implementation_id" }
@@ -2003,26 +2062,29 @@ var listActionsPlugin = ({ sdk, context }) => {
2003
2062
  const searchParams = {
2004
2063
  global: "true",
2005
2064
  public_only: "true",
2006
- selected_apis: implementationId
2065
+ selected_apis: selectedApi
2007
2066
  };
2008
- const data = await api.get("/api/v4/implementations/", {
2009
- searchParams,
2010
- customErrorHandler: ({ status }) => {
2011
- if (status === 401) {
2012
- return new ZapierAuthenticationError(
2013
- `Authentication failed. Your token may not have permission to access implementations or may be expired. (HTTP ${status})`,
2014
- { statusCode: status }
2015
- );
2016
- }
2017
- if (status === 403) {
2018
- return new ZapierAuthenticationError(
2019
- `Access forbidden. Your token may not have the required scopes to list implementations. (HTTP ${status})`,
2020
- { statusCode: status }
2021
- );
2067
+ const data = await api.get(
2068
+ "/api/v4/implementations/",
2069
+ {
2070
+ searchParams,
2071
+ customErrorHandler: ({ status }) => {
2072
+ if (status === 401) {
2073
+ return new ZapierAuthenticationError(
2074
+ `Authentication failed. Your token may not have permission to access implementations or may be expired. (HTTP ${status})`,
2075
+ { statusCode: status }
2076
+ );
2077
+ }
2078
+ if (status === 403) {
2079
+ return new ZapierAuthenticationError(
2080
+ `Access forbidden. Your token may not have the required scopes to list implementations. (HTTP ${status})`,
2081
+ { statusCode: status }
2082
+ );
2083
+ }
2084
+ return void 0;
2022
2085
  }
2023
- return void 0;
2024
2086
  }
2025
- });
2087
+ );
2026
2088
  let allActions = [];
2027
2089
  for (const implementation of data.results || []) {
2028
2090
  if (implementation.actions) {
@@ -2050,6 +2112,7 @@ var listActionsPlugin = ({ sdk, context }) => {
2050
2112
  context: {
2051
2113
  meta: {
2052
2114
  listActions: {
2115
+ categories: ["action"],
2053
2116
  inputSchema: ListActionsSchema
2054
2117
  }
2055
2118
  }
@@ -2082,6 +2145,7 @@ var getActionPlugin = ({ sdk }) => {
2082
2145
  context: {
2083
2146
  meta: {
2084
2147
  getAction: {
2148
+ categories: ["action"],
2085
2149
  inputSchema: GetActionSchema
2086
2150
  }
2087
2151
  }
@@ -2104,15 +2168,14 @@ var RunActionSchema = z.object({
2104
2168
  async function executeAction(actionOptions) {
2105
2169
  const {
2106
2170
  api,
2107
- sdk,
2171
+ context,
2108
2172
  appKey,
2109
2173
  actionKey,
2110
2174
  actionType,
2111
2175
  executionOptions,
2112
2176
  authenticationId
2113
2177
  } = actionOptions;
2114
- const appData = await sdk.getApp({ appKey });
2115
- const selectedApi = appData.data.current_implementation_id;
2178
+ const selectedApi = await context.getVersionedImplementationId(appKey);
2116
2179
  if (!selectedApi) {
2117
2180
  throw new ZapierConfigurationError(
2118
2181
  "No current_implementation_id found for app",
@@ -2131,7 +2194,10 @@ async function executeAction(actionOptions) {
2131
2194
  const runRequest = {
2132
2195
  data: runRequestData
2133
2196
  };
2134
- const runData = await api.post("/api/actions/v1/runs", runRequest);
2197
+ const runData = await api.post(
2198
+ "/api/actions/v1/runs",
2199
+ runRequest
2200
+ );
2135
2201
  const runId = runData.data.id;
2136
2202
  return await api.poll(`/api/actions/v1/runs/${runId}`, {
2137
2203
  successStatus: 200,
@@ -2161,7 +2227,7 @@ var runActionPlugin = ({ sdk, context }) => {
2161
2227
  }
2162
2228
  const result = await executeAction({
2163
2229
  api,
2164
- sdk,
2230
+ context,
2165
2231
  appKey,
2166
2232
  actionKey,
2167
2233
  actionType,
@@ -2187,6 +2253,7 @@ var runActionPlugin = ({ sdk, context }) => {
2187
2253
  context: {
2188
2254
  meta: {
2189
2255
  runAction: {
2256
+ categories: ["action"],
2190
2257
  inputSchema: RunActionSchema
2191
2258
  }
2192
2259
  }
@@ -2206,19 +2273,18 @@ var ListAuthenticationsSchema = z.object({
2206
2273
  }).describe("List available authentications with optional filtering");
2207
2274
 
2208
2275
  // src/plugins/listAuthentications/index.ts
2209
- var listAuthenticationsPlugin = ({ sdk, context }) => {
2276
+ var listAuthenticationsPlugin = ({ context }) => {
2210
2277
  const listAuthentications = createPaginatedFunction(
2211
2278
  async function listAuthenticationsPage(options) {
2212
- const { api } = context;
2279
+ const { api, getVersionedImplementationId } = context;
2213
2280
  const searchParams = {};
2214
2281
  if (options.appKey) {
2215
- const app = await sdk.getApp({
2216
- appKey: options.appKey
2217
- });
2218
- const selectedApi = app.data.current_implementation_id;
2219
- if (selectedApi) {
2220
- const versionlessApi = selectedApi.split("@")[0];
2221
- searchParams.versionless_selected_api = versionlessApi;
2282
+ const implementationId = await getVersionedImplementationId(
2283
+ options.appKey
2284
+ );
2285
+ if (implementationId) {
2286
+ const [versionlessSelectedApi] = splitVersionedKey(implementationId);
2287
+ searchParams.versionless_selected_api = versionlessSelectedApi;
2222
2288
  }
2223
2289
  }
2224
2290
  if (options.search) {
@@ -2236,6 +2302,7 @@ var listAuthenticationsPlugin = ({ sdk, context }) => {
2236
2302
  if (options.cursor) {
2237
2303
  searchParams.offset = options.cursor;
2238
2304
  }
2305
+ console.log({ searchParams });
2239
2306
  const data = await api.get(
2240
2307
  "/api/v4/authentications/",
2241
2308
  {
@@ -2276,6 +2343,7 @@ var listAuthenticationsPlugin = ({ sdk, context }) => {
2276
2343
  context: {
2277
2344
  meta: {
2278
2345
  listAuthentications: {
2346
+ categories: ["authentication"],
2279
2347
  inputSchema: ListAuthenticationsSchema
2280
2348
  }
2281
2349
  }
@@ -2330,6 +2398,7 @@ var getAuthenticationPlugin = ({ context }) => {
2330
2398
  context: {
2331
2399
  meta: {
2332
2400
  getAuthentication: {
2401
+ categories: ["authentication"],
2333
2402
  inputSchema: GetAuthenticationSchema
2334
2403
  }
2335
2404
  }
@@ -2365,6 +2434,7 @@ var findFirstAuthenticationPlugin = ({ sdk }) => {
2365
2434
  context: {
2366
2435
  meta: {
2367
2436
  findFirstAuthentication: {
2437
+ categories: ["authentication"],
2368
2438
  inputSchema: FindFirstAuthenticationSchema
2369
2439
  }
2370
2440
  }
@@ -2412,6 +2482,7 @@ var findUniqueAuthenticationPlugin = ({ sdk }) => {
2412
2482
  context: {
2413
2483
  meta: {
2414
2484
  findUniqueAuthentication: {
2485
+ categories: ["authentication"],
2415
2486
  inputSchema: FindUniqueAuthenticationSchema
2416
2487
  }
2417
2488
  }
@@ -2488,13 +2559,12 @@ function transformNeedToInputFieldItem(need) {
2488
2559
  items: itemsType ? { type: itemsType } : void 0
2489
2560
  };
2490
2561
  }
2491
- var listInputFieldsPlugin = ({ sdk, context }) => {
2562
+ var listInputFieldsPlugin = ({ context }) => {
2492
2563
  const listInputFields = createPaginatedFunction(
2493
2564
  async function listInputFieldsPage(options) {
2494
- const { api } = context;
2565
+ const { api, getVersionedImplementationId } = context;
2495
2566
  const { appKey, actionKey, actionType, authenticationId, inputs } = options;
2496
- const appData = await sdk.getApp({ appKey });
2497
- const selectedApi = appData.data.current_implementation_id;
2567
+ const selectedApi = await getVersionedImplementationId(appKey);
2498
2568
  if (!selectedApi) {
2499
2569
  throw new ZapierConfigurationError(
2500
2570
  "No current_implementation_id found for app",
@@ -2535,6 +2605,7 @@ var listInputFieldsPlugin = ({ sdk, context }) => {
2535
2605
  context: {
2536
2606
  meta: {
2537
2607
  listInputFields: {
2608
+ categories: ["action"],
2538
2609
  inputSchema: ListInputFieldsSchema
2539
2610
  }
2540
2611
  }
@@ -2588,32 +2659,237 @@ var requestPlugin = ({ context }) => {
2588
2659
  context: {
2589
2660
  meta: {
2590
2661
  request: {
2662
+ categories: ["http"],
2591
2663
  inputSchema: RelayRequestSchema
2592
2664
  }
2593
2665
  }
2594
2666
  }
2595
2667
  };
2596
2668
  };
2669
+ var ManifestSchema = z.object({
2670
+ apps: z.record(
2671
+ z.string(),
2672
+ z.object({
2673
+ implementationName: z.string().describe(
2674
+ "Base implementation name without version (e.g., 'SlackCLIAPI')"
2675
+ ),
2676
+ version: z.string().describe("Version string (e.g., '1.21.1')")
2677
+ })
2678
+ )
2679
+ }).describe("Manifest mapping app keys to version information");
2680
+ z.object({
2681
+ manifestPath: z.string().optional().describe("Path to manifest file"),
2682
+ manifest: z.record(
2683
+ z.string(),
2684
+ z.object({
2685
+ implementationName: z.string(),
2686
+ version: z.string().optional()
2687
+ })
2688
+ ).optional().describe("Direct manifest object")
2689
+ });
2690
+
2691
+ // src/plugins/manifest/index.ts
2692
+ function parseManifestContent(content, source) {
2693
+ try {
2694
+ const parsed = JSON.parse(content);
2695
+ if (parsed?.apps && typeof parsed?.apps === "object") {
2696
+ const result = ManifestSchema.safeParse(parsed);
2697
+ if (result.success) {
2698
+ return result.data;
2699
+ }
2700
+ console.warn(`\u26A0\uFE0F Invalid manifest format in ${source}: ${result.error}`);
2701
+ }
2702
+ return null;
2703
+ } catch (error) {
2704
+ console.warn(`\u26A0\uFE0F Failed to parse manifest from ${source}:`, error);
2705
+ return null;
2706
+ }
2707
+ }
2708
+ function loadManifestFromFile(filePath) {
2709
+ try {
2710
+ const resolvedPath = resolve(filePath);
2711
+ const content = readFileSync(resolvedPath, "utf8");
2712
+ return parseManifestContent(content, resolvedPath);
2713
+ } catch (error) {
2714
+ console.warn(`\u26A0\uFE0F Failed to load manifest from ${filePath}:`, error);
2715
+ return null;
2716
+ }
2717
+ }
2718
+ var emitWarning = (appKey) => {
2719
+ console.warn(
2720
+ `
2721
+ ${"\u26A0\uFE0F".padEnd(3)} ${"WARNING".padEnd(8)} No manifest version found for '${appKey}'`
2722
+ );
2723
+ console.warn(
2724
+ ` ${"\u21B3".padEnd(3)} Using a manifest ensures version locking and prevents unexpected behavior due to version changes.`
2725
+ );
2726
+ console.warn(
2727
+ ` ${"\u21B3".padEnd(3)} Generate/update the manifest with: \`zapier-sdk update-manifest ${appKey}\`
2728
+ `
2729
+ );
2730
+ };
2731
+ var manifestPlugin = (params) => {
2732
+ const { sdk, context } = params;
2733
+ const { api, options } = context;
2734
+ const { manifestPath = ".zapierrc", manifest } = options || {};
2735
+ const resolvedManifest = (() => {
2736
+ if (manifest) {
2737
+ return manifest;
2738
+ }
2739
+ if (manifestPath) {
2740
+ return loadManifestFromFile(manifestPath);
2741
+ }
2742
+ return null;
2743
+ })();
2744
+ const getManifestEntry = (appKey) => {
2745
+ return resolvedManifest?.apps?.[appKey] || null;
2746
+ };
2747
+ const getImplementation = async (appKey) => {
2748
+ let selectedApi = null;
2749
+ const manifestImplementation = resolvedManifest?.apps?.[appKey];
2750
+ const [versionlessAppKey, version] = splitVersionedKey(appKey);
2751
+ if (version) {
2752
+ selectedApi = `${versionlessAppKey}@${version}`;
2753
+ } else if (manifestImplementation) {
2754
+ selectedApi = `${manifestImplementation.implementationName}@${manifestImplementation.version || "latest"}`;
2755
+ }
2756
+ if (selectedApi) {
2757
+ const searchParams = {
2758
+ selected_apis: selectedApi
2759
+ };
2760
+ const implementationData = await api.get(
2761
+ "/api/v4/implementations/",
2762
+ {
2763
+ searchParams
2764
+ }
2765
+ );
2766
+ const implementationResults = implementationData.results[0];
2767
+ if (!implementationResults) return null;
2768
+ return normalizeImplementationToAppItem(implementationResults);
2769
+ }
2770
+ emitWarning(appKey);
2771
+ const appsIterator = sdk.listApps({ appKeys: [appKey] }).items();
2772
+ const apps = [];
2773
+ for await (const app2 of appsIterator) {
2774
+ apps.push(app2);
2775
+ break;
2776
+ }
2777
+ if (apps.length === 0) {
2778
+ return null;
2779
+ }
2780
+ const app = apps[0];
2781
+ return app;
2782
+ };
2783
+ const getVersionedImplementationId = async (appKey) => {
2784
+ const manifestEntry = getManifestEntry(appKey);
2785
+ if (manifestEntry) {
2786
+ return `${manifestEntry.implementationName}@${manifestEntry.version || "latest"}`;
2787
+ }
2788
+ const implementation = await getImplementation(appKey);
2789
+ if (!implementation) return null;
2790
+ return implementation.current_implementation_id;
2791
+ };
2792
+ return {
2793
+ context: {
2794
+ manifest: resolvedManifest,
2795
+ getVersionedImplementationId,
2796
+ getManifestEntry,
2797
+ getImplementation
2798
+ }
2799
+ };
2800
+ };
2801
+ var LockVersionSchema = z.object({
2802
+ appKey: z.string().describe("The app key to lock version for (e.g., 'slack', 'gmail')")
2803
+ });
2804
+ var lockVersionPlugin = ({ sdk }) => {
2805
+ const lockVersion = createFunction(
2806
+ async function lockVersion2(options) {
2807
+ const { appKey, configPath = ".zapierrc" } = options;
2808
+ const resolvedPath = resolve(configPath);
2809
+ const appsIterator = sdk.listApps({ appKeys: [appKey] }).items();
2810
+ const apps = [];
2811
+ for await (const app2 of appsIterator) {
2812
+ apps.push(app2);
2813
+ break;
2814
+ }
2815
+ const app = apps[0];
2816
+ const currentImplementationId = app.current_implementation_id;
2817
+ const [implementationName, version] = currentImplementationId.split("@");
2818
+ if (!implementationName || !version) {
2819
+ throw new Error(
2820
+ `Invalid implementation ID format: ${currentImplementationId}. Expected format: <implementationName>@<version>`
2821
+ );
2822
+ }
2823
+ let config = { apps: {} };
2824
+ if (existsSync(resolvedPath)) {
2825
+ try {
2826
+ const configContent = readFileSync(resolvedPath, "utf8");
2827
+ config = JSON.parse(configContent);
2828
+ if (!config.apps) {
2829
+ config.apps = {};
2830
+ }
2831
+ } catch (error) {
2832
+ console.warn(
2833
+ `\u26A0\uFE0F Failed to parse existing config file, creating new one: ${error}`
2834
+ );
2835
+ config = { apps: {} };
2836
+ }
2837
+ }
2838
+ config.apps[appKey] = {
2839
+ implementationName,
2840
+ version
2841
+ };
2842
+ writeFileSync(resolvedPath, JSON.stringify(config, null, 2));
2843
+ return {
2844
+ data: {
2845
+ ...app,
2846
+ implementationName,
2847
+ version
2848
+ },
2849
+ configPath: resolvedPath
2850
+ };
2851
+ },
2852
+ LockVersionSchema.extend({
2853
+ configPath: z.string().optional().describe("Path to .zapierrc file (defaults to '.zapierrc')")
2854
+ })
2855
+ );
2856
+ return {
2857
+ lockVersion,
2858
+ context: {
2859
+ meta: {
2860
+ lockVersion: {
2861
+ categories: ["utility"],
2862
+ inputSchema: LockVersionSchema
2863
+ }
2864
+ }
2865
+ }
2866
+ };
2867
+ };
2597
2868
 
2598
2869
  // src/sdk.ts
2599
- function createSdk(initialSdk = {}, initialContext = { meta: {} }) {
2870
+ function createSdk(options = {}, initialSdk = {}, initialContext = { meta: {} }) {
2600
2871
  return {
2601
2872
  ...initialSdk,
2602
2873
  getContext: () => initialContext,
2603
- addPlugin(plugin, options = {}) {
2874
+ addPlugin(plugin, addPluginOptions = {}) {
2604
2875
  const currentSdkWithContext = {
2605
2876
  ...initialSdk,
2606
2877
  getContext: () => initialContext
2607
2878
  };
2608
2879
  const pluginResult = plugin({
2609
2880
  sdk: currentSdkWithContext,
2610
- context: initialContext,
2611
- ...options
2881
+ context: {
2882
+ ...initialContext,
2883
+ // Add the options that createSdk was called with to context
2884
+ options
2885
+ },
2886
+ ...addPluginOptions
2612
2887
  });
2613
2888
  const { context: pluginContext, ...sdkProperties } = pluginResult;
2614
2889
  const newSdk = { ...initialSdk, ...sdkProperties };
2615
2890
  let newContext = {
2616
2891
  ...initialContext,
2892
+ ...addPluginOptions,
2617
2893
  meta: initialContext.meta || {}
2618
2894
  };
2619
2895
  if (pluginContext) {
@@ -2634,12 +2910,12 @@ function createSdk(initialSdk = {}, initialContext = { meta: {} }) {
2634
2910
  };
2635
2911
  }
2636
2912
  }
2637
- return createSdk(newSdk, newContext);
2913
+ return createSdk(options, newSdk, newContext);
2638
2914
  }
2639
2915
  };
2640
2916
  }
2641
2917
  function createZapierSdk(options = {}) {
2642
- return createSdk().addPlugin(apiPlugin, options).addPlugin(listAppsPlugin).addPlugin(getAppPlugin).addPlugin(listActionsPlugin).addPlugin(getActionPlugin).addPlugin(listInputFieldsPlugin).addPlugin(runActionPlugin).addPlugin(listAuthenticationsPlugin).addPlugin(getAuthenticationPlugin).addPlugin(findFirstAuthenticationPlugin).addPlugin(findUniqueAuthenticationPlugin).addPlugin(requestPlugin).addPlugin(fetchPlugin).addPlugin(appsPlugin).addPlugin(getProfilePlugin).addPlugin(registryPlugin);
2918
+ return createSdk(options).addPlugin(apiPlugin).addPlugin(listAppsPlugin).addPlugin(manifestPlugin).addPlugin(getAppPlugin).addPlugin(listActionsPlugin).addPlugin(getActionPlugin).addPlugin(listInputFieldsPlugin).addPlugin(runActionPlugin).addPlugin(lockVersionPlugin).addPlugin(listAuthenticationsPlugin).addPlugin(getAuthenticationPlugin).addPlugin(findFirstAuthenticationPlugin).addPlugin(findUniqueAuthenticationPlugin).addPlugin(requestPlugin).addPlugin(fetchPlugin).addPlugin(appsPlugin).addPlugin(getProfilePlugin).addPlugin(registryPlugin);
2643
2919
  }
2644
2920
 
2645
2921
  export { ActionKeyPropertySchema, ActionTypePropertySchema, AppKeyPropertySchema, AuthenticationIdPropertySchema, DebugPropertySchema, InputsPropertySchema, LimitPropertySchema, OffsetPropertySchema, OutputPropertySchema, ParamsPropertySchema, RelayFetchSchema, RelayRequestSchema, ZapierActionError, ZapierApiError, ZapierAppNotFoundError, ZapierAuthenticationError, ZapierBundleError, ZapierConfigurationError, ZapierError, ZapierNotFoundError, ZapierResourceNotFoundError, ZapierTimeoutError, ZapierUnknownError, ZapierValidationError, actionKeyResolver, actionTypeResolver, appKeyResolver, appsPlugin, authenticationIdResolver, createSdk, createZapierSdk, fetchPlugin, formatErrorMessage, getResolutionOrder, getResolutionOrderForParams, getResolvableParams, getResolver, getResolversForMissingParams, getTokenFromCliLogin, getTokenFromEnv, getTokenFromEnvOrConfig, hasResolver, inputsResolver, isPositional, resolverRegistry };
@@ -2,7 +2,7 @@ import { createZapierApi } from "../../api";
2
2
  // API plugin requires no context and provides api in context
3
3
  export const apiPlugin = (params) => {
4
4
  // Extract all options - everything passed to the plugin
5
- const { fetch: customFetch = globalThis.fetch, baseUrl = "https://zapier.com", token, getToken, onEvent, debug = false, } = params;
5
+ const { fetch: customFetch = globalThis.fetch, baseUrl = "https://zapier.com", token, getToken, onEvent, debug = false, } = params.context.options;
6
6
  // Create the API client - it will handle token resolution internally
7
7
  const api = createZapierApi({
8
8
  baseUrl,
@@ -6,7 +6,7 @@ interface AppFactoryOptions {
6
6
  authenticationId: number;
7
7
  }
8
8
  interface BaseActionTypeProxy {
9
- [action: string]: (options?: ActionExecutionOptions) => any;
9
+ [action: string]: (options?: ActionExecutionOptions) => unknown;
10
10
  }
11
11
  interface FetchActionType {
12
12
  fetch: (url: string | URL, init?: RequestInit & {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/apps/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAGD,UAAU,mBAAmB;IAC3B,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,GAAG,CAAC;CAC7D;AAGD,UAAU,eAAe;IACvB,KAAK,EAAE,CACL,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,GAAG;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,KACE,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxB;AAGD,KAAK,eAAe,GAAG,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEtE,UAAU,QAAQ;IAChB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;CACjC;AAED,UAAU,UAAU;IAClB,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAAC;CACxC;AAGD,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACpC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/apps/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAGD,UAAU,mBAAmB;IAC3B,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC;CACjE;AAGD,UAAU,eAAe;IACvB,KAAK,EAAE,CACL,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,GAAG;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,KACE,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxB;AAGD,KAAK,eAAe,GAAG,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEtE,UAAU,QAAQ;IAChB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;CACjC;AAED,UAAU,UAAU;IAClB,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAAC;CACxC;AAGD,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACpC"}