diff --git a/CHANGELOG.md b/CHANGELOG.md index b56f0ea19..5dbcfb197 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,42 @@ +## 15.18.0 + +_released `2024-10-24`_ + +### cli + +- :nail_care: Fix a failing smoke test based on CLI package size (now that many docs are deleted) ([#899](https://github.com/zapier/zapier-platform/pull/899)) + +- :tada: Add OAuth2 to TypeScript `init` output ([#894](https://github.com/zapier/zapier-platform/pull/894)) + +### core + +- :tada: Adds `nx` argument to `z.cache.set()` ([#900](https://github.com/zapier/zapier-platform/pull/900)) + +- :bug: Force a `process.exit(1)` on catching an `EMFILE` error inside `checkMemory()` ([#901](https://github.com/zapier/zapier-platform/pull/901)) + +### schema + +None! + +### schema-to-ts + +- :tada: Type `z.request` responses and deprecate `.json` ([#895](https://github.com/zapier/zapier-platform/pull/895)) + +### misc + +- :scroll: Typo fixes and link changes ([#885](https://github.com/zapier/zapier-platform/pull/885)) +- :scroll: Add docs explaining why hidden triggers for dynamic dropdowns need to declare input fields ([#887](https://github.com/zapier/zapier-platform/pull/887)) +- :scroll: Migrate docs out of this monorepo ([#893](https://github.com/zapier/zapier-platform/pull/893)) +- :scroll: Updating doc links in `CHANGELOG` ([#898](https://github.com/zapier/zapier-platform/pull/898)) + + ## 15.17.0 _released `2024-10-11`_ Introducing three major updates, with the first two aimed at improving your development experience: -- The `zapier invoke` command: This powerful new command enables you to emulate Zapier's production environment locally. Test triggers, actions, and authentication flows right from your terminal without deploying to Zapier. This is especially valuable for debugging, development, and quick testing iterations. Learn more about the command in the [README](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#using-zapier-invoke-command) or by typing [`zapier invoke --help`](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md#invoke) in your teriminal. +- The `zapier invoke` command: This powerful new command enables you to emulate Zapier's production environment locally. Test triggers, actions, and authentication flows right from your terminal without deploying to Zapier. This is especially valuable for debugging, development, and quick testing iterations. Learn more about the command in the [README](https://docs.zapier.com/platform/reference/cli-docs#using-zapier-invoke-command) or by typing [`zapier invoke --help`](https://github.com/zapier/zapier-platform/blob/main/packages/cli/docs/cli.md#invoke) in your terminal. - Refreshed "[typescript](https://github.com/zapier/zapier-platform/tree/main/example-apps/typescript)" project template: We've updated the "typescript" project template with the latest type definitions. Enjoy enhanced type safety, improved autocompletion, and a smoother coding experience overall. - Although we've removed Node.js 16 from `zapier-platform-cli`'s CI testing, it still works on Node.js 16, except for the `zapier invoke auth start` command. But using Node.js 18 or later is recommended, as we'll be dropping support for Node.js 16 in an upcoming major release. @@ -42,7 +74,7 @@ None! - :nail_care: Return a descriptive error when a filename cannot be uploaded ([#874](https://github.com/zapier/zapier-platform/pull/874)) -### schema +### schema None! @@ -51,7 +83,7 @@ None! - :scroll: Add `canary` command to docs ([#870](https://github.com/zapier/zapier-platform/pull/870)) - :scroll: Add instructions for installing the Zapier Platform development version to docs ([#873](https://github.com/zapier/zapier-platform/pull/870)) -## 15.16.0 +## 15.16.0 _released `2024-09-24`_ @@ -63,7 +95,7 @@ _released `2024-09-24`_ None! -### schema +### schema None! @@ -76,7 +108,7 @@ None! _released `2024-09-18`_ -This release introduces "[Buffered Create Actions](https://github.com/zapier/zapier-platform/blob/8353f32cba12da2a845419f0024b0029090437d9/packages/cli/README.md#buffered-create-actions)", currently only available for **internal** use. A Buffered Create allows you to create objects in bulk with a single or fewer API request(s). This is useful when you want to reduce the number of requests made to your server. When enabled, Zapier holds the data until the buffer reaches a size limit or a certain time has passed, then sends the buffered data using the `performBuffer` function you define. +This release introduces "[Buffered Create Actions](https://docs.zapier.com/platform/reference/cli-docs#buffered-create-actions)", currently only available for **internal** use. A Buffered Create allows you to create objects in bulk with a single or fewer API request(s). This is useful when you want to reduce the number of requests made to your server. When enabled, Zapier holds the data until the buffer reaches a size limit or a certain time has passed, then sends the buffered data using the `performBuffer` function you define. ### cli @@ -150,7 +182,7 @@ None! - :hammer: Add `customOptions` field to z.request options ([#846](https://github.com/zapier/zapier-platform/pull/846)) -## 15.13.0 +## 15.13.0 _released `2024-08-21`_ @@ -162,7 +194,7 @@ None! None! -### schema +### schema - :nail_care: Add configurable poll delay for HookToPoll ([#844](https://github.com/zapier/zapier-platform/pull/844)) ### misc @@ -173,11 +205,11 @@ None! _released `2024-08-16`_ -### cli +### cli - :nail_care: Introduce `zapier pull` command ([#838](https://github.com/zapier/zapier-platform/pull/838)) - :nail_care: Handle subheadings when interpreting the changelog ([#827](https://github.com/zapier/zapier-platform/pull/827)) -### core +### core - :bug: Properly type HTTP Options, replacing generic `object` types ([#840](https://github.com/zapier/zapier-platform/pull/840)) - :bug: Allow Async Middleware Functions Types ([#826](https://github.com/zapier/zapier-platform/pull/826)) @@ -188,7 +220,7 @@ _released `2024-08-16`_ ### schema-to-ts - :bug: Simplify and correct Array types in Schema to TS conversion ([#835](https://github.com/zapier/zapier-platform/pull/835)) -### misc +### misc - :scroll: Improve documentation accuracy regarding `primary: true` limitations ([#836](https://github.com/zapier/zapier-platform/pull/836)) - :scroll: Document limitations regarding `primary` in `outputFields` ([#834](https://github.com/zapier/zapier-platform/pull/834)) @@ -207,7 +239,7 @@ None! ### schema -None! +None! ## 15.11.0 @@ -420,7 +452,7 @@ _released `2024-03-26`_ ### schema -- :tada: Allow to set `primary` in `outputFields` to define the unique key for [deduplication](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#how-does-deduplication-work) ([#754](https://github.com/zapier/zapier-platform/pull/754)) +- :tada: Allow to set `primary` in `outputFields` to define the unique key for [deduplication](https://docs.zapier.com/platform/reference/cli-docs#how-does-deduplication-work) ([#754](https://github.com/zapier/zapier-platform/pull/754)) - :test_tube: Add support for `overrides` in the throttle configuration ([#755](https://github.com/zapier/zapier-platform/pull/755)) - :test_tube: Add support for `key` in the throttle configuration and `action` scope ([#757](https://github.com/zapier/zapier-platform/pull/757)) @@ -514,9 +546,7 @@ _released `2023-11-01`_ ### misc - :hammer: Bump @babel/traverse from 7.14.0 to 7.23.2 ([#715](https://github.com/zapier/zapier-platform/pull/715)) - - :scroll: Fix broken link in README-source.md ([#714](https://github.com/zapier/zapier-platform/pull/714)) - - :scroll: Fix broken link in readme.md ([#713](https://github.com/zapier/zapier-platform/pull/713)) ## 15.4.1 @@ -789,7 +819,7 @@ Version `14.0.0` is a breaking change release that contains several important up 3. :exclamation: Now you are required to provide meta information about your app, such as your intended audience and app category (if that information isn't already provided). If you are missing this information, you will be blocked from making updates to your integration (`zapier promote`, `zapier upload`, `zapier push`). Use `zapier register` with `zapier-platform-core@14.0.0` or go to `https://developer.zapier.com/app/{app_id}/version/{version}/settings` to fill it out. -4. On v14, OAuth2 implementation now supports PKCE! See [our documentation](https://github.com/zapier/zapier-platform/blob/zapier-platform-cli@14.0.0/packages/cli/README.md#oauth2-with-pkce) for details. +4. On v14, OAuth2 implementation now supports PKCE! See [our documentation](https://docs.zapier.com/platform/reference/cli-docs#oauth2-with-pkce) for details. Read on for a detailed set of release notes. Again, :exclamation: are BREAKING CHANGEs. @@ -821,7 +851,7 @@ Read on for a detailed set of release notes. Again, :exclamation: are BREAKING C - :scroll: Replace issue templates with GitHub forms, update CODEOWNERS ([#622](https://github.com/zapier/zapier-platform/pull/622)) ## Old Releases - + diff --git a/example-apps/babel/package.json b/example-apps/babel/package.json index 7fc7f2a62..16fcc38be 100644 --- a/example-apps/babel/package.json +++ b/example-apps/babel/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "babel-polyfill": "6.26.0", - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "babel-cli": "6.26.0", diff --git a/example-apps/basic-auth/package.json b/example-apps/basic-auth/package.json index 90502b1e5..798004d17 100644 --- a/example-apps/basic-auth/package.json +++ b/example-apps/basic-auth/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/callback/package.json b/example-apps/callback/package.json index f81e35c55..311cfcc28 100644 --- a/example-apps/callback/package.json +++ b/example-apps/callback/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/create/package.json b/example-apps/create/package.json index 9388c1359..df6c1090a 100644 --- a/example-apps/create/package.json +++ b/example-apps/create/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/custom-auth/package.json b/example-apps/custom-auth/package.json index 9ea667cf9..d5ab92495 100644 --- a/example-apps/custom-auth/package.json +++ b/example-apps/custom-auth/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/digest-auth/package.json b/example-apps/digest-auth/package.json index 0a292e9d2..f4d86f696 100644 --- a/example-apps/digest-auth/package.json +++ b/example-apps/digest-auth/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/dynamic-dropdown/package.json b/example-apps/dynamic-dropdown/package.json index c0d57b355..77eaf0302 100644 --- a/example-apps/dynamic-dropdown/package.json +++ b/example-apps/dynamic-dropdown/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/files/package.json b/example-apps/files/package.json index 8510bae55..68fa3fe2e 100644 --- a/example-apps/files/package.json +++ b/example-apps/files/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0", + "zapier-platform-core": "15.18.0", "form-data": "4.0.0" }, "devDependencies": { diff --git a/example-apps/github/package.json b/example-apps/github/package.json index 9ec9abf0d..600b882d9 100644 --- a/example-apps/github/package.json +++ b/example-apps/github/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^26.6.3", diff --git a/example-apps/middleware/package.json b/example-apps/middleware/package.json index c05cdc2cf..56d44b3b0 100644 --- a/example-apps/middleware/package.json +++ b/example-apps/middleware/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "lodash": "4.17.19", - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/minimal/package.json b/example-apps/minimal/package.json index e678d7a39..9285ce710 100644 --- a/example-apps/minimal/package.json +++ b/example-apps/minimal/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/oauth1-trello/package.json b/example-apps/oauth1-trello/package.json index 69dba4120..8774be472 100644 --- a/example-apps/oauth1-trello/package.json +++ b/example-apps/oauth1-trello/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/oauth1-tumblr/package.json b/example-apps/oauth1-tumblr/package.json index cb0932ea8..4943811c4 100644 --- a/example-apps/oauth1-tumblr/package.json +++ b/example-apps/oauth1-tumblr/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/oauth1-twitter/package.json b/example-apps/oauth1-twitter/package.json index 162de9a69..e87581871 100644 --- a/example-apps/oauth1-twitter/package.json +++ b/example-apps/oauth1-twitter/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/oauth2/package.json b/example-apps/oauth2/package.json index 01e6b4f68..addbc3260 100644 --- a/example-apps/oauth2/package.json +++ b/example-apps/oauth2/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/onedrive/package.json b/example-apps/onedrive/package.json index 311596a81..668ca6d0f 100644 --- a/example-apps/onedrive/package.json +++ b/example-apps/onedrive/package.json @@ -22,7 +22,7 @@ "content-disposition": "0.5.2", "lodash": "4.17.11", "node-fetch": "1.7.1", - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "eslint": "3.19.0", diff --git a/example-apps/resource/package.json b/example-apps/resource/package.json index 2cf958969..a69972b3d 100644 --- a/example-apps/resource/package.json +++ b/example-apps/resource/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/rest-hooks/package.json b/example-apps/rest-hooks/package.json index d3d08ed18..24fccf9ea 100644 --- a/example-apps/rest-hooks/package.json +++ b/example-apps/rest-hooks/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/search-or-create/package.json b/example-apps/search-or-create/package.json index 3c869b325..112cf542b 100644 --- a/example-apps/search-or-create/package.json +++ b/example-apps/search-or-create/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/search/package.json b/example-apps/search/package.json index bc52d9d14..bdcb37b0f 100644 --- a/example-apps/search/package.json +++ b/example-apps/search/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/session-auth/package.json b/example-apps/session-auth/package.json index ccebe91fd..6db211a36 100644 --- a/example-apps/session-auth/package.json +++ b/example-apps/session-auth/package.json @@ -7,7 +7,7 @@ "test": "jest --testTimeout 10000" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "jest": "^25.5.3" diff --git a/example-apps/trigger/package.json b/example-apps/trigger/package.json index ccf7a1025..2e87007de 100644 --- a/example-apps/trigger/package.json +++ b/example-apps/trigger/package.json @@ -15,7 +15,7 @@ "npm": ">=5.6.0" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "mocha": "^5.2.0", diff --git a/example-apps/typescript/package.json b/example-apps/typescript/package.json index 85309b3c2..7d9f24fda 100644 --- a/example-apps/typescript/package.json +++ b/example-apps/typescript/package.json @@ -10,7 +10,7 @@ "_zapier-build": "npm run build" }, "dependencies": { - "zapier-platform-core": "15.17.0" + "zapier-platform-core": "15.18.0" }, "devDependencies": { "rimraf": "^5.0.10", diff --git a/packages/cli/package.json b/packages/cli/package.json index 90f7663dd..36453a39c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "zapier-platform-cli", - "version": "15.17.0", + "version": "15.18.0", "description": "The CLI for managing integrations in Zapier Developer Platform.", "repository": "zapier/zapier-platform", "homepage": "https://platform.zapier.com/", diff --git a/packages/cli/src/oclif/commands/invoke.js b/packages/cli/src/oclif/commands/invoke.js index f4668c06c..323ba34ab 100644 --- a/packages/cli/src/oclif/commands/invoke.js +++ b/packages/cli/src/oclif/commands/invoke.js @@ -249,6 +249,7 @@ const testAuth = async (authData, meta, zcacheTestObj) => { }, zcacheTestObj, customLogger, + calledFromCliInvoke: true, }); endSpinner(); return result; @@ -367,7 +368,7 @@ class InvokeCommand extends BaseCommand { ]); } - async startCustomAuth(authFields) { + async startCustomAuth(authFields, zcacheTestObj) { if (this.nonInteractive) { throw new Error( 'The `auth start` subcommand for "custom" authentication type only works in interactive mode.' @@ -376,7 +377,7 @@ class InvokeCommand extends BaseCommand { return this.promptForAuthFields(authFields); } - async startOAuth2(appDefinition) { + async startOAuth2(appDefinition, zcacheTestObj) { const redirectUri = this.flags['redirect-uri']; const port = this.flags['local-port']; const env = {}; @@ -428,6 +429,9 @@ class InvokeCommand extends BaseCommand { state: stateParam, }, }, + zcacheTestObj, + customLogger, + calledFromCliInvoke: true, }); if (!authorizeUrl.includes('&scope=')) { const scope = appDefinition.authentication.oauth2Config.scope; @@ -499,13 +503,16 @@ class InvokeCommand extends BaseCommand { redirect_uri: redirectUri, }, }, + zcacheTestObj, + customLogger, + calledFromCliInvoke: true, }); endSpinner(); return authData; } - async startSessionAuth(appDefinition) { + async startSessionAuth(appDefinition, zcacheTestObj) { if (this.nonInteractive) { throw new Error( 'The `auth start` subcommand for "session" authentication type only works in interactive mode.' @@ -522,13 +529,16 @@ class InvokeCommand extends BaseCommand { bundle: { authData, }, + zcacheTestObj, + customLogger, + calledFromCliInvoke: true, }); endSpinner(); return { ...authData, ...sessionData }; } - async startAuth(appDefinition) { + async startAuth(appDefinition, zcacheTestObj) { const authentication = appDefinition.authentication; if (!authentication) { console.warn( @@ -542,11 +552,11 @@ class InvokeCommand extends BaseCommand { case 'basic': return this.startBasicAuth(authentication.fields); case 'custom': - return this.startCustomAuth(authentication.fields); + return this.startCustomAuth(authentication.fields, zcacheTestObj); case 'oauth2': - return this.startOAuth2(appDefinition); + return this.startOAuth2(appDefinition, zcacheTestObj); case 'session': - return this.startSessionAuth(appDefinition); + return this.startSessionAuth(appDefinition, zcacheTestObj); default: // TODO: Add support for 'digest' and 'oauth1' throw new Error( @@ -555,7 +565,7 @@ class InvokeCommand extends BaseCommand { } } - async refreshOAuth2(appDefinition, authData) { + async refreshOAuth2(appDefinition, authData, zcacheTestObj) { startSpinner('Invoking authentication.oauth2Config.refreshAccessToken'); const newAuthData = await localAppCommand({ @@ -564,13 +574,16 @@ class InvokeCommand extends BaseCommand { bundle: { authData, }, + zcacheTestObj, + customLogger, + calledFromCliInvoke: true, }); endSpinner(); return newAuthData; } - async refreshSessionAuth(appDefinition, authData) { + async refreshSessionAuth(appDefinition, authData, zcacheTestObj) { startSpinner('Invoking authentication.sessionConfig.perform'); const sessionData = await localAppCommand({ @@ -579,13 +592,16 @@ class InvokeCommand extends BaseCommand { bundle: { authData, }, + zcacheTestObj, + customLogger, + calledFromCliInvoke: true, }); endSpinner(); return sessionData; } - async refreshAuth(appDefinition, authData) { + async refreshAuth(appDefinition, authData, zcacheTestObj) { const authentication = appDefinition.authentication; if (!authentication) { console.warn( @@ -602,9 +618,9 @@ class InvokeCommand extends BaseCommand { } switch (authentication.type) { case 'oauth2': - return this.refreshOAuth2(appDefinition, authData); + return this.refreshOAuth2(appDefinition, authData, zcacheTestObj); case 'session': - return this.refreshSessionAuth(appDefinition, authData); + return this.refreshSessionAuth(appDefinition, authData, zcacheTestObj); default: throw new Error( `This command doesn't support refreshing authentication type "${authentication.type}".` @@ -840,6 +856,7 @@ class InvokeCommand extends BaseCommand { zcacheTestObj, cursorTestObj, customLogger, + calledFromCliInvoke: true, }); endSpinner(); @@ -873,6 +890,7 @@ class InvokeCommand extends BaseCommand { zcacheTestObj, cursorTestObj, customLogger, + calledFromCliInvoke: true, }); endSpinner(); @@ -952,7 +970,10 @@ class InvokeCommand extends BaseCommand { }; switch (actionKey) { case 'start': { - const newAuthData = await this.startAuth(appDefinition); + const newAuthData = await this.startAuth( + appDefinition, + zcacheTestObj + ); if (_.isEmpty(newAuthData)) { return; } @@ -963,7 +984,11 @@ class InvokeCommand extends BaseCommand { return; } case 'refresh': { - const newAuthData = await this.refreshAuth(appDefinition, authData); + const newAuthData = await this.refreshAuth( + appDefinition, + authData, + zcacheTestObj + ); if (_.isEmpty(newAuthData)) { return; } diff --git a/packages/core/package.json b/packages/core/package.json index bfd4e3f84..adfa477d7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "zapier-platform-core", - "version": "15.17.0", + "version": "15.18.0", "description": "The core SDK for CLI apps in the Zapier Developer Platform.", "repository": "zapier/zapier-platform", "homepage": "https://platform.zapier.com/", @@ -53,7 +53,7 @@ "node-fetch": "2.6.7", "oauth-sign": "0.9.0", "semver": "7.5.2", - "zapier-platform-schema": "15.17.0" + "zapier-platform-schema": "15.18.0" }, "devDependencies": { "@types/node-fetch": "^2.6.11", diff --git a/packages/core/src/tools/create-cache.js b/packages/core/src/tools/create-cache.js index 96040c464..f2d6e8513 100644 --- a/packages/core/src/tools/create-cache.js +++ b/packages/core/src/tools/create-cache.js @@ -12,7 +12,8 @@ const createCache = (input) => { key, value = null, ttl = null, - scope = null + scope = null, + nx = null ) => { if (!rpc) { throw new Error('rpc is not available'); @@ -36,6 +37,10 @@ const createCache = (input) => { ); } + if (nx !== null && !_.isBoolean(nx)) { + throw new TypeError('nx must be a boolean'); + } + ensureJSONEncodable(value); }; @@ -46,10 +51,10 @@ const createCache = (input) => { const result = await rpc('zcache_get', key, scope); return result ? JSON.parse(result) : null; }, - set: async (key, value, ttl = null, scope = null) => { - runValidationChecks(rpc, key, value, ttl, scope); + set: async (key, value, ttl = null, scope = null, nx = null) => { + runValidationChecks(rpc, key, value, ttl, scope, nx); - return await rpc('zcache_set', key, JSON.stringify(value), ttl, scope); + return await rpc('zcache_set', key, JSON.stringify(value), ttl, scope, nx); }, delete: async (key, scope = null) => { runValidationChecks(rpc, key, scope); diff --git a/packages/core/src/tools/create-http-patch.js b/packages/core/src/tools/create-http-patch.js index fa77dfd5f..1b1df51be 100644 --- a/packages/core/src/tools/create-http-patch.js +++ b/packages/core/src/tools/create-http-patch.js @@ -48,7 +48,7 @@ const createHttpPatch = (event) => { return originalRequest(options, callback); } - // Ignore requests made via the request client + // Ignore requests made via the request client (z.request) if (_.get(options.headers, 'user-agent', []).indexOf('Zapier') !== -1) { return originalRequest(options, callback); } @@ -112,7 +112,14 @@ const createHttpPatch = (event) => { } }; - response.on('data', (chunk) => chunks.push(chunk)); + const originalEmit = response.emit; + + response.emit = function (event, ...args) { + if (event === 'data') { + chunks.push(args[0]); + } + return originalEmit.apply(this, [event, ...args]); + }; response.on('end', logResponse); response.on('error', logResponse); diff --git a/packages/core/src/tools/create-lambda-handler.js b/packages/core/src/tools/create-lambda-handler.js index 257c9c79c..17ca2c353 100644 --- a/packages/core/src/tools/create-lambda-handler.js +++ b/packages/core/src/tools/create-lambda-handler.js @@ -17,6 +17,7 @@ const createLogger = require('./create-logger'); const createRpcClient = require('./create-rpc-client'); const environmentTools = require('./environment'); const schemaTools = require('./schema'); +const wrapFetchWithLogger = require('./fetch-logger'); const ZapierPromise = require('./promise'); const isDefinedPrimitive = (value) => { @@ -192,11 +193,12 @@ const createLambdaHandler = (appRawOrPath) => { context.callbackWaitsForEmptyEventLoop = true; // replace native Promise with bluebird (works better with domains) - if (!event.calledFromCli) { + if (!event.calledFromCli || event.calledFromCliInvoke) { ZapierPromise.patchGlobal(); } - // If we're running out of memory, exit the process. Backend will try again. + // If we're running out of memory or file descriptors, force exit the process. + // The backend will try again via @retry(ProcessExitedException). checkMemory(event); environmentTools.cleanEnvironment(); @@ -252,10 +254,16 @@ const createLambdaHandler = (appRawOrPath) => { const { skipHttpPatch } = appRaw.flags || {}; // Adds logging for _all_ kinds of http(s) requests, no matter the library - if (!skipHttpPatch && !event.calledFromCli) { + if ( + !skipHttpPatch && + (!event.calledFromCli || event.calledFromCliInvoke) + ) { const httpPatch = createHttpPatch(event); httpPatch(require('http'), logger); httpPatch(require('https'), logger); // 'https' needs to be patched separately + if (global.fetch) { + global.fetch = wrapFetchWithLogger(global.fetch, logger); + } } // TODO: Avoid calling prepareApp(appRaw) repeatedly here as createApp() diff --git a/packages/core/src/tools/fetch-logger.js b/packages/core/src/tools/fetch-logger.js new file mode 100644 index 000000000..693adec20 --- /dev/null +++ b/packages/core/src/tools/fetch-logger.js @@ -0,0 +1,107 @@ +const _ = require('lodash'); + +const { ALLOWED_HTTP_DATA_CONTENT_TYPES } = require('./http'); + +const stringifyRequestData = (data) => { + // Be careful not to consume the data if it's a stream + if (typeof data === 'string') { + return data; + } else if (data instanceof URLSearchParams) { + return data.toString(); + } else if (global.FormData && data instanceof global.FormData) { + return ''; + } else { + // See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#setting_a_body + // for other possible body types + return ''; + } +}; + +const normalizeRequestInfo = (input, init) => { + const result = { + method: 'GET', + headers: {}, + data: '', + }; + + if (global.Request && input instanceof global.Request) { + result.url = input.url; + result.method = input.method || result.method; + result.headers = + Object.fromEntries(input.headers.entries()) || result.headers; + if (input.body) { + result.data = stringifyRequestData(input.body); + } + } else if (typeof input.toString === 'function') { + // This condition includes `typeof input === 'string'` as well + result.url = input.toString(); + } else { + // Don't log if we don't recognize the input type + return null; + } + + if (init) { + result.method = init.method || result.method; + result.headers = init.headers || result.headers; + if (init.body) { + result.data = stringifyRequestData(init.body); + } + } + + return result; +}; + +// Is this request made by z.request()? +const isZapierUserAgent = (headers) => + _.get(headers, 'user-agent', []).indexOf('Zapier') !== -1; + +const shouldIncludeResponseContent = (contentType) => { + for (const ctype of ALLOWED_HTTP_DATA_CONTENT_TYPES) { + if (contentType.includes(ctype)) { + return true; + } + } + return false; +}; + +const stringifyResponseContent = async (response) => { + // Be careful not to consume the original response body, which is why we clone it + return response.clone().text(); +}; + +// Usage: +// global.fetch = wrapFetchWithLogger(global.fetch, logger); +const wrapFetchWithLogger = (fetchFunc, logger) => { + if (fetchFunc.patchedByZapier) { + return fetchFunc; + } + + const newFetch = async function (input, init) { + const response = await fetchFunc(input, init); + const requestInfo = normalizeRequestInfo(input, init); + if (requestInfo && !isZapierUserAgent(requestInfo.headers)) { + const responseContentType = response.headers.get('content-type'); + + logger(`${response.status} ${requestInfo.method} ${requestInfo.url}`, { + log_type: 'http', + request_type: 'patched-devplatform-outbound', + request_url: requestInfo.url, + request_method: requestInfo.method, + request_headers: requestInfo.headers, + request_data: requestInfo.data, + request_via_client: false, + response_status_code: response.status, + response_headers: Object.fromEntries(response.headers.entries()), + response_content: shouldIncludeResponseContent(responseContentType) + ? await stringifyResponseContent(response) + : '', + }); + } + return response; + }; + + newFetch.patchedByZapier = true; + return newFetch; +}; + +module.exports = wrapFetchWithLogger; diff --git a/packages/core/src/tools/http.js b/packages/core/src/tools/http.js index ac4c1616d..b97dc2c66 100644 --- a/packages/core/src/tools/http.js +++ b/packages/core/src/tools/http.js @@ -7,6 +7,7 @@ const JSON_TYPE_UTF8 = 'application/json; charset=utf-8'; const BINARY_TYPE = 'application/octet-stream'; const HTML_TYPE = 'text/html'; const TEXT_TYPE = 'text/plain'; +const TEXT_TYPE_UTF8 = 'text/plain; charset=utf-8'; const YAML_TYPE = 'application/yaml'; const XML_TYPE = 'application/xml'; const JSONAPI_TYPE = 'application/vnd.api+json'; @@ -17,6 +18,7 @@ const ALLOWED_HTTP_DATA_CONTENT_TYPES = new Set([ JSON_TYPE_UTF8, HTML_TYPE, TEXT_TYPE, + TEXT_TYPE_UTF8, YAML_TYPE, XML_TYPE, JSONAPI_TYPE, diff --git a/packages/core/src/tools/memory-checker.js b/packages/core/src/tools/memory-checker.js index b198a6d51..959dc3c47 100644 --- a/packages/core/src/tools/memory-checker.js +++ b/packages/core/src/tools/memory-checker.js @@ -8,22 +8,31 @@ let zrun = 0; const checkMemory = (event) => { event = event || {}; + let memUsage; + + try { + memUsage = process.memoryUsage(); + } catch (err) { + if (err.code === 'EMFILE') { + console.error( + 'Force killing process by Zapier for too many open file descriptors' + ); + + /* eslint no-process-exit: 0 */ + process.exit(1); + } else { + throw err; + } + } + zrun += 1; if (!constants.IS_TESTING && !event.calledFromCli) { - console.log( - 'ZID:', - zid, - 'pid', - 'ZRUN:', - zrun, - 'RSSMEM:', - process.memoryUsage() - ); + console.log('ZID:', zid, 'pid', 'ZRUN:', zrun, 'RSSMEM:', memUsage); } if ( zrun > constants.KILL_MIN_LIMIT && - process.memoryUsage().rss > constants.KILL_MAX_LIMIT + memUsage.rss > constants.KILL_MAX_LIMIT ) { // should throw "Process exited before completing request" // and a @retry in our stack will attempt again - and this diff --git a/packages/core/test/tools/create-cache.js b/packages/core/test/tools/create-cache.js index b30d51dde..4af419a92 100644 --- a/packages/core/test/tools/create-cache.js +++ b/packages/core/test/tools/create-cache.js @@ -73,6 +73,12 @@ describe('zcache: get, set, delete', () => { .should.be.rejectedWith('ttl must be an integer'); }); + it('zcache_set: should throw error for a non-boolean nx', async () => { + await cache + .set('random-key', 'random-value', 1, [], 1) + .should.be.rejectedWith('nx must be a boolean'); + }); + it('zcache_delete: should delete the cache entry of an existing key', async () => { mockRpcCall(true); diff --git a/packages/core/test/tools/create-http-patch.js b/packages/core/test/tools/create-http-patch.js index e47a512e7..1d90d72b5 100644 --- a/packages/core/test/tools/create-http-patch.js +++ b/packages/core/test/tools/create-http-patch.js @@ -1,13 +1,20 @@ 'use strict'; const EventEmitter = require('events'); +const https = require('node:https'); const should = require('should'); -const { JSON_TYPE, XML_TYPE, BINARY_TYPE } = require('../../src/tools/http'); +const { + BINARY_TYPE, + JSON_TYPE, + TEXT_TYPE, + XML_TYPE, +} = require('../../src/tools/http'); const createAppTester = require('../../src/tools/create-app-tester'); const createHttpPatch = require('../../src/tools/create-http-patch'); const appDefinition = require('../userapp'); +const { HTTPBIN_URL } = require('../constants'); describe('create http patch', () => { it('should patch by default', async () => { @@ -152,6 +159,89 @@ describe('create http patch', () => { ]); }); + it('should not cause missing bytes for late listener', (done) => { + // Wrap https.request so httpPatch doesn't modify the real https module + const fakeHttpModule = { + request: (options, callback) => https.request(options, callback), + }; + + const logBuffer = []; + const stubLogger = (_, data) => { + logBuffer.push(data); + }; + + const httpPatch = createHttpPatch({}); + httpPatch(fakeHttpModule, stubLogger); + + const chunks = []; + const req = fakeHttpModule.request( + `${HTTPBIN_URL}/stream/50?chunk_size=100`, + (res) => { + // Make sure it's a response object + should(res.statusCode).eql(200); + should(res.headers['content-type']).containEql(TEXT_TYPE); + + setTimeout(() => { + // Suppose this listener is some HTTP client library that consumes the + // response stream. We use setTimeout to recreate the scenario where + // the listener is attached AFTER the logger has already started + // consuming the stream. + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + // Assert the library listener gets complete data without missing + // bytes + { + // Make sure the endpoint did return more than one chunk. + // Otherwise, we should switch to a different endpoint that does. + should(chunks.length).above(1); + + const content = Buffer.concat(chunks).toString(); + const lines = content.split('\n').filter((line) => line); + should(lines).have.length(50); + + for (let i = 0; i < lines.length; i++) { + const obj = JSON.parse(lines[i]); + should(obj.id).eql(i); + } + } + // Assert the logger listener writes the log as expected + { + // One request, one log + should(logBuffer).have.length(1); + + const log = logBuffer[0]; + should(log).containEql({ + log_type: 'http', + request_data: '', + request_method: 'GET', + request_type: 'patched-devplatform-outbound', + request_url: + 'https://httpbin.zapier-tooling.com/stream/50?chunk_size=100', + request_via_client: false, + response_status_code: 200, + }); + + const loggedIds = Array.from( + log.response_content.matchAll(/"id":(\d+)/g), + (m) => m[1] + ); + should(loggedIds).have.length(50); + for (let i = 0; i < loggedIds.length; i++) { + const id = parseInt(loggedIds[i]); + should(id).eql(i); + } + } + + done(); + }); + }); + } + ); + req.end(); + }); + // when we run this test, we have to run it without any other test calling createAppTester // this block is skipped because there's no way to un-modify 'http' once we've done it // it's skipped in the main suite and run on its own afterwards diff --git a/packages/core/test/tools/fetch-logger.js b/packages/core/test/tools/fetch-logger.js new file mode 100644 index 000000000..e06eaab74 --- /dev/null +++ b/packages/core/test/tools/fetch-logger.js @@ -0,0 +1,207 @@ +/* global Request */ + +const assert = require('node:assert/strict'); + +const { HTTPBIN_URL } = require('../constants'); +const wrapFetchWithLogger = require('../../src/tools/fetch-logger'); + +describe('wrap fetch with logger', () => { + const logs = []; + const logger = (message, data) => { + logs.push({ message, data }); + }; + const newFetch = wrapFetchWithLogger(global.fetch, logger); + + beforeEach(() => { + logs.length = 0; + }); + + it('should log GET with url string input', async () => { + const url = `${HTTPBIN_URL}/get?foo=bar`; + const response = await newFetch(url); + const data = await response.json(); + + // Make sure fetch works as original + assert.equal(response.status, 200); + assert.deepEqual(data.args.foo, ['bar']); + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 GET ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'GET'); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('application/json')); + + const loggedContent = JSON.parse(log.data.response_content); + assert.deepEqual(loggedContent.args.foo, ['bar']); + }); + + it('should log POST with url string input', async () => { + const url = `${HTTPBIN_URL}/post`; + const response = await newFetch(url, { method: 'POST', body: 'hello' }); + const data = await response.json(); + + // Make sure fetch works as original + assert.equal(response.status, 200); + assert.equal(data.data, 'hello'); + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 POST ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'POST'); + assert.equal(log.data.request_data, 'hello'); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('application/json')); + + const loggedContent = JSON.parse(log.data.response_content); + assert.equal(loggedContent.data, 'hello'); + }); + + it('should log GET for URL object input', async () => { + const url = new URL(`${HTTPBIN_URL}/get?foo=bar`); + const response = await newFetch(url); + const data = await response.json(); + + // Make sure fetch works as original + assert.equal(response.status, 200); + assert.deepEqual(data.args.foo, ['bar']); + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 GET ${url}`); + assert.equal(log.data.request_url, url.toString()); + assert.equal(log.data.request_method, 'GET'); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('application/json')); + + const loggedContent = JSON.parse(log.data.response_content); + assert.deepEqual(loggedContent.args.foo, ['bar']); + }); + + it('should log POST for Request object input', async () => { + const url = `${HTTPBIN_URL}/post`; + const request = new Request(url, { method: 'POST', body: 'hello' }); + const response = await newFetch(request); + const data = await response.json(); + + // Make sure fetch works as original + assert.equal(response.status, 200); + assert.equal(data.data, 'hello'); + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 POST ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'POST'); + // Request.body is always a ReadableStream or null, + // so we don't log it (for now) + assert.equal(log.data.request_data, ''); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('application/json')); + + const loggedContent = JSON.parse(log.data.response_content); + assert.equal(loggedContent.data, 'hello'); + }); + + it('should log correctly if Request object is overriden', async () => { + const url = `${HTTPBIN_URL}/put`; + const request = new Request(url, { + method: 'POST', + body: 'hello', + headers: { 'x-api-key': '12345' }, + }); + const response = await newFetch(request, { + // These options should override the ones in the Request object + method: 'PUT', + body: 'world', + headers: { + authorization: 'Bearer 67890', + }, + }); + const data = await response.json(); + + assert.equal(response.status, 200); + assert.equal(data.data, 'world'); + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 PUT ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'PUT'); + assert.equal(log.data.request_data, 'world'); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('application/json')); + + const loggedContent = JSON.parse(log.data.response_content); + assert.equal(loggedContent.data, 'world'); + }); + + it('should not interfere response body streaming', async () => { + const url = `${HTTPBIN_URL}/stream/50?chunk_size=100`; + const response = await newFetch(url); + const text = await response.text(); + const lines = text.split('\n').filter((line) => line); + + assert.equal(response.status, 200); + assert.equal(lines.length, 50); + + for (let i = 0; i < lines.length; i++) { + const obj = JSON.parse(lines[i]); + assert.equal(obj.id, i); + } + + assert.equal(logs.length, 1); + + const log = logs[0]; + assert.equal(log.message, `200 GET ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'GET'); + assert.equal(log.data.request_data, ''); + assert.equal(log.data.response_status_code, 200); + + const loggedHeaders = log.data.response_headers; + assert.ok(loggedHeaders['content-type'].startsWith('text/plain')); + + const loggedContent = log.data.response_content; + const contentLines = loggedContent.split('\n').filter((line) => line); + assert.equal(contentLines.length, 50); + + for (let i = 0; i < contentLines.length; i++) { + const obj = JSON.parse(contentLines[i]); + assert.equal(obj.id, i); + } + }); + + it('should not log requests with Zapier user-agent', async () => { + const url = `${HTTPBIN_URL}/get?made_by=z.request`; + const response = await newFetch(url, { + headers: { + 'user-agent': 'Zapier', + }, + }); + const data = await response.json(); + + assert.equal(response.status, 200); + assert.deepEqual(data.args.made_by, ['z.request']); + + // No logs should be created + assert.equal(logs.length, 0); + }); +}); diff --git a/packages/core/types/zapier.generated.d.ts b/packages/core/types/zapier.generated.d.ts index de8080b46..d843dc76c 100644 --- a/packages/core/types/zapier.generated.d.ts +++ b/packages/core/types/zapier.generated.d.ts @@ -4,7 +4,7 @@ * files, and/or the schema-to-ts tool and run its CLI to regenerate * these typings. * - * zapier-platform-schema version: 15.17.0 + * zapier-platform-schema version: 15.18.0 * schema-to-ts compiler version: 0.1.0 */ diff --git a/packages/schema/docs/build/schema.md b/packages/schema/docs/build/schema.md index b4b9763af..b7c8502b4 100644 --- a/packages/schema/docs/build/schema.md +++ b/packages/schema/docs/build/schema.md @@ -1,7 +1,7 @@ # `zapier-platform-schema` Generated Documentation -This is automatically generated by the `npm run docs` command in `zapier-platform-schema` version `15.17.0`. +This is automatically generated by the `npm run docs` command in `zapier-platform-schema` version `15.18.0`. ----- @@ -76,7 +76,7 @@ Codifies high-level options for your integration. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AppFlagsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AppFlagsSchema.js) #### Properties @@ -106,7 +106,7 @@ Represents a full app. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AppSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AppSchema.js) #### Properties @@ -151,7 +151,7 @@ Config for Basic Authentication. No extra properties are required to setup Basic #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationBasicConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationBasicConfigSchema.js) #### Examples @@ -171,7 +171,7 @@ Config for custom authentication (like API keys). No extra properties are requir #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationCustomConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationCustomConfigSchema.js) #### Properties @@ -208,7 +208,7 @@ Config for Digest Authentication. No extra properties are required to setup Dige #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationDigestConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationDigestConfigSchema.js) #### Examples @@ -228,7 +228,7 @@ Config for OAuth1 authentication. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationOAuth1ConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationOAuth1ConfigSchema.js) #### Properties @@ -267,7 +267,7 @@ Config for OAuth2 authentication. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationOAuth2ConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationOAuth2ConfigSchema.js) #### Properties @@ -314,7 +314,7 @@ Represents authentication schemes. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationSchema.js) #### Properties @@ -355,7 +355,7 @@ Config for session authentication. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/AuthenticationSessionConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/AuthenticationSessionConfigSchema.js) #### Properties @@ -380,7 +380,7 @@ Represents the fundamental mechanics of a search/create. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicActionOperationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicActionOperationSchema.js) #### Properties @@ -413,7 +413,7 @@ Represents the fundamental mechanics of a create. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicCreateActionOperationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicCreateActionOperationSchema.js) #### Properties @@ -449,7 +449,7 @@ Represents user information for a trigger, search, or create. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicDisplaySchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicDisplaySchema.js) #### Properties @@ -487,7 +487,7 @@ Represents the inbound mechanics of hooks with optional subscribe/unsubscribe. D #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicHookOperationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicHookOperationSchema.js) #### Properties @@ -539,7 +539,7 @@ Represents the fundamental mechanics of triggers, searches, or creates. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicOperationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicOperationSchema.js) #### Properties @@ -570,7 +570,7 @@ Represents the fundamental mechanics of a trigger. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BasicPollingOperationSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BasicPollingOperationSchema.js) #### Properties @@ -602,7 +602,7 @@ Currently an **internal-only** feature. Zapier uses this configuration for creat #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BufferConfigSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BufferConfigSchema.js) #### Properties @@ -630,7 +630,7 @@ How will Zapier fetch resources from your application? #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BulkReadSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BulkReadSchema.js) #### Properties @@ -674,7 +674,7 @@ Enumerates the bulk reads your app exposes. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/BulkReadsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/BulkReadsSchema.js) #### Properties @@ -724,7 +724,7 @@ How will Zapier create a new object? #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/CreateSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/CreateSchema.js) #### Properties @@ -793,7 +793,7 @@ Enumerates the creates your app has available for users. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/CreatesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/CreatesSchema.js) #### Properties @@ -858,7 +858,7 @@ Like [/FieldsSchema](#fieldsschema) but you can provide functions to create dyna #### Details * **Type** - [/FieldOrFunctionSchema](#fieldorfunctionschema) -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/DynamicFieldsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/DynamicFieldsSchema.js) #### Examples @@ -883,7 +883,7 @@ An object describing a labeled choice in a static dropdown. Useful if the value #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FieldChoiceWithLabelSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FieldChoiceWithLabelSchema.js) #### Properties @@ -916,7 +916,7 @@ Yes | Yes | Array of [FieldChoiceWithLabel](#fieldchoicewithlabelschema) #### Details * **Type** - oneOf(`object`, `array`[oneOf(`string`, [/FieldChoiceWithLabelSchema](#fieldchoicewithlabelschema))]) -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FieldChoicesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FieldChoicesSchema.js) #### Examples @@ -938,7 +938,7 @@ Represents an array of fields or functions. #### Details * **Type** - `array`[oneOf([/FieldSchema](#fieldschema), [/FunctionSchema](#functionschema))] -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FieldOrFunctionSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FieldOrFunctionSchema.js) #### Examples @@ -973,7 +973,7 @@ Defines a field an app either needs as input, or gives as output. In addition to #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FieldSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FieldSchema.js) #### Properties @@ -1027,7 +1027,7 @@ An array or collection of fields. #### Details * **Type** - `array`[[/FieldSchema](#fieldschema)] -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FieldsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FieldsSchema.js) #### Examples @@ -1047,7 +1047,7 @@ An object whose values can only be primitives #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FlatObjectSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FlatObjectSchema.js) #### Properties @@ -1079,7 +1079,7 @@ A path to a file that might have content like `module.exports = (z, bundle) => [ #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FunctionRequireSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FunctionRequireSchema.js) #### Properties @@ -1105,7 +1105,7 @@ Internal pointer to a function from the original source or the source code itsel #### Details * **Type** - oneOf(`string`, [/FunctionRequireSchema](#functionrequireschema), [/FunctionSourceSchema](#functionsourceschema)) -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FunctionSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FunctionSchema.js) #### Examples @@ -1130,7 +1130,7 @@ Source code like `{source: "return 1 + 2"}` which the system will wrap in a func #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/FunctionSourceSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/FunctionSourceSchema.js) #### Properties @@ -1157,7 +1157,7 @@ A bank of named functions that you can use in `z.hydrate('someName')` to lazily #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/HydratorsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/HydratorsSchema.js) #### Properties @@ -1183,7 +1183,7 @@ A unique identifier for this item. * **Type** - `string` * **Pattern** - `^[a-zA-Z]+[a-zA-Z0-9_]*$` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/KeySchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/KeySchema.js) #### Examples @@ -1209,7 +1209,7 @@ A unique identifier for this item. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/LockObjectSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/LockObjectSchema.js) #### Properties @@ -1238,7 +1238,7 @@ List of before or after middlewares. Can be an array of functions or a single fu #### Details * **Type** - oneOf(`array`[[/FunctionSchema](#functionschema)], [/FunctionSchema](#functionschema)) -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/MiddlewaresSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/MiddlewaresSchema.js) #### Examples @@ -1259,7 +1259,7 @@ A representation of a HTTP redirect - you can use the `{{syntax}}` to inject aut #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/RedirectRequestSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/RedirectRequestSchema.js) #### Properties @@ -1287,7 +1287,7 @@ Reference a resource by key and the data it returns. In the format of: `{resourc * **Type** - `string` * **Pattern** - `^[a-zA-Z0-9_]+\.[a-zA-Z0-9_\s\[\]]+(\.[a-zA-Z0-9_\s\[\]]+(,[a-zA-Z0-9_\s\[\]]+)*)?$` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/RefResourceSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/RefResourceSchema.js) #### Examples @@ -1314,7 +1314,7 @@ A representation of a HTTP request - you can use the `{{syntax}}` to inject auth #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/RequestSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/RequestSchema.js) #### Properties @@ -1348,7 +1348,7 @@ How will we find create a specific object given inputs? Will be turned into a cr #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceMethodCreateSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceMethodCreateSchema.js) #### Properties @@ -1395,7 +1395,7 @@ How will we get a single object given a unique identifier/id? #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceMethodGetSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceMethodGetSchema.js) #### Properties @@ -1438,7 +1438,7 @@ How will we get notified of new objects? Will be turned into a trigger automatic #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceMethodHookSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceMethodHookSchema.js) #### Properties @@ -1485,7 +1485,7 @@ How will we get a list of new objects? Will be turned into a trigger automatical #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceMethodListSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceMethodListSchema.js) #### Properties @@ -1541,7 +1541,7 @@ How will we find a specific object given filters or search terms? Will be turned #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceMethodSearchSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceMethodSearchSchema.js) #### Properties @@ -1590,7 +1590,7 @@ Represents a resource, which will in turn power triggers, searches, or creates. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourceSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourceSchema.js) #### Properties @@ -1676,7 +1676,7 @@ All the resources that underlie common CRUD methods powering automatically handl #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResourcesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResourcesSchema.js) #### Properties @@ -1743,7 +1743,7 @@ An array of objects suitable for returning in perform calls. #### Details * **Type** - `array`[`object`] -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ResultsSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ResultsSchema.js) #### Examples @@ -1764,7 +1764,7 @@ Alias for /SearchOrCreatesSchema #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/SearchAndCreatesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/SearchAndCreatesSchema.js) #### Properties @@ -1831,7 +1831,7 @@ Pair an existing search and a create to enable "Find or Create" functionality in #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/SearchOrCreateSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/SearchOrCreateSchema.js) #### Properties @@ -1928,7 +1928,7 @@ Enumerates the search-or-creates your app has available for users. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/SearchOrCreatesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/SearchOrCreatesSchema.js) #### Properties @@ -1995,7 +1995,7 @@ How will Zapier search for existing objects? #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/SearchSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/SearchSchema.js) #### Properties @@ -2051,7 +2051,7 @@ Enumerates the searches your app has available for users. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/SearchesSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/SearchesSchema.js) #### Properties @@ -2103,7 +2103,7 @@ Zapier uses this configuration to apply throttling when the limit for the window #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ThrottleObjectSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ThrottleObjectSchema.js) #### Properties @@ -2159,7 +2159,7 @@ EXPERIMENTAL: Overrides the original throttle configuration based on a Zapier ac #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/ThrottleOverrideObjectSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/ThrottleOverrideObjectSchema.js) #### Properties @@ -2192,7 +2192,7 @@ How will Zapier get notified of new objects? #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/TriggerSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/TriggerSchema.js) #### Properties @@ -2247,7 +2247,7 @@ Enumerates the triggers your app has available for users. #### Details * **Type** - `object` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/TriggersSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/TriggersSchema.js) #### Properties @@ -2292,7 +2292,7 @@ Represents a simplified semver string, from `0.0.0` to `999.999.999`. * **Type** - `string` * **Pattern** - `^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$` -* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.17.0/packages/schema/lib/schemas/VersionSchema.js) +* [**Source Code**](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@15.18.0/packages/schema/lib/schemas/VersionSchema.js) #### Examples diff --git a/packages/schema/exported-schema.json b/packages/schema/exported-schema.json index c2cbe5853..40d152a87 100644 --- a/packages/schema/exported-schema.json +++ b/packages/schema/exported-schema.json @@ -1,5 +1,5 @@ { - "version": "15.17.0", + "version": "15.18.0", "schemas": { "AppSchema": { "id": "/AppSchema", diff --git a/packages/schema/package.json b/packages/schema/package.json index ddebea5de..99ff46126 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "zapier-platform-schema", - "version": "15.17.0", + "version": "15.18.0", "description": "Schema definition for CLI apps in the Zapier Developer Platform.", "repository": "zapier/zapier-platform", "homepage": "https://platform.zapier.com/",